Permalink: 2014-09-29 17:39:16 by ning in redis tags: all

读的比较粗, 部分笔记:

1   c4 hash

1.1   rehash

扩展与收缩(rehash) 下面条件满足时:

  1. 没有在进行bgsave或bgrewriteaof, 并且hash表的负载因子大于1
  2. 在进行bgsave或bgrewriteaof, 并且hash表的负载因子大于5

因为在bgsave或bgrewriteaof的时候, 有子进程存在, redis会尽量避免进行rehash, 从而避免不必要的内存写入, 节约内存 - 这个分析很赞.

1.2   渐进式

每次操作一个桶.

2   c5 跳表(skiplist)

sorted set 的实现:

方法1: skip list
方法2: skiplist + hash

3   c8 object(类型和编码)

几种编码:

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

4   c9 数据库

expire 保存在一个单独的dict里面:

-----------------------------------------------------------------------

                        +------+
             ---------> |dict  |
             |          +======+
             |          |a     |  -> string val
             |          +------+
+---------+  |          |b     |  -> string val
|redisDB  |  |          +------+
+=========+  |          |c     |  -> string val
|dict     | --          +------+
+---------+
|expires  | --          +------+
+---------+  |--------> |dict  |
                        +======+
                        |a     |  -> longlong 1411987363000
                        +------+
                        |b     |  -> longlong 1411987363000
                        +------+

p113 主从在复制问题上可能出现不一致:

  • 从上不会主动淘汰key,
    • 不会在cron上尝试删除key
    • 就算访问到一个已经过期的key, 也不会删除, 而是返回它
  • 从库只会从主同步 del命令.

5   c16 sentinel

p229讲的很细致, 不过还是太复杂.

INFO: 发现slave publish: 发现其它sentinel

p244, sentinel选举是 raft 算法 (得看下论文)

6   事物

  • watch 其实是一种cas概念(总算懂了)
  • redis事物满足ACID

7   lua

  • 对于有些lua中执行的命令, 会对输出做一个排序:
    • 比如 smember, keys等, 为了保证每次在lua中调用顺序一致.
  • 如果执行lua超时阻塞, 那么redis 只会接受 shutdown nosave / script kill 命令

8   小结

  • 有的地方比较罗嗦, 比如一个set操作完了之后内存是怎么样的, 不过换句话说, 就是细致.

  • 很多之前不知道的知识点(不过确实很少用到)
    • 比如: info/shutdown/publish 这几个命令可以在loading 状态下调用.
    • p187, qps的计算: 16个取样, 取平均值.
  • 关于淘汰: redis 记录访问时间, 从而可以做近似lru

  • v1 链接: https://github.com/huangz1990/redisbook/

Comments