1. Redis
的过期策略以及内存淘汰策略
比如你 Redis
只能存 5G
数据,可是你写了 10G
,那会删 5G
的数据。怎么删的?还有,你的数据已经设置了过期时间,但是时间到了,内存占用率还是比较高?答案: redis
采用的是 定期删除 + 惰性删除
两种策略
定期删除:用一个定时器来负责监视 key
,过期则自动删除。虽然内存及时释放,但是十分消耗 CPU
资源。在大并发请求下,CPU
要将时间应用在处理请求,而不是删除 key
,因此没有采用这一策略
1.1. 过期策略
1.1.1. 定期删除 + 惰性删除是如何工作的
定期删除:Redis
默认会每隔 100ms
随机抽取检查是否有过期的 Key
,如有过期的 Key
则删除。如果只采用定期删除策略,会导致很多 Key
过期了,而没有删除。于是,惰性删除就派上用场了
惰性删除:就是在你获取某个 Key
的时候 Redis
会检查一下,这个 Key
如果设置了过期时间那么是否过期了?如果过期了此时就会删除。并不是 Key
到了过期时间,就会被删除掉
1.1.2. 定期删除 + 惰性删除就没问题了么
不是的,如果定期删除没有删除掉某个 Key
。然后你也没即时去请求这个 Key
,也就是说惰性删除也没生效。这样,Redis
的内存会越来越高,那么就应该采用内存淘汰机制
1.2. 内存淘汰策略
Redis
提供了 6
种的内存淘汰策略,配置方法如下
maxmemory-policy volatile-lru
noeviction
:默认使用的策略,当内存不足以容纳新写入数据时,新写入操作会报错。不推荐使用allkeys-lru
:当内存不足以容纳新写入数据时,移除最近最少使用的key
。也就是从所有key<