-
检查
key是否设置了过期时间,通过ttl key进行查看 ,若返回值为 -1 ,则表示并没有设置设定过期时间 -
检查是否有人为执行
del keyorflushdborflushall的操作查看日志执行
info commandstatscmdstat_XXX: calls=XXX,usec=XXX,usec_per_call=XXX
命令名:命令执行的次数,命令耗费的CPU时间(单位毫秒),执行每个命令耗费的平均 CPU 时间(单位毫秒)
日志重置执行
config resetsstats -
检查内存配置,是否超出内存设定被回收,redis默认会执行淘汰策略
info查看
- evicted_keys: 因最大内存容量限制而被驱逐(evict)的键数量
发现evicted keys值大于0,怀疑内存不够 - 检查是否设置最大内存
执行
config get maxmemory - 检查内存使用
执行
info memory, 可以看到当前使用内存量,和峰值 - 看到设定了最大内存,内存也将要接近并且曾经的峰值非常大, 那就需要看看设定的淘汰策略
执行
config get maxmemory-policy发现设定的淘汰策略为: allkeys-lru
| Redis提供6种数据淘汰策略 |
|---|
| volatile-lru:从已设置过期时间的内存数据集中挑选最近最少使用的数据 淘汰 |
| volatile-ttl: 从已设置过期时间的内存数据集中挑选即将过期的数据 淘汰 |
| volatile-random:从已设置过期时间的内存数据集中任意挑选数据 淘汰 |
| allkeys-lru:从内存数据集中挑选最近最少使用的数据 淘汰 |
| allkeys-random:从数据集中任意挑选数据 淘汰 |
| no-enviction(驱逐):禁止驱逐数据。(默认淘汰策略。当redis内存数据达到 |
列举2种解决方案
- 调整合适的策略,内存不足清除过期的key 执行
config set maxmemory-policy volatile-lru
- 设置更大的内存
CONFIG SET maxmemory XXXX
应用:
如mysql里有2000w条数据,redis只存20w条热点数据,如何保证redis中的数据都是热点数据? 这就能设置最大内存,再设置淘汰策略,设置volatile-lru,allkeys-lru等都可以;