获得徽章 0
赞了这篇文章
#青训营 x 字节后端训练营#
由于哈希算法被计算的数据是无限的,而计算后的结果范围有限,因此总会存在不同的数据经过计算后得到的值相同,这就是哈希冲突。
哈希冲突解决方法:开放地址法、链地址法(拉链法)、再哈希法、建立公共溢出区;
1、线性探查法,平方探查法,伪随机探查法、双散列函数探查法
2、将哈希值相同的元素构成一个同义词的单向链表,并将单向链表的头指针存放在哈希表的第 i 个单元中,查找、插入和删除主要在同义词链表中进行。
3、使用多个哈希函数,一个冲突后,使用其他hash,这种方法不易产生聚集,但是增加了计算时间
4、将哈希表分为公共表和溢出表,当溢出发生时,将所有溢出数据统一放到溢出区。
由于哈希算法被计算的数据是无限的,而计算后的结果范围有限,因此总会存在不同的数据经过计算后得到的值相同,这就是哈希冲突。
哈希冲突解决方法:开放地址法、链地址法(拉链法)、再哈希法、建立公共溢出区;
1、线性探查法,平方探查法,伪随机探查法、双散列函数探查法
2、将哈希值相同的元素构成一个同义词的单向链表,并将单向链表的头指针存放在哈希表的第 i 个单元中,查找、插入和删除主要在同义词链表中进行。
3、使用多个哈希函数,一个冲突后,使用其他hash,这种方法不易产生聚集,但是增加了计算时间
4、将哈希表分为公共表和溢出表,当溢出发生时,将所有溢出数据统一放到溢出区。
展开
评论
点赞
#青训营 x 字节后端训练营# Git
tree .git :目录结构
--bare 创建一个裸仓库
--templae 可以通过创建模板来创建预先构建好的自定义git目录
--initial-branch 初始化的分支
用户名配置:
git config --global user.name “”
git config --global user.email “”
instead of配置:
git config --global url.git@ ..insteadOf ..
git命令别名配置:
git config --global alias.(命令别名) “命令”
remote:
查看:git remote -v
添加:git remote add
提交:
git commit :提交相关
git add 文件名
git status 查看当前文件夹提交信息
git log :日志
查看:
git cat-file -p 文件id
新建分支:
git cheakout -b 分支名字
res相当于一个指针,指向commit
git tag 创建标签:tag表示稳定版本
git tag -a "":附注标签,加了一些信息
如:git tag -a v0.0.3 -m “add 1”
-m选项表示附注的信息
设置过期时间:
git gc :垃圾回收,删掉不需要的东西
多人合作:
git clone:克隆到本地,可以指定分支,深度
fetch:将某些分支最新代码拉取到本地,不会执行merge(合并)操作,会修改refs/remote内的分支信息,如果需要和本地代码合并,需要手动操作
pull:拉取远端分支,并进行合并,操作相当于git fech+git merge ;也可通过git pull --rebase完成git fetch+git rebase操作,可能存在冲突,需要解决冲突
git push :同步至远端
常见问题:配置了git,但无法拉取代码:
1、ssh没配置
2、instead of没配置,还是使用http访问
fetch了,但本地记录未改变:
fetch是把代码拉取到远端分支,不会合并到本地
tree .git :目录结构
--bare 创建一个裸仓库
--templae 可以通过创建模板来创建预先构建好的自定义git目录
--initial-branch 初始化的分支
用户名配置:
git config --global user.name “”
git config --global user.email “”
instead of配置:
git config --global url.git@ ..insteadOf ..
git命令别名配置:
git config --global alias.(命令别名) “命令”
remote:
查看:git remote -v
添加:git remote add
提交:
git commit :提交相关
git add 文件名
git status 查看当前文件夹提交信息
git log :日志
查看:
git cat-file -p 文件id
新建分支:
git cheakout -b 分支名字
res相当于一个指针,指向commit
git tag 创建标签:tag表示稳定版本
git tag -a "":附注标签,加了一些信息
如:git tag -a v0.0.3 -m “add 1”
-m选项表示附注的信息
设置过期时间:
git gc :垃圾回收,删掉不需要的东西
多人合作:
git clone:克隆到本地,可以指定分支,深度
fetch:将某些分支最新代码拉取到本地,不会执行merge(合并)操作,会修改refs/remote内的分支信息,如果需要和本地代码合并,需要手动操作
pull:拉取远端分支,并进行合并,操作相当于git fech+git merge ;也可通过git pull --rebase完成git fetch+git rebase操作,可能存在冲突,需要解决冲突
git push :同步至远端
常见问题:配置了git,但无法拉取代码:
1、ssh没配置
2、instead of没配置,还是使用http访问
fetch了,但本地记录未改变:
fetch是把代码拉取到远端分支,不会合并到本地
展开
评论
点赞
#青训营 x 字节后端训练营# 缓存穿透
是指查询一个缓存中和数据库中都不存在的数据,导致每次查询这条数据都会透过缓存,直接查库,最后返回空。当用户使用这条不存在的数据疯狂发起查询请求的时候,对数据库造成的压力就非常大,甚至可能直接挂掉
解决方法:第一种是缓存空对象,第二种是使用布隆过滤器。
缓存空对象:当数据库中查不到数据的时候,我缓存一个空对象,然后给这个空对象的缓存设置一个过期时间,这样下次再查询该数据的时候,就可以直接从缓存中拿到,从而达到了减小数据库压力的目的。但这种解决方式有两个缺点:(1)需要缓存层提供更多的内存空间来缓存这些空对象,当这种空对象很多的时候,就会浪费更多的内存;(2)会导致缓存层和存储层的数据不一致,即使在缓存空对象时给它设置了一个很短的过期时间,那也会导致这一段时间内的数据不一致问题。
二、布隆过滤器:
由m长度的位数组和n个hash函数组成的数据结构;
开始时,所有元素的值都为0;初始化时,对每个key进行hash运算,将相应位置的元素改为1。查询数据时,对数据进行hash位置,判断相应位置的key,都为1则代表数据在库中存在,则继续向下查询,为0则表示不存在,返回客户端0就行。
优缺点:可以解决缓存控制不足的问题
但是可能会误判,key都为1,数据可能在库中也不存在。还有删除key值比较困难,会影响其他key的判断
是指查询一个缓存中和数据库中都不存在的数据,导致每次查询这条数据都会透过缓存,直接查库,最后返回空。当用户使用这条不存在的数据疯狂发起查询请求的时候,对数据库造成的压力就非常大,甚至可能直接挂掉
解决方法:第一种是缓存空对象,第二种是使用布隆过滤器。
缓存空对象:当数据库中查不到数据的时候,我缓存一个空对象,然后给这个空对象的缓存设置一个过期时间,这样下次再查询该数据的时候,就可以直接从缓存中拿到,从而达到了减小数据库压力的目的。但这种解决方式有两个缺点:(1)需要缓存层提供更多的内存空间来缓存这些空对象,当这种空对象很多的时候,就会浪费更多的内存;(2)会导致缓存层和存储层的数据不一致,即使在缓存空对象时给它设置了一个很短的过期时间,那也会导致这一段时间内的数据不一致问题。
二、布隆过滤器:
由m长度的位数组和n个hash函数组成的数据结构;
开始时,所有元素的值都为0;初始化时,对每个key进行hash运算,将相应位置的元素改为1。查询数据时,对数据进行hash位置,判断相应位置的key,都为1则代表数据在库中存在,则继续向下查询,为0则表示不存在,返回客户端0就行。
优缺点:可以解决缓存控制不足的问题
但是可能会误判,key都为1,数据可能在库中也不存在。还有删除key值比较困难,会影响其他key的判断
展开
评论
点赞
#青训营 x 字节后端训练营# 原子操作就是并发编程中“最小的且不可并行化”的操作。通常,如果多个并发体对同一个共享资源进行的操作是原子的话,那么同一时刻最多只能有一个并发体对该资源进行操作;从线程角度看,在当前线程修改共享资源期间,其它的线程是不能访问该资源的。原子操作对于多线程并发编程模型来说,不会发生有别于单线程的意外情况,共享资源的完整性可以得到保证。
atomic.AddUint64 函数调用保证了 total 的读取、更新和保存是一个原子操作,因此在多线程中访问也是安全的。
原子操作配合互斥锁可以实现非常高效的单件模式。互斥锁的代价比普通整数的原子读写高很多,在性能敏感的地方可以增加一个数字型的标志位,通过原子检测标志位状态降低互斥锁的使用次数来提高性能。
atomic.AddUint64 函数调用保证了 total 的读取、更新和保存是一个原子操作,因此在多线程中访问也是安全的。
原子操作配合互斥锁可以实现非常高效的单件模式。互斥锁的代价比普通整数的原子读写高很多,在性能敏感的地方可以增加一个数字型的标志位,通过原子检测标志位状态降低互斥锁的使用次数来提高性能。
展开
评论
点赞
#青训营 x 字节后端训练营# HTML4和HTML5的区别:HTML5是应用超文本标记语言(HTML)的第五次修改,HTML4是应用超文本标记语言(HTML)的第四次修改;
1、取消了一些过时的 HTML4的标签:
2、添加了一些新的元素;比如:更加智能的表单标签:date, email, url 等;更加合理的标签:section, video, progress, nav, meter, time, aside, canvas等。
3、新的全局属性:contentEditable designMode hidden spellcheck tabindex
4、标记方法: 文件类型声明(<!DOCTYPE>)仅有一型:<!DOCTYPE HTML>。
指定字符编码 <meta charset="UTF-8">
5、新的JS API
6、保证了兼容性
1、取消了一些过时的 HTML4的标签:
2、添加了一些新的元素;比如:更加智能的表单标签:date, email, url 等;更加合理的标签:section, video, progress, nav, meter, time, aside, canvas等。
3、新的全局属性:contentEditable designMode hidden spellcheck tabindex
4、标记方法: 文件类型声明(<!DOCTYPE>)仅有一型:<!DOCTYPE HTML>。
指定字符编码 <meta charset="UTF-8">
5、新的JS API
6、保证了兼容性
展开
评论
点赞