数据结构篇(v3.x)
顶层结构(redisObject)
- Type
- Encoding
- lru/lfu计时bits
- Refcount引用计数(用于内存共享)
当对象为整数且范围在[0-9999]时,Redis可以使用共享对象的方式来节省内存。
- 指针ptr(可以放整数,也可以放指针)
String (encoding为int,raw,embstr)
list (encoding为ziplist, quicklist)
set (encoding为intset, hashtable)
hash (encoding为ziplist, hashtable)
zset (encoding为ziplist, skiplist)
Bitmaps (string)
位图: 动态长度
在初始化时如果偏移量很大,那么要一直补0,可能会阻塞主线程。
Hyperloglog (string)
基数算法
内存占用极小,但误差率为0.81%
GEO (Zset)
地理位置集合,一个集合多个成员(经度,纬度,名字)
实现原理:通过geohash编码,将二维经纬度转换为一维字符串。
- 字符串越长,表示的位置越精确。
- 字符串前缀匹配算法,实现比较两个地点的距离
关于Ziplist的新姿势
如果Redis实例为了追求低内存使用量,过度放宽ziplist使用条件
(修改了hash-max-ziplist-entries和hash-max-ziplist-value配置),会导致hset这种O(1)的命令的耗时达到原来的几十倍。
迁移篇
dump+restore
模型为:源redis+client.a,目标redis+client.b
迁移流程为:
- client.a执行dump key命令,将value持久化为rdb,此时client持有这个rdb
- client.b执行restore key ttl rdb命令,将rdb文件代表的value设置到目标redis的key中
缺点:
- 非原子,人工操作,类似于复制粘贴