(17)Redis的rehash与ConcurrentHashMap对⽐
hashtable(dictht)扩容是重要部分。dict是Redis的hash数据结构,⽤key值计算hashkey,元素插⼊到某个hash链上(拉链法解冲突)。hashtable(dictht)
2)dict中的ht[1]是扩容临时数据,3)
3)扩
是否扩容hashtable。2)
serverCron依据算法(dict中used与size⽐值)判定是否扩容
1)
1)Redis“管家”函数serverCron
4)对
hashkey不同。4)hashtable变长,hashtable的sizemask(哈希表⼤⼩掩码,计算索引值,总是等于size-1)与原来不同,计算出hashkey不同
容后,hashtable变长
ht[0]中元素重新计算hashkey。
耗⼒重新计算hashkey
hashkey。如果⼀次性完成⼀个dict的Rehash,将对其他任务造成延
ps:在Rehash阶段,ht[0]元素rehash到ht[1]中,耗⼒
迟?
⼀、redis单线程渐进式rehash
只有⼀个线程在扩容(⾜够运⾏时间,不会饿死),扩容时其他线程可并发读写。过程:
过程:
1、ht[0],存数据table,⾮扩容
⾮扩容容器。
1、ht[0],
扩容时才⽤,ht[0]的两倍。
ht[0]的两倍。
ht[1],存数据table,扩容时
ht[1],
先去ht[0],不到去ht[1]。 2)写:直接写在
直接写在2、扩容时(锁来保证同步性):单线程A从ht[0] copy到ht[1] 。其他线程:1)
2、扩容
其他线程:1)读/删:先去ht[0],不到去ht[1]。 2)
ht[1]中。
ht[1]中
⼆、ConcurrentHashMap多线程协同式rehash
扩容过程:
redis支持的数据结构从旧搬新,扩容过程:
多个线程
多个线程并发把数据从旧搬新
A扩容从oldTable到newTable,其他线程
get:直接取
get:直接取,知道存放在oldTable或newTable中
帮着扩容,扩容完成后才进⾏put操作。
桶位,已到newTable。帮着扩容,扩容完成后才进⾏put操作
写/删:
写/删:如写的桶位,已到
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论