Redis的过期策略

常见的过期删除策略:

(1)定时删除:创建定时器,在时间到了时候,立刻对键进行删除

  • 过期键能尽可能被删除,并释放内存
  • 在过期键比较多的情况下,删除操作可能会占用一部分CPU时间。当内存不紧张而CPU非常紧张的情况下,会对服务器响应时间和吞吐量造成影响
例如,当大量请求等待服务器处理时,服务器应该优先处理请求而不是删除过期键。

另外,创建定时器需要用到时间事件(由无序链表实现),以至于查找一个事件的时间复杂度为O(N),并不能高效的处理大量时间事件

(2) 惰性删除:每次从键空间获取键时,都检查是否过期,过期则删除,未过期,则返回该键

  • 只有取出键时才对其进行过期检查,不会删除其他键,不会花费CPU太多时间。若一个键早已过期,但一直未被取到,它便会一直占用内存。若有大量的未被访问的键,而服务器又不会主动释放,就会造成大量的内存浪费。
(3) 定期删除:每隔一段时间删除里面的过期键
  • 每隔一段时间删除过期键,减少了对cpu占用时间的影响
  • 也有效的减少了过期键过多而造成的内存浪费
  • 删除操作执行的时长和频率。既不能太频繁也不能太稀疏,需合理设置

redis中常见的过期键设置命令

  • SETEX命令可以在设置一个字符串的同时为键设置过期时间。
  • TTL和PTTL命令接受一个带生存时间或者过期时间的键,返回这个键的剩余时间。
  • EXPIRE 将key生存时间设置为ttl秒
  • PEXPIRE 将key生存时间设置为ttl毫秒
  • EXPIREAT 将键key的过期时间设置为timestamp所指定的秒数时间戳
  • PEXPIREAT 将键key的过期时间设置为timestamp所指定的豪秒数时间戳

Redis的过期策略_第1张图片

redis惰性删除策略

Redis的过期策略_第2张图片

redis定期删除策略

过期键的定期删除策略由redis.c/activeExpireCycle函数实现

  • 函数每次运行时,都从一定数量的数据库中取出一定数量的随机键检查,并删除过期键
  • 全局变量current_db会记录当前函数的检查进度,在下一次调用时,接着上次的进度处理。当前函数遍历10号数据库返回了,下次就会从11号开始
  • 随着函数的执行,所有数据库都被检查一遍后,全局变量current_db会置为0,然后重新开始

复制功能下如何处理

复制模式下,过期键的删除由主服务器控制

  • 主服务删除一个过期键后,会显示的向从服务器发送DEL命令,告知删除该键
  • 从服务器只有接收到主服务器发送来的DEL命令,才会删除过期键。否则不会删除,并且像正常键一样处理
这样可以保持数据的 一致性

RDB和AOF时如何处理过期键

RDB 

  • 以主服务器模式运行,在载入RDB文件时,未过期的键才会被载入,过期键被忽略
  • 以从服务器模式运行,所有键都将载入
AOF写入
  • 若某键已过期,程序会向AOF文件追加一条DEL,来显示删除
AOF重写
  • 已过期的键不会保存到重写的AOF文件中

你可能感兴趣的:(redis)