Table of Contents
读的比较粗, 部分笔记:
扩展与收缩(rehash) 下面条件满足时:
因为在bgsave或bgrewriteaof的时候, 有子进程存在, redis会尽量避免进行rehash, 从而避免不必要的内存写入, 节约内存 - 这个分析很赞.
每次操作一个桶.
几种编码:
REDIS_ENCODING_RAW 0 // 编码为字符串 REDIS_ENCODING_INT 1 // 编码为整数 REDIS_ENCODING_HT 2 // 编码为哈希表 REDIS_ENCODING_ZIPMAP 3 // 编码为 zipmap REDIS_ENCODING_LINKEDLIST 4 // 编码为双端链表 REDIS_ENCODING_ZIPLIST 5 // 编码为压缩列表 REDIS_ENCODING_INTSET 6 // 编码为整数集合 REDIS_ENCODING_SKIPLIST 7 // 编码为跳跃表
不同类型可能的编码:
string REDIS_ENCODING_INT string REDIS_ENCODING_EMBSTR string REDIS_ENCODING_RAW list REDIS_ENCODING_ZIPLIST list REDIS_ENCODING_LINKEDLIST hash REDIS_ENCODING_INTSET hash REDIS_ENCODING_HT set REDIS_ENCODING_INTSET set REDIS_ENCODING_HT zset REDIS_ENCODING_ZIPLIST zset REDIS_ENCODING_SKIPLIST
object 命令:
object encoding numberso
expire 保存在一个单独的dict里面:
----------------------------------------------------------------------- +------+ ---------> |dict | | +======+ | |a | -> string val | +------+ +---------+ | |b | -> string val |redisDB | | +------+ +=========+ | |c | -> string val |dict | -- +------+ +---------+ |expires | -- +------+ +---------+ |--------> |dict | +======+ |a | -> longlong 1411987363000 +------+ |b | -> longlong 1411987363000 +------+
p113 主从在复制问题上可能出现不一致:
从库只会从主同步 del命令.
p229讲的很细致, 不过还是太复杂.
INFO: 发现slave publish: 发现其它sentinel
p244, sentinel选举是 raft 算法 (得看下论文)
如果执行lua超时阻塞, 那么redis 只会接受 shutdown nosave / script kill 命令
有的地方比较罗嗦, 比如一个set操作完了之后内存是怎么样的, 不过换句话说, 就是细致.
关于淘汰: redis 记录访问时间, 从而可以做近似lru