3. 过期淘汰

  • redis
  • redis

一、过期删除策略

Redis是可以对数据设置过期时间的,删除过期的数据的就是过期键值删除策略。

1.1 设置过期时间的几种方法

# 多少秒过期
expire <key> <n>
set <key> <value> ex <n>
setex <key> <n> <valule>
# 多少毫秒过期
pexpire <key> <n>
set <key> <value> px <n>
# 到达指定时间戳过期,精确到秒
expireat <key> <n>
# 到达指定时间戳过期,精确到毫秒
pexpireat <key> <n>

# 查看剩余过期时间
ttl <key>
# 取消过期时间
persist <key>

1.2 原理

当给一个key设置过期时间后,redis会将该key还有过期时间的时间戳存储到 过期字典<key,timestamp> 中。

当从redis中读取某个key时,redis会先从过期字典中读取这个key。

  • 如果不在,则正常读取
  • 如果存在,则会获取该 key 的过期时间,然后与当前系统时间进行比对,如果比系统时间大,那就没有过期,否则判定该 key 已过期。

就这么简单

1.3 过期删除策略有哪些

有三种删除策略

  • 定时删除:在设置 key 的过期时间时,创建一个定时事件,当时间到达时,由事件处理器删除key
    • 优点: 保证过期的key尽快删除
    • 缺点: 有过期时间的key比较多时,会占用比较多的cpu资源
  • 惰性删除(redis采用):每次访问 key 时,检查key是否过期,如果过期就删除
    • 优点: cpu友好
    • 缺点: 内存不友好,甚至可能出现内存泄漏
  • 定期删除(redis采用):定时的从数据库中取出一些key进行检查,删除过期的
    • 优点: cpu、内存友好
    • 缺点: 难以确定删除操作执行的时长和频率

二、淘汰策略

如果删除策略漏掉了一部分key,这部分key迟迟没有被删除,久而久之redis内存越来越大,直到到达redis设置的最大内存,就会触发淘汰策略。

# 设置redis最大内存4g
CONFIG SET maxmemory 4gb

2.1 淘汰策略有哪些

淘汰策略有八种,分为两类:不进行数据淘汰、进行数据淘汰

2.1.1 不进行数据淘汰

  • noeviction:默认的内存淘汰策略,什么也不干

2.1.2 进行数据淘汰

2.1.2.1 淘汰有过期时间的数据
  • volatile-random:随机淘汰设置了过期时间的任意键值;
  • volatile-ttl:优先淘汰更早过期的键值。
  • volatile-lru(Redis3.0 之前,默认的内存淘汰策略):淘汰所有设置了过期时间的键值中,最久未使用的键值;
  • volatile-lfu(Redis 4.0 后新增的内存淘汰策略):淘汰所有设置了过期时间的键值中,最少使用的键值;
2.1.2.2 淘汰所有的数据
  • allkeys-random:随机淘汰任意键值;
  • allkeys-lru:淘汰整个键值中最久未使用的键值;
  • allkeys-lfu(Redis 4.0 后新增的内存淘汰策略):淘汰整个键值中最少使用的键值。

2.2 设置淘汰策略

# 查看当前淘汰策略
config get maxmemory-policy
# 设置淘汰策略
config set maxmemory-policy <策略>
Loading...