结构:
public class RedisDb {
private int id; // 数据库号码,用来程序内部选择数据库
private Dictionary dict; // 键值数据
private Dictionary<String, Long> expires;// 过期信息
}
实际上键值数据是字典结构,这里使用HashMap表示
键空间
键空间的操作
- 字典的基本操作,增删改查
- 更新命中率
- 更新lru
- 删除过期键
- 事务中对键的修改设置为脏
键的过期
expires保存了键的过期时间,可以使用命令来设置该四件
过期判定
if(existInExpires(key)){
if(now() > expires.get(key)){
// 过期
}
}
过期键删除
有三种方式:
- 定时删除, 在设置的时候创建定时任务,到时执行删除
内存友好,费CPU - 惰性删除,过期不管,下次访问时删除且返回空
CPU友好,费内存 - 定期删除,使用定期任务,来检查是否过期。 折中
redis使用了后两者相配合。
过期对AOF等的影响
- 过期键不写入RDB
- 过期键删除点(惰性或者定期)会写AOF
- 复制, 主节点会同步删除,从属节点返回已经过期但是不删除