redis过期键

一、过期设置

1.1 过期设置的指令

  • Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间
  • expire可以设置过期时间
 1 SET key value        // 存入键值对
 2     
 3 EXPIRE key 5        // 设置过期时间(秒)
 4 PEXPIRE key 5000    // 设置过期时间(毫秒)
 5 
 6 TTL key            // 返回key剩余过期时间(Time To Live)
 7 
 8 PRESIST key        // 移除键的过期时间
 9 
10 TIME            // 查看当前时间戳

1.2 指令转换关系

  • 所有设置时间的指令最终都会转换成为PEXPIREAT指令:以毫秒精度,设置过期时间(一个UNIX时间戳),当过期时间来临时,服务器自动删除该键
    • EXPIREAT:以秒为单位设置过期时间(时间戳)
    • 转换关系:

1.3 检查过期策略

  • 检查给定键是否存在过期字典,如果存在,则取得键的过期时间(redisDb.expires过期字典保存了所有键过期时间)
  • 检查当前的UNIX时间戳是否大于键的过期时间,大于的话则键已经过期

二、清除策略

2.1 定时过期

每个设置过期时间的key创建一个定时器,到过期时间就会立即清除。

  • 优点:内存友好,及时清理
  • 缺点:占用大量的CPU资源处理过期数据,影响缓存的响应时间和吞吐量

2.2 惰性过期

访问一个key时,才判断该key是否已经过期,过期则清除。

  • 优点:最大化节约CPU资源
  • 缺点:对内存不友好,可能存在大量key没有再次被访问而占用大量内存的问题

2.3 定期过期

每隔一段时间,扫描一定数量的数据库expires字典中一定数量的key,清除其中过期的key。

  • 优点:定期过期是对上面两种方式的一种整合和折中,通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
  • 缺点:难以确定删除操作执行的时长、频率

Redis服务器使用了惰性过期和定期过期两种过期策略。

三、持久化对过期键处理

3.1 RDB

  • 保存快照时,过期键不保存
  • 载入RDB文件时
    • 主服务器:检查剔除过期键(不载入过期键)
    • 从服务器:会载入所有数据(载入过期键),不过主服务器在数据同步的时候,从服务器的数据会被清空,所以载入过期键并不会造成影响

3.2 AOF

  • 文件写入时,如果某个键已经过期
    • 没有被惰性过期/定期过期删除,AOF不会因为键过期产生任何影响(保存写操作)
    • 当过期键被惰性过期/定期过期删除,程序向AOF中追加一条DEL命令来表示该键已经被删除
  • 文件重写时,检查剔除过期键(已过期键不会被重写入AOF文件中)

3.3 主从复制

  • 主服务器删除一个过期键后,会显示地向所有从服务器发送一个DEL命令,告知从服务器删除过期键
  • 从服务器在执行客户端发送地读命令时,即使遇到过期键也不会删除(惰性过期),而是继续像处理未过期键一样处理过期键,会正常返回查询结果。
  • 从服务器只有在收到主服务器发来的DEL命令之后,才会删除过期键

本文来自博客园,作者:Mr-xxx,转载请注明原文链接:https://www.cnblogs.com/MrLiuZF/p/15092024.html

原文地址:https://www.cnblogs.com/MrLiuZF/p/15092024.html