内存的删除策略(针对设置了过期时间的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')