一、缓存耗尽的原因
1、每台机器的内存是一定的
2、key未设置过期时间
key不设置过期时间则在内存中一直存在,直到我们明确删除它。
3、过度或不合理的持久化
无论RDB快照或者AOF日志,都会在内存和磁盘中反复操作,需要一定的内存空间。
4、不及时清理过期缓存
有时过期缓存依旧存在,主要和缓存清理方式有关:
- 主动定期删除 Redis默认每隔1s运行10次,每次随机抽取部分设置过期时间的key,检查是否过期,如果过期则删除key,直至过期的key比率低于1/4
- 被动惰性删除 当客户端查询该key时,检查key是否过期,如果过期则删除key重新获取。
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
三、策略相关命令
#获取当前内存淘汰策略 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
标签:限定值,缓存,过期,Redis,内存,key,淘汰 From: https://www.cnblogs.com/shog808/p/17278366.html