redis服务器会根据dbnum创建数据库默认是16个
struct redisServer{
redisDb * db
int dbnum;
}
redisClient表示客户端,可以用SELECT 命令选择数据库
struct redisClient {
redisDb * db; //指向redis选择的服务器
}
数据库
struct redisDb{
dict * dict; //数据库的键空间
dict * expires;// 过期
}
- 键是数据库的键,类型是字符串对象。
- 值就是redis数据库的值,为任意一种redis对象。
往redis的增删改查就是对dict的操作。
读写的额外维护操作
- 更新key的命中或者不命中次数
- 更新key的最后一次使用时间
- 读取的时候发现key过期,会删除
- 对watch某个key的客户端,key修改后标记dirty
- dirty的key计数器增加1,触发服务器持久化和复制
- 开启数据库通知功能,会发送数据库通知。
缓存删除策略
- 定时删除:对CPU不友好,定时器实现方式是无序链表,耗费时间长。
- 惰性删除:对内存不友好,数量多的时候相当于内存泄露,有些再次被访问几率很小。
- 定期删除:难于设置删除的时长和频率
redis缓存删除策略
-
惰性删除:所有的读写数据库操作经过expireIfNeed函数处理,过期删除,否则无动作。
-
定期删除:分多次遍历各个数据库,从expires字典里面随机选择一部分删除。每次会记录上次执行的数据库的位置
-
AOF、RDB和复制功能对过期影响
生成RDB
执行SAVE或BGSAVE的时候创建一个新的RDB,已过期的key不会保存
加载RDB: 主服务器模式运行的时候,会对RDB文件检查,过期舍去
从服务器都会加载到数据库,但是主服务器同步数据的时候,从服务器数据清空,所以也不影响。
AOF文件写入
没有被惰性删除或者定时删除的,会写入到AOF文件里面,真正删除后增加删除命令
AOF重写
-
复制
当服务器运行在复制模式下时,从服务器的过期动作由主服务器控制。 -
主服务器在删除一个过期键,显示向所有的从服务器DEL命令
-
从服务器执行客户端的读命令时,即使碰到过期 键也不会过期键删除。
-
从服务器只有在接到主服务器发来的DEL命令之后,才会删除过期键。
网友评论