架构:
server-> db* -> dict*(k/v)
1 | typedef struct redisServer { |
数据库键空间
1 | typedef struct redisDb { |
db默认有16,客户端可以通过select 1
命令来选择1号数据库。
每个client会保存当前在哪个db的状态变量。
键:Key
key只能为字符串。
整个架构最多三层: db->hashtable->value
key过期
过期删除策略
- 定时统一删除 (一般不用,卡太久)
- 惰性删除(默认使用,访问时发现过期才删除)
- 定期删除(默认使用,类似于增量删除,每次删除最近过期的)
redis持久化策略
- RDB: 定期(比如五分钟)做一次快照; (
Redis DataBase
) - AOF: 类似于WAL,存每条操作指令日志。(
Append only file
)
RDB和AOF下的过期删除
- RDB: 主服务器生成快照时删除过期key; 从库则保留。从库只有收到主库DEL指令时候才会删除过期key。
- AOF: 保存DEL指令即可。
1 | 从库如果没有收到主库的DEL指令,即使已经key已经过期,也会返回给客户端。 |
主从复制要点:(中心化,一致性)从库
只接受主库
的写
指令,自己只执行读
。
通知机制
两个功能:
- 订阅某个key的所有操作; (只能知道发生了什么类型的操作,不知道操作数)
- 订阅某个库下的所有DEL操作.(或者别的什么操作)
换句话说就是订阅某个库下key,或者订阅指令。