Redis内存机制!
Redis内存机制!
月伴飞鱼内存回收策略
Redis的内存回收机制主要体现在以下两个方面:
删除到达过期时间的键对象。
内存使用达到Maxmemory上限时触发内存溢出控制策略。
删除过期键对象:
Redis所有的键都可以设置过期属性,内部保存在过期字典中。
惰性删除:
- 当客户端读取带有超时属性的键时,如果已经超过键设置的过期时间,会执行删除操作并返回空。
定时任务删除:
- Redis内部维护一个定时任务,默认每秒运行10次。
内存溢出策略
当Redis
所用内存达到Maxmemory
上限时会触发相应的溢出策略:
noeviction
:
- 默认策略,不会删除任何数据,拒绝所有写入操作并返回客户端错误信息,此时Redis只响应读操作。
volatile-lru
:
- 根据
LRU
算法删除设置了超时属性的键。- 如果没有可删除的键对象,回退到
noeviction
策略。
allkeys-lru
:
- 根据
LRU
算法删除键,不管数据有没有设置超时属性。
allkeys-random
:
- 随机删除所有键。
volatile-random
:
- 随机删除过期键。
volatile-ttl
:
- 根据键值对象的
ttl
属性,删除最近将要过期数据,如果没有 回退 到noeviction
策略。
allkeys-lfu
:
- 从所有键中淘汰使用频率最少的键,从所有键中驱逐使用频率最少的键。
volatile-lfu
:
- 从设置了过期时间的键中,通过
LFU
算法淘汰使用频率最少的键。
优先使用
allkeys-lru
策略。
- 业务数据中有明显的冷热数据区分,建议使用
allkeys-lru
策略。业务应用中的数据访问频率相差不大,没有明显的冷热数据区分,建议使用
allkeys-random
策略。业务中有置顶的需求,比如置顶新闻、置顶视频,可以使用
volatile-lru
策略。
Redis内存满了
当 Redis
内存数据满了,以下是可能发生的情况。
写入操作失败:
如果
Redis
没有配置开启持久化(如RDB
或AOF
),并且达到了最大内存限制。
- 默认行为是不接受写操作并返回错误。
这是为了保护数据的一致性,防止数据丢失。
内存淘汰策略:
Redis
提供了多种内存淘汰策略来处理内存数据满的情况。当数据满时,根据配置的淘汰策略,
Redis
可能会自动删除一些数据来腾出空间。
持久化策略:
如果
Redis
配置了持久化(如RDB
或AOF
)。当内存数据满时,
Redis
可以将数据持久化到磁盘,从而腾出内存空间。这样可以保证数据的持久性,并继续接受写入操作。