Redis过期键(5-1-2)

摘录自《Redis设计与实现 第一版》黄健宏

  • redis是用c语言进行结构编写,我按着自己的理解用java语言翻译了一下,可能会有些出入
  • 以下内容都是我对书籍内容的个人理解,可能存在错误,若要深入学习,建议翻看原书籍

一、设置键过期时间

命令 作用
EXPIRE [key] [second] 设置键过期时间(单位 :秒)
EXPIREAT [key] [unixtime] 设置键过期的时间点(单位:秒),-2代表键不存在,-1代表键无过期时间
PEXPIRE [key] [second] 设置键过期时间(单位 :毫秒)
PEXPIREAT [key] [unixtime] 设置键过期的时间点(单位:毫秒),-2代表键不存在,-1代表键无过期时间

注意:虽然有那么多设置过期时间的方式,但是expires字典所保存的value只有一种形式,即过期时间戳,所有以上四种指令实质上都会变成PEXPIREAT 指令,redis内部会帮我们完成自动转换


二、查询键过期时间

命令 作用
TTL [key] 查询键过期时间(单位:秒),-2代表键不存在,-1代表键无过期时间
PTTL [key] 查询键过期时间(单位:毫秒),-2代表键不存在,-1代表键无过期时间

三、过期键的判定

1.检查键是否存在于expires字典中,如果存在,取出键的过期时间
2.检查当前unix时间戳是否大于键的设置的过期时间戳,如果大于,那么键已过期,反之未过期


四、过期键的清除

1.定时删除
  • 说明:在设置键的过期时间时,创建一个定时事件,当过期时间到达时,由时间处理器自动执行键删除操作
  • 优点:保证内存第一时间释放,内存友好
  • 缺点:①需要大量CPU资源;②redis处理时间事件的实现是无序列表,查找一个时间事件的复杂度是O(N),并不适合用来处理大量时间事件
2.惰性删除
  • 说明:在键取出时,进行检查,保证键删除在只做不可情况下进行
  • 优点:占用少量CPU资源,CPU资源友好
  • 缺点:内存不友好,未被操作的过期键会一直存在于内存中无法释放,占用大量内存
3.定期删除
  • 说明:
    • ①每隔一段时间,执行一次删除操作,并通过限制删除操作的执行频率和时长,以此减少对CPU的负荷
    • ②定期删除过期键,有效地减少了因惰性删除带来的内存浪费
redis采用的策略:组合(惰性删除+定期删除)

惰性删除(expireIfNeeded(String key)函数):每次读取写入数据库之前,都会调用该函数对输入键进行检查,将过期键删除
定期删除(**activeExpireCycle()**函数):尽可能遍历各个数据库的expires字典,随机检查一部分键的过期时间,并删除过期键


五、过期键对AOF(Append Only File)、RDB(Redis DataBase)和复制的影响

1.RDB文件
  • 说明:创建新RDB文件时,程序会对键进行检查,过期键不会被写入更新后的RDB文件中
  • 影响:无
2.AOF文件
  • 情况一:键过期,但是未删除前
    • 影响:无
  • 情况二:键过期,已删除
    • 影响:程序会向AOF文件追加一条DEL命令,显式地表示键已删除
3.AOF重写
  • 说明:当AOF重写时,程序会对键进行检查,过期键不会被写入重写的AOF文件中
  • 影响:无
复制
  • 说明:当服务器有附属节点时,过期键的删除由主节点统一控制
  • 情况一:服务器是主节点:
    • 影响:在它删除一个过期键后,会显式地向所有附属节点发送一条DEL指令
  • 情况二:服务器是附属节点:
    • 影响:碰到键过期,会向程序返回键已过期的回复(但是此时不执行惰性删除),直到接收到主节点发送过来的DEL命令,附属节点才真正将过期键删除

以上两点保证了主节点和附属节点数据的绝对一致,虽然这种处理机制会对带有大量附属节点和过期键的应用造成较大的内存压力,但过期键通常会被主节点快速发现被删除,因此影响并不大

你可能感兴趣的:(Redis)