相关命令
FLUSHDB
删除当前Redis DB的所有的key
FLUSHALL
删除所有Redis DB的所有的key
EXPIRE、PEXPITE、EXPIREAT、PEXPIREAT
EXPIRE 以秒为单位设置过期时间 now+设置的时间
PEXPITE 以毫秒为单位设置过期时间 now+设置的时间
EXPIREAT 以时间戳为单位设置过期时间 过期时间=时间戳
这三者都是通过PEXPIREAT来实现的
PERSIST
移除一个key的过期时间
TTL、PTTL
已秒和毫秒为单位返回一个key过期时间和当前时间之差
过期键删除策略
定时删除
对每一个key设置一个定时器,在key过期时删除key;优点是能及时删除过期key,释放内存,但是会占用太多CPU资源
惰性删除
在每次访问key时,判断key是否过期,过期删除
定期删除
每隔一段时间,对Redis数据库进行检查,删除过期键;至于检查多少个数据库、多少个键,由算法决定(分多次遍历数据库,从expires字典中随机取出部分键进行检查,删除其中过期键,同时每次遍历的处理时间会有限制,到达后自动停止,同时下一次执行的时候会接着上一次处理结束处继续)
Redis目前采用的删除策略是惰性删除和定期删除相结合
AOF、RDB和复制功能对过期键处理
- 生成RDB文件和主服务器载入RDB文件都会自动忽略过期的键
- 从服务器载入RDB文件时,
会对所有的键进行载入
- 当服务器以AOF模式运行时,过期键还未被惰性删除或定期删除时,AOF文件不会有任何处理,当该键被删除时,程序会往AOF文件中加入一条DEL命令表示该键被删除了
- AOF重写时,过期的键不会被写入
- 当服务器运行在复制模式下,从服务器删除过期键的动作有主服务器控制:主服务器删除过期键时会往各从服务器同步;从服务器上读到过期键时,不会删除。
有点疑问
在redis3.0.x版本中,从服务器从能够读到已经过期的key,而主上读不到,从而导致主从不一致。 在redis3.2.x版本中,该bug已修复(修复方式:3.2.8版本中,slave上的键的删除逻辑与3.0.7相同,即需要master发删除键的命令,只是发现key过期时,逻辑返回null)
重点
- Redis数据库主要由俩个字典组成:dict保存键值对;expires保存键过期时间,过期时间是一个时间戳
- 当Redis命令对数据库进行了修改时,服务器会根据配置(客户端可以订阅键空间通知(某个键执行了什么命令)或键事件通知(某个命令被执行了))向客户端发送通知
网友评论