分类 redis 下的文章

压缩列表ziplist是列表、哈希和有序集合的底层实现,当数据量比较小时会使用ziplist。
数据类型与数据结构对应关系.png

  1. 列表类型ziplist条件:

    • 列表对象保存的所有字符串元素都小于64字节;
    • 列表对象保存的元素个数小于512个。
      在配置文件中 list-max-ziplsit-entries和list-max-ziplist-value。
  2. 哈希类型ziplist条件:

    • 哈希对象保存的所有字符串元素都小于64字节;
    • 哈希对象保存的元素个数小于512个。
      在配置文件中hash-max-ziplsit-entries和hash-max-ziplist-value。
  3. 有序集合ziplist条件:

    • 有序集合保存的元素小于128个
    • 所有元素长度小于64字节
      在配置文件中zset-max-ziplsit-entries和zset-max-ziplist-value。




- 阅读剩余部分 -

zset对象的结构可以是ziplist或skiplist

当同时满足以下两个条件时使用ziplist:

  1. 有序集合保存的元素小于128个
  2. 所有元素长度小于64字节
    注,以上条件上限值可修改。在配置文件中zset-max-ziplsit-entries和zset-max-ziplist-value。

当ziplist作为zset的底层存储结构时候,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个元素保存元素的分值。集合元素按分值从小到大排序,小的在表头,大的在表尾。

zadd price 8.5 apple 8.1 banana

键price的值对象使用的是ziplist,对象如图所示。
ziplist编码的有序集合对象.png

对象使用的压缩列表如图所示:
有序集合压缩列表中从小到大排序.png

当skiplist作为zset的底层存储结构的时候,使用skiplist按序保存元素及分值,使用dict来保存元素和分值的映射关系。




- 阅读剩余部分 -

sds定义

sds.h/sdshdr 结构定义了sds的结构:

struct sdshdr {
//记录buf数组使用字节数量,即字符串长度
int len;

//记录buf数组未使用字节数量
int free;

//字节数组,保存字符串
char buf[];

len: 字符串长度

- 阅读剩余部分 -

哨兵系统会监控主从服务器,当检测到下线时长超过用户设定时长上限时,会进行故障转移操作:

  • 选择一个从服务器作为主服务器
  • 然后对其他所有从服务器发送新的复制指令,让它们成为新的主服务器的从服务器,当所有从服务器都开始复制新的主服务器时,故障转移操作完毕
  • 另外,哨兵还会继续监视已下线的服务器,并在它重新上线时,将它设置为新的主服务器的从服务器。

- 阅读剩余部分 -

2.8版本前后复制原理有所不同,2.8之前称为旧版,2.8后称为新版。

旧版复制实现原理

redis的复制操作分为同步(sync)和命令传播(command propagate) 两个操作:

  • 同步操作用于将从服务器状态更新为主服务器当前所处的服务器状态
  • 命令传播操作则用于当主服务器状态被修改,导致主从状态不一致时,让主从状态恢复到一致状态。

- 阅读剩余部分 -

redis服务器serverCron函数每100毫秒执行一次,负责管理服务器资源,保持服务器良好运行。

更新服务器时间缓存

服务器有很多功能需要获取系统当前时间,每次获取时间需要执行一次系统调用,为了减少系统调用执行次数,服务器状态中的unixtime(秒)属性和mstime(毫秒)属性被用来当前时间缓存:
因为100毫秒执行一次,所以这两个时间精度不高,对时间精度要求不高的用这个,要求高的还是执行系统调用。

  • 打印日志、更新LRU时钟、决定是否执行持久化任务、计算服务器上线时间用该属性
  • 为键设置过期时间、添加慢查询日志,会执行系统调用

- 阅读剩余部分 -

参考redis官方文档redis.io

过期键删除策略

1 惰性删除策略
所有读写数据库的Redis命令在执行之前都会先检查输入键是否已过期,过期则删除之。
CPU友好,内存不友好
2 定期删除策略
每当 Redis 的服务器周期性操作函数 serverCron 执行时,就会调用定期删除过期键的函数,(serverCron默认100毫秒执行一次)在规定时间内,分多次遍历服务器中的各个数据库,从数据库的过期字典中随机检查一部分键的过期时间,并删除其中的过期键。
通过全局变量记录当前处理的数据库,直到所有数据库的过期键都被删除。






- 阅读剩余部分 -