内存的删除策略(针对设置了过期时间的key):定时删除,惰性删除,定期删除

定时删除:会为每一个设置了过期时间的key开启一个定时器,定时器一到,就会去删除对应的key (不会浪费内存,因为过期了的key是要被删除的,而这个策略会马上删除腾出更多的内存空间,但是每一个key都维护一个定时器,带来一部分的开销,cpu消耗大,如果同时过期的key太多的话,还会出现卡顿的现象)

定期删除:就是每隔一段时间,就对过期了的key进行删除,节省了cpu,但是有些过期了的key会在下一个定时周期到来之前占用一部分内存。

惰性删除: 在使用key的时候,才进行删除;cpu效率最高,但是过期了的key可能会长期占用内存。就比如说:你设置了1g的内存,存活时间为3分钟,但是,五分钟之后,你发现redis还是占用着那1 g 的内存,那么就是因为采用了惰性删除的策略,那么在没有操作这些key之前,是不会去删除,如果你想要删除,你可以去查看下这些key,他们就会被删除了。

 

当redis的内存不够的时候,会根据设置的相应策略进行处理

info memory可以查看内存的情况:

 

127.0.0.1:6379> info Memory
 # Memory
 used_memory:953528
used_memory_human:931.18K   //  已经使用的内存情况
 used_memory_rss:916600
 used_memory_rss_human:895.12K
 used_memory_peak:974344
 used_memory_peak_human:951.51K
 total_system_memory:0
 total_system_memory_human:0B
 used_memory_lua:37888
 used_memory_lua_human:37.00K
 maxmemory:1000000
maxmemory_human:976.56K   //  redis的最大内存
 maxmemory_policy:noeviction  //  淘汰策略,当到达最大的内存的时候,抛出异常提示
 mem_fragmentation_ratio:0.96
 mem_allocator:jemalloc-3.6.0

 

在conf文件中加入:

设置最大内存:

maxmemory 1000000  // 最大的内存
maxmemory-policy noeviction  // 内存淘汰策略,这个可选值有六个
 
# volatile-lru -> remove the key with an expire set using an LRU algorithm  在所有的key中删除最近最少使用的key
# allkeys-lru -> remove any key according to the LRU algorithm 在设置了过期时间的key中删除最近最少使用的key
# volatile-random -> remove a random key with an expire set  随机删除设置了过期时间的key
# allkeys-random -> remove a random key, any key  在所有的key中随机删除
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)  删除设置了过期时间并且最接近过期时间的key
# noeviction -> don't expire at all, just return an error on write operations  不删除,直接抛出异常( OOM command not allowed when used memory > 'maxmemory')