3. 过期淘汰
一、过期删除策略
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...