最近在读黄健宏的《Redis设计与实现》一书,记录部分知识点,以便以后查阅。
第一部分 数据结构
1. redis基本数据类型:string, list, hash, set, zset;
2. string 底层实现为 sds (simple dynamic string), 对比C的字符串优点为:
A. O(1)复杂度获取字符串长度(结构体内记录了长度);
B. 杜绝缓冲区溢出;
C. 减少修改字符串时需要的内存重分配次数(通过预留空间实现);
D. 二进制安全(不是以\0作为结束符,而是以长度);
E. 兼容部分C字符串函数(个人认为不是相对C字符串的优点)。
3. 字典
A. 底层实现为哈希表,采用连地址法解决键冲突(通过哈希表节点(dictEntry)的next指针);
B. 使用MurmurHash2算法计算键的哈希值,即使输入的键是有规律的,算分仍能给出一个很好的随机分布性,并且速度很快;
C. rehash, 渐进式rehash
第二部分 数据库
1. 过期数据删除策略:
A.. 定时删除---对内存友好,对CPU不友好;
B. 惰性删除---对CPU友好,对内存不友好;
C. 定期删除--- A、B的综合
redis实际使用 B、C综合
2. 过期数据对RDB和AOF的影响
如果服务器以主服务器模式运行,载入RDB文件时会忽略过期数据,如果以从服务器模式运行,则不会忽略过期数据,但主从服务器做数据同步时,则会清除从服务器上的过期数据。
当服务器以AOF持久化模式运行时,过期数据被删除后,才会向AOF文件追加一条DEL命令。
AOF文件载入时,过期数据不会保存到重写的AOF文件;
3. 当服务器运行在复制模式时,从服务器的过期键删除由主服务器控制--当主服务器删除一个过期键后,会向所有从服务器发送一条DEL命令,通知从服务器;
从服务器在执行客户端读命令时,即使碰到过期键也不会将其删除,而是像处理未过期键一样来处理;通过主服务器控制从服务器统一删除过期键,保证主从服务器数据的一致性。
未完待续