数据库的结构
- 1.底层采用dict结构--我们称之为键空间,键空间的键就是我们的key,值则是我们的value。
数据库的拾遗
- 1.在redisServer中包含一个数组,数组元素就是数据库,redisServer就是redis的服务状态对象。
- 2.在redisServer中标识了启动redis创建多少个数据库
- 3.在redisClient中包含当前client目前正在使用的db。redisClient,是redis服务端给每个客户端保存的一个对象。
键空间拾遗
- 1.读取键之后(读写都会需要读取键),会根据键是否存在 来更新服务器的键空间命中次数和不命中次数。
- 2.读取键的时候,会更新键的LRU。
- 3.如果读取一个键时发现该键已经过期,那么服务器会先删除该过期键。
- 4.如果使用watch命令监视某个键,那么服务器对键进行修改后,该键会被标记为脏,脏键计数器值会随着修改增加,进而触发服务器的持久化以及复制操作。
设置过期时间的原理
- 1.可以直接设置多少秒(毫秒)之后过期,也可以直接设置时间戳。
- 2.上述最终都是会给对应的键设置一个毫秒数的时间戳,然后等时间超过该时间戳则该键过期。
- 3.设置过期键就是在过期字典中设置一个key和value。
保存过期时间
- 1.数据库中采用一个额外的字典,该字典里面包含所有键的过期时间。
- 2.过期字典的键是一个指针,指向监控机的某个键对象,过期字典的值是一个时间戳。
过期键的判断
- 1.先去过期字典查找,找到了之后再去对比时间戳。
过期键的删除策略
- 1.定时:一个键对应一个定时器
- 2.惰性:放任键过期不管,真正使用的时候去过期字典检测是否已经过期。过期则删除
- 3.定期:每隔一段时间检测db中的过期字典。定期的任务放在redis的serverCron函数执行。
- 4.redis采用的是定期和惰性的结合。
AOF,RDB和复制功能对过期键的处理
- RDB:生成RDB时候已经过期的键不会保存到RDB文件,主服务器载入RDB时候会删除过期键,而从服务则不会(当然后期同步从库还会清空)。
- AOF文件写入:写入文件不会删除过期键,但是当键被删除,会给AOF文件追加删除指令。
- AOF文件重写:会删除过期键。
- 复制:从服务器的删除操作只能有主服务器发送指令才可以,从服务器不会主动删除键。
网友评论