Redis数据结构
2019-10-17 11:27:03 0 举报
AI智能生成
redis数据结构总结
作者其他创作
大纲/内容
常用命令
查看编码
object encoding xxx
参考地址
https://www.cnblogs.com/hunternet/p/9989771.html
https://database.51cto.com/art/201906/598234.htm
https://www.cnblogs.com/jaycekon/p/6227442.html
https://www.cnblogs.com/jaycekon/p/6277653.html
https://juejin.im/post/5b53ee7e5188251aaa2d2e16
http://remcarpediem.net/article/fa5c04fa/
http://www.baowenwei.com/post/fen-bu-shi/redisshe-ji-yuan-li-zhi-di-ceng-shu-ju-jie-gou
http://blog.loading.ink/2018/11/14/%E5%9B%BE%E8%A7%A3Redis%E4%B9%8B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%AF%87%E2%80%94%E2%80%94%E7%AE%80%E5%8D%95%E5%8A%A8%E6%80%81%E5%AD%97%E7%AC%A6%E4%B8%B2SDS/
https://zhuanlan.zhihu.com/p/64772193
https://blog.csdn.net/caishenfans/article/details/44784131
Redis对象
RedisObject
REDIS_STRING:String对象
底层对象
可以转换为long:int
raw
字符串对象的长度小于39字节:embstr
场景
列表对象:REDIS_LIST
使用场景
https://www.cnblogs.com/pangzizhe/p/10674501.html
底层对象
linkedlist
ziplist
列表对象保存的所有字符串元素的长度都小于64字节; (list-max-ziplist-value)
列表对象元素的数量小于512;(list-max-ziplist-entries)
高版本
quicklist
哈希对象:REDIS_HASH
底层对象
ziplist
当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)
所有值都小于hash-max-ziplist-value配置(默认64字节)
hashtable
场景
集合对象:REDIS_SET
底层对象
intset
hashtable
intset 保存的整数值个数超过
server.set_max_intset_entries (默认值为 512 )
server.set_max_intset_entries (默认值为 512 )
试图往集合里添加一个新元素,并且这个元素不能被表示为 long long 类型
场景
子主题
参考
https://blog.csdn.net/men_wen/article/details/70941408
有序集合对象:REDIS_ZSET
底层对象
ziplist
元素数量小于128个 (zset-max-ziplist-entries)
所有member的长度都小于64字节(zset-max-ziplist-value)
skiplist与dict的结合
场景
参考
底层对象
REDIS_ENCODING_INT:long 类型的整数
REDIS_ENCODING_EMBSTR:embstr 编码的简单动态字符串
REDIS_ENCODING_RAW:简单动态字符串
REDIS_ENCODING_HT:字典
REDIS_ENCODING_LINKEDLIST:双端链表
REDIS_ENCODING_ZIPLIST:压缩列表
REDIS_ENCODING_INTSET:整数集合
REDIS_ENCODING_SKIPLIST:跳跃表和字典
链表
子主题
list
概述
基础数据类型
String(Simple Dynamic String)
结构
3.0
3.2以后
命令
参考
http://www.pianshen.com/article/2982345910/
https://xilidou.com/2018/03/12/redis-data/
https://blog.csdn.net/u013679744/article/details/79195563
优势
获取字符串长度(SDS O(1))
杜绝缓冲区溢出
减少修改字符串长度时造成的内存再次分配。
预分配
惰性释放
二进制安全。
兼容C语言
源码
sds
链表:linked-list
特点
它是有序的
能够存储2的32次方减一个节点(超过 40 亿个节点)
Redis 链表是双向的,因此即可以从左到右,也可以从右到左遍历它存储的节点
链表结构查找性能不佳,但 插入和删除速度很快
结构
源码
adlist
参考
https://xilidou.com/2018/03/12/redis-data/
https://blog.csdn.net/yangshangwei/article/details/82792672
压缩列表:ziplist
特点
连续,无序的数据结构
结构
图示
注释
ziplist
zlbytes
zltail
zllen
entry
zlend
entry prevrawlen:表示前一个数据项占用的总字节数
前一个数据项占用字节数小于254
如果前一个数据项占用字节数大于等于254
len
data
源码
ziplist
参考
https://zhuanlan.zhihu.com/p/68667360
https://segmentfault.com/a/1190000017328042
https://throwsnew.com/2017/09/12/%E4%B8%BA%E4%BB%80%E4%B9%88Redis%E4%BD%BF%E7%94%A8ziplist%E8%83%BD%E8%8A%82%E7%9C%81%E5%86%85%E5%AD%98/
http://zhangtielei.com/posts/blog-redis-ziplist.html
https://www.jianshu.com/p/37c49b4e3bd0
https://cloud.tencent.com/developer/article/1483214
http://www.baowenwei.com/post/fen-bu-shi/redisshe-ji-yuan-li-zhi-wu-chong-dui-xiang-er#toc_7
https://www.jianshu.com/p/41e39eed1578
实例
方法
redis命令
快速列表:quicklist
参考
https://www.jianshu.com/p/542ee9514dfd
https://www.cnblogs.com/virgosnail/p/9542470.html
https://blog.csdn.net/zhaoliang831214/article/details/82054476
https://matt.sh/redis-quicklist
特点
结构
压缩深度
zipList 长度
源码
优劣
hash表:hashtable
特点
参考
http://blog.loading.ink/2018/11/20/%E5%9B%BE%E8%A7%A3Redis%E4%B9%8B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%AF%87%E2%80%94%E2%80%94%E5%AD%97%E5%85%B8/
https://www.cnblogs.com/jaycekon/p/6227442.html
子主题
源码
结构
dict
type
privdata
ht[2]
trehashidx
dictht
table
size
sizemask
used
子主题
优劣
场景
命令
理论
hash冲突解决方案
开放寻址法
链表法
负载因子与rehash
负载因子
rehash
rehash
条件
服务器目前没有执行BGSAVE(rdb持久化)命令或者BGREWRITEAOF(AOF文件重写)命令,并且散列表的负载因子大于等于1。
服务器目前正在执行BGSAVE命令或者BGREWRITEAOF命令,并且负载因子大于等于5。
当负载因子小于0.1时,程序自动开始执行收缩操作。
过程
1.为字典的ht[1]散列表分配空间
2.将保存在ht[0]中的键值对重新计算键的散列值和索引值,然后放到ht[1]指定的位置上。
3.将ht[0]包含的所有键值对都迁移到了ht[1]之后,释放ht[0],将ht[1]设置为ht[0],并创建一个新的ht[1]哈希表为下一次rehash做准备。
渐进式hash
1.因为在进行渐进式 rehash 的过程中,字典会同时使用 ht[0] 和 ht[1] 两个哈希表,所以在渐进式 rehash 进行期间,字典的删除(delete)、查找(find)、更新(update)等操作会在两个哈希表上进行。
2.在渐进式 rehash 执行期间,新添加到字典的键值对一律会被保存到 ht[1] 里面,而 ht[0] 则不再进行任何添加操作:这一措施保证了 ht[0] 包含的键值对数量会只减不增,并随着 rehash 操作的执行而最终变成空表。
子主题
子主题
整数集合:intset
特点
有序,且不能重复
参考
http://zhangtielei.com/posts/blog-redis-intset.html
结构
encoding
INTSET_ENC_INT16
INTSET_ENC_INT32
INTSET_ENC_INT64
length
contents
图示
场景
源码
跳跃表
结构
子主题
子主题
源码
参考
https://www.jianshu.com/p/ac351674d8eb?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
https://www.jianshu.com/p/d12389b80a19
https://blog.csdn.net/idwtwt/article/details/80233859
子主题
理论
参考
https://www.jianshu.com/p/ac351674d8eb?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
什么是跳跃表
参考
https://www.cnblogs.com/jaycekon/p/6227442.html
问题
key 如何存储
什么类型
https://zhuanlan.zhihu.com/p/68667360
value 如何存储
key value如何关联
太大了怎么办
太多了怎么办
0 条评论
下一页