删除策略 与 逐出策略 的对比
删除策略是针对具有有效期的数据,如果所有数据都是永久的,但是内存又满了,新的数据不能存进来时,就需要用到逐出策略。
逐出策略是指,在redis用内存储存操作前,先检查内存是否足够,不够的话临时删除一些数据来清理空间。
注意:逐出算法不一定能成功,当所有数据都逐出失败时,会报OOM异常。
影响数据逐出的相关配置
- 最大可使用内存:
maxmemory
占用物理内存的比例,默认为0,表示全部占用。生产环境根据需求确认,一般在50%左右。 - 每次选取待删除数据的个数:
maxmemory-samples
选择待删除数据时,不是全库扫描,而是随机选择,这个参数用来控制选择的数量。 - 删除策略:
maxmemory-policy
达到最大内存后,被挑选出来的数据被删除的策略。
具体的删除策略:
- 检测易失数据(即有时效性的数据:server.db[i].expires)
1.volatile-lru
(Least Recently Used):淘汰一段时间内,最长时间未被使用的数据。
2.volatile-lfu
(Least Frequently Used):淘汰一段时间内,使用次数最少的数据。
3.volatile-ttl
:删除即将过期的数据。
4.volatile-random
:随机选择数据淘汰。 - 检测全库数据(所有数据集:server.db[i].dict)
5.allkeys-lru
(Least Recently Used):淘汰一段时间内,最长时间未被使用的数据。
6.allkeys-lfu
(Least Frequently Used):淘汰一段时间内,使用次数最少的数据。
7.allkeys-random
:删除即将过期的数据。 - 放弃数据驱逐
8.no-enviction
:禁止数据驱逐(redis4.0默认策略),会引发OOM。