问题描述

程序运行过程中,莫名其妙的找不到value,程序代码一切正常,该值设置了过期时间,但是未到过期时间

原因

[root@VM-3-11-centos ~]# redis-cli  -h 10.3.x.xx
10.3.9.19:6379[2]> config get maxmemory
1) "maxmemory"
2) "1073741824"
10.3.9.19:6379[2]> config get maxmemory-policy
1) "maxmemory-policy"
2) "volatile-lru"
10.3.9.19:6379[2]>  info memory
# Memory
used_memory:454369720
used_memory_human:433.32M
used_memory_rss:555495424
used_memory_peak:461159400
used_memory_peak_human:439.80M
used_memory_lua:44032
mem_fragmentation_ratio:1.22
mem_allocator:jemalloc-3.6.0

经上述日志发现

  • redis可使用内存空间为maxmemory即1g
  • redis已使用内存空间为used_memory即454m
  • redis使用最多内存空间为555495424即555m
  • redis的淘汰策略为volatile-lru 即仅对设置了过期时间的键采取LRU淘汰

分析

当redis使用内存达到 maxmemory时,会自动启动淘汰策略,每次set时,淘汰maxmemory-samples数量的key。所以有可能会出现上述的问题,但是上述used_memory远未达到maxmemory,并且通过info命令查看信息时,evicted_keys为0,所以未达到maxmemory而驱逐key

经过代码仔细观察,发现代码中存在 delete操作