Table of Contents
一:惰性删除
1.1 策略描述
当访问redis中键值对时会判断这个键值对是否过期,如果过期的话就会删除这个键值对并返回nil
1.2 策略优缺
- 优点:对CPU友好,不用执行与当前命令无关的操作
- 缺点:对内存不友好,当大量过期的键值对不被访问时会浪费大量内存空间
二:定期删除
2.1 策略描述
为了弥补惰性删除对于内存的不友好,redis中还有一种过期策略即定期删除。当一个键值对设置expire后,redis中会维护一个过期字典。这个过期字典在redis中会使用serverCron时间事件轮训,轮训过期键值对进行释放
2.2 策略详解
redis.conf配置文件中hz
配置项配置serverCron每秒执行次数,默认10表示每100ms执行一次serverCron。redis中限制每次过期key清理时间不超过CPU时间的25%,这段时间内会执行如下步骤操作:
- 1:随机选取过期字典中的100个key
- 2:淘汰所有的过期key
- 3:如果过期key超过25个则重复步骤1
三:主动清理
物理机的内存空间是有限的,当所有内存被占满以后redis接收到写操作命令应该怎么处理?相关的清理策略又是什么?
3.1 触发机制
redis.conf
配置文件中maxmemory参数设置redis占用内存的大小,当超过这个值限定以后将会根据maxmemory-policy
设置清理redis内存对象。有关这个maxmemory提醒一点:
- 集群环境下适当调低maxmemory配置,给output buffer预留空间。因为output buffer空间并不包括在maxmemory中
3.2 清理策略
清理策略划分可以分为两个维度三个方面,两个维度分别是过期键中筛选
、所有键中筛选
,三个方面分别是lru
、ttl
、random
- volatile-lru:过期键中最长时间未调用的键值对
- volatile-ttl:过期键中即将过期的键值对
- volatile-random:过期键中随机删除
- allkeys-lru:所有键中最长时间未调用的键值对
- allkeys-random:所有键中随机删除
- noevication:不清理,返回异常
3.3 相关参数
# 策略启动阈值
maxmemory <bytes>
# 清理策略类型
# 默认不清理直接返回异常noeviction
maxmemory-policy noeviction
# 如策略采用volatile-lru,每次删除会选择参数设置个数样本键值对
# 然后删除其中lru时间最长的键值对
# 源码注释中告诉我们默认参数5比较合适
# 10的话淘汰的ttl或者lru精度很高,但是CPU消耗比较大
# 3的话会很快,但是精度不会太高
maxmemory-samples 5
复制代码
评论前必须登录!
注册