redis学习笔记(2) | 青训营

71 阅读1分钟

数据结构篇(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

迁移流程为:

  1. client.a执行dump key命令,将value持久化为rdb,此时client持有这个rdb
  2. client.b执行restore key ttl rdb命令,将rdb文件代表的value设置到目标redis的key中

缺点:

  1. 非原子,人工操作,类似于复制粘贴