Redis——内存淘汰策略

一、缓存耗尽的原因

1、每台机器的内存是一定的

2、key未设置过期时间

key不设置过期时间则在内存中一直存在,直到我们明确删除它。

3、过度或不合理的持久化

无论RDB快照或者AOF日志,都会在内存和磁盘中反复操作,需要一定的内存空间。

4、不及时清理过期缓存

有时过期缓存依旧存在,主要和缓存清理方式有关:

    • 主动定期删除  Redis默认每隔1s运行10次,每次随机抽取部分设置过期时间的key,检查是否过期,如果过期则删除key,直至过期的key比率低于1/4
    • 被动惰性删除  当客户端查询该key时,检查key是否过期,如果过期则删除key。
    • Redis4.0之后可以异步删除,Redis自身会判断如果删除耗时很长就会先删除key-value,然后异步执行回收内存

5、不合理不规范使用缓存

过度使用缓存,冷热数据不分;缓存过多或单个缓存value过大;缓存过期时间设置过长

二、淘汰策略

分三类:

  • 不淘汰而是直接拒绝写入新key (默认):1
  • 从设置了过期时间的key中淘汰: 2、3、4、5
  • 从所有key中淘汰: 6、7、8

1、noeviction

当写入新数据后的内存超过限定值时,写请求直接返回错误,只读请求可以正常执行,默认策略。

2、volatile-lru

当写入新数据后的内存超过限定值时,从设置了过期时间的key中使用LRU算法淘汰最久没有使用过的key。

LRU(Least Recently Used)

3、volatile-lfu

当写入新数据后的内存超过限定值时,从设置了过期时间的key中使用LFU算法淘汰使用频率最低的key。

LFU(Least Frequently used)

4、volatile-random

当写入新数据后的内存超过限定值时,从设置了过期时间的key中随机淘汰key。

5、volatile-ttl

当写入新数据后的内存超过限定值时,从设置了过期时间的key中根据过期时间淘汰key,越快过期越早淘汰。

6、allkeys-lru

当写入新数据后的内存超过限定值时,从所有key中使用LRU算法(最近最少使用算法)淘汰最久没有使用过的key。

7、allkeys-lfu

当写入新数据后的内存超过限定值时,从所有key中使用LFU算法(最少频率访问算法)淘汰使用频率最低的key。

8、allkeys-random

当写入新数据后的内存超过限定值时,从所有key中随机淘汰key

三、策略相关命令

1
2
3
4
5
6
7
8
9
10
11
#获取当前内存淘汰策略
redis > config get maxmemory-policy
 
#获取Redis能使用的最大内存大小:如果不设置最大内存大小或者设置为0,在64位操作系统#下不限制内存大小,在32位操作系统下最多使用3G
redis > config get maxmemory
 
#通过命令设置淘汰策略
redis > config set maxmemory-policy volatile-lru
 
#设置Redis最大占用内存大小
redis > config set maxmemory 2048mb

  

 

posted @   shog808  阅读(134)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示