关注
Q1:
知道Redis的字典吧,问你个问题,字典的底层数据结构知道怎么实现的吗?Java的HashMap不是采用的是数组加链表加红黑树,为什么这里的哈希表解决键冲突的时候用的是拉链法,而没有用到红黑树呢?
A:
字典的底层数据结构就是哈希表,而且使用的是两个哈希表,第一个哈希表用于存放数据,第二个哈希表用户扩容(Rehash),字典的结构是`type`、`ht`、`rehashIndex` 、`privatedata`
而关于HashMap中的键冲突问题,首先是采用拉链法,在java 1.8中,如果链表的长度超过了8,那么链表将转换为红黑树。(桶的数量必须大于64,小于64的时候只会扩容)发生hash碰撞时,java 1.7 会在链表的头部插入,而java 1.8会在链表的尾部插入。而且可以看到转换红黑树的时机是超过一定大小才会去转换,因为红黑树是一种自平衡二叉搜索树,它可以保证在**最坏情况**下,查找、插入和删除操作的时间复杂度为O(log n)。也就是说在规模不断增加的情况下,红黑树是比较不错的选择,但是如果规模比较小的话,就没必要采取红黑树了。
另外,Redis的哈希表会让键值对处于一个合理的区间(执行BGSAVE指令时,哈希表的负载因子大于等于1,未执行BGSAVE时,负载因子大于等于5执行扩展;哈希表的负载因子小于0.1自动执行收缩===》**执行BGSAVE命令时,Redis需要创建当前进程的子进程(写时复制优化子进程的使用效率),因此提高扩展所需要的负载因子,尽可能避免执行扩展,最大限度节约内存**),因此会自动进行Rehash去扩展与收缩,**查询性能消耗并不大,因此采取红黑树反而增加了性能耗费**。因此,并没有采用红黑树来实现哈希表的冲突扩展。
查看原帖
点赞 评论
相关推荐
牛客热帖
更多
- 1... 27双非ue游戏客户端大失败经历5915
- 2... 作为一个老登,最烦应届生问的问题之一5309
- 3... 逆天老师,逆天领导,被我回怼一句话后破防了,要把我开除了4761
- 4... 各位都是怎么出去实习的4650
- 5... 理性讨论,卷实习算不算工贼行为?4267
- 6... 三段大厂,说下我见过的最低学历2992
- 7... 双非想拿腾讯offer,会被卡学历吗?2964
- 8... 26博士求职竟然也难2756
- 9... 【5.21更新】26春招毁约毁意向裁员黑名单公司,为找工作尽一份绵薄之力!2493
- 10... 5.18字节(中国广告与交易)75分钟2293
正在热议
更多
# 如何成为1个AI工程师? #
6666次浏览 313人参与
# 秋招拿一个offer可以躺平吗 #
277716次浏览 1412人参与
# 26届春招投递记录 #
40792次浏览 352人参与
# 一人分享一个skill #
34753次浏览 317人参与
# 27届实习投递记录 #
127820次浏览 1438人参与
# 机械人求职现状 #
44042次浏览 329人参与
# 你觉得第一学历对求职有影响吗? #
276783次浏览 1495人参与
# 我在大厂见过的最低学历 #
6403次浏览 69人参与
# 产品2023笔面经 #
89234次浏览 472人参与
# 第一次找实习,我建议__ #
87484次浏览 875人参与
# 秋招白月光 #
819379次浏览 5695人参与
# 虹软科技求职进展汇总 #
18514次浏览 141人参与
# 想给25届机械人的秋招建议 #
54322次浏览 264人参与
# 上班苦还是上学苦呢? #
350635次浏览 2088人参与
# 给26届的秋招建议 #
391195次浏览 4407人参与
# 要毕业了,再不说就来不及了 #
11477次浏览 172人参与
# HR面都在聊什么? #
48610次浏览 333人参与
# 机械人你觉得今年行情怎么样? #
9840次浏览 100人参与
# 找工作中的意难平 #
1106224次浏览 6532人参与
# 运营来爆料 #
105996次浏览 519人参与


美团工作强度 2569人发布