Redis的过期设置和策略

Redis设置过期时间主要有以下几个配置方式

  • expire key seconds
    设置key在多少秒之后过期
  • pexpire key milliseconds
    设置key在多少毫秒之后过期
  • expireat key timestamp
    设置key在具体某个时间戳(timestamp:时间戳 精确到秒)过期
  • pexpireat key millisecondsTimestamp
    设置key在具体某个时间戳(millisecondsTimestamp:时间戳 精确到毫秒)过期
expire key seconds
bash 复制代码
127.0.0.1:6379> set p1 2
OK
127.0.0.1:6379> ttl p1
(integer) -1
127.0.0.1:6379> expire p1 10
(integer) 1
127.0.0.1:6379> ttl p1
(integer) 8
pexpire key milliseconds
bash 复制代码
127.0.0.1:6379> set p2 3
OK
127.0.0.1:6379> pexpire p2 100000
(integer) 1
127.0.0.1:6379> ttl p2
(integer) 96
127.0.0.1:6379> pttl p2
(integer) 90708
expireat key timestamp
bash 复制代码
127.0.0.1:6379> expireat p3 1746429703
(integer) 1
127.0.0.1:6379> get p3
"2"
127.0.0.1:6379> ttl p3
(integer) 2969
pexpireat key milliseconds
bash 复制代码
127.0.0.1:6379> set p4 2
OK
127.0.0.1:6379> time
1) "1746426802"
2) "27879"
127.0.0.1:6379> pexpireat p4 1746428802000
(integer) 1
127.0.0.1:6379> ttl p4
(integer) 1964
127.0.0.1:6379> pttl p4
(integer) 1959013
persisit

移除指定键的过期时间

bash 复制代码
127.0.0.1:6379> get p3
"2"
127.0.0.1:6379> ttl p3
(integer) 2792
127.0.0.1:6379> persist p3
(integer) 1
127.0.0.1:6379> ttl p3
(integer) -1

过期键在持久化(RDB AOF)过程中是如何处理的

RDB

RDB文件分为2个阶段,文件生成阶段和加载阶段。

生成阶段

Redis讲内存中数据持久化成RDB文件的时候,会对key进行过期检查,过期key不会被持久化到RDB文件中,因此Redis的过期键不会对生成RDB文件的时候造成影响。

加载阶段
  • Redis是主服务器运行模式的话,在载入RDB文件的时候,程序会对key进行校验,如果key过期,则不会被加载到内存中。因此过期键不会对载入RDB文件的主服务器造成影响。
  • Redis是从服务器运行模式的话,在载入RDB文件的时候,程序不会对key是否过期进行检验(这是因为 Redis 的过期键删除策略(惰性删除 + 定期删除)仅由主服务器执行),如果key过期了,也会被加载到内存中,当从服务器加载完RDB文件后,会和主服务器进行增量数据同步,如果主服务器上某个键过期被删除,则主服务器会将DEL命令同步到从服务器,此时,从服务器才会删除该键。如果主服务器尚未删除该键(例如键刚过期但未被触发惰性/定期删除),从服务器会继续保留该键,直到主服务器通知删除。如客户端访问从服务器读取到某个key 的时候,会判断key是否过期,如果过期了,返回给客户端nil,但是从服务器不会删除该key(key的删除策略仅由主服务器完成)。
AOF
AOF文件写入

AOF文件写入的时候,如果过期键未被删除的话,则AOF文件中会保留此键,当过期键被删除的时候,AOF文件中会追加DEL命令,来显性的删除过期键。

AOF重写

当发生AOF文件重写的时候,会对Redis中的过期键进行检查,如果键过期,则不会被保存到重写后的AOF文件中。因此不会对AOF重写造成影响

主从库的过期键处理

从库不会进行过期扫描,从库对过期键的过期是被动的,如果从库中的键过期了,如果客户端访问到从库的话,依然可以访问到对应键的值,向未过期键值对一样返回。

从库的过期键依赖主服务器控制,主库key过期会在AOF文件中增加一条DEL命令,同步到从库后,从库通过执行这条DEL命令来删除过期键。

过期执行策略

Redis中维护了一个字典,里面存储了所有设置了过期时间的键值,一般称之为过期字典。

过期策略

常见的过期策略有三种

  • 定时删除
  • 定期删除
  • 惰性删除
定时删除

在设置键过期时间时,创建一个定时事件,当过期时间到达时,由事件处理器执行键的删除操作。

  • 优点
    保证内存可以尽快释放。
  • 缺点
    在Redis高负载的情况,与大量过期键需要同时处理,会造成Redis服务器的卡顿,影响主业务执行。
定期删除

每隔一段时间检查一次数据库,随机删除一些过期值

Redis默认每秒进行10次的过期扫描,此配置可以通过redis的配置文件redis.conf调整hz的值。

bash 复制代码
127.0.0.1:6379> config get hz
1) "hz"
2) "10"

Redis每次扫描并不是遍历过期字典的所有键,而是随机抽取的方式判断并删除过期键。

流程如下所示

  1. 从过期字段中随机取出20个键
  2. 判断这20个键中是否有过期键,如果有则删除。
  3. 如果过期键的比例超过了25%,则重复步骤1.

为了保证过期扫描不会由于多次循环导致线程卡死现象,从而影响主业务的执行,Redis设置了扫描的时间上限,默认不会超过25ms

  • 优点
    采用定期扫描,限制了删除操作的时长和频率,降低了删除操作带来对主业务的影响,同时也能删除一部分过期的key来减少对存储空间的占用。
  • 缺点
    内存清理方面没有定时删除好,对系统资源的占用也没有惰性删除的好。
惰性删除

不主动删除过期键,在获取键的时候判断键是否过期,如果过期则删除key并返回nil。

  • 优点
    每次访问的时候,才会判断键是否过期,所以此方式会很少占用系统资源。
  • 缺点
    这种方式删除不及时,或导致内存利用率低,造成一点的资源浪费
redis采用的策略

redis采用定期删除 + 惰性删除的删除策略。

相关推荐
曹牧29 分钟前
Oracle数据库中,将JSON字符串转换为多行数据
数据库·oracle·json
被摘下的星星1 小时前
MySQL count()函数的用法
数据库·mysql
末央&1 小时前
【天机论坛】项目环境搭建和数据库设计
java·数据库
徒 花1 小时前
数据库知识复习07
数据库·作业
素玥1 小时前
实训5 python连接mysql数据库
数据库·python·mysql
jnrjian1 小时前
text index 查看index column index定义 index 刷新频率 index视图
数据库·oracle
瀚高PG实验室2 小时前
审计策略修改
网络·数据库·瀚高数据库
言慢行善2 小时前
sqlserver模糊查询问题
java·数据库·sqlserver
韶博雅2 小时前
emcc24ai
开发语言·数据库·python
有想法的py工程师2 小时前
PostgreSQL 分区表排序优化:Append Sort 优化为 Merge Append
大数据·数据库·postgresql