内存回收体现在两个方面
1:对过期key的回收:
分为两种结合:定期删除+惰性删除
定期好理解,默认100s就随机抽一些设置了过期时间的key,去检查是否过期,过期了就删了。
惰性删除,见名知意,惰性嘛,我不主动删,我懒,我等你来查询了我看看你过期没,过期就删了还不给你返回,没过期该怎么样就怎么样。
存在问题:有些key一直没有被随机扫到,也没有再访问过,通过上面的当时就无法回收,这时候需要内存淘汰机制
2:内存达到上限后出发内存溢出控制策略
1)noeviction:默认策略,不会删除任何数据,拒绝所有写入操作并返
回客户端错误信息(error)OOM command not allowed when used memory,此
时Redis只响应读操作。
2)volatile-lru:根据LRU算法删除设置了超时属性(expire)的键,直
到腾出足够空间为止。如果没有可删除的键对象,回退到noeviction策略。
3)allkeys-lru:根据LRU算法删除键,不管数据有没有设置超时属性,
直到腾出足够空间为止。
4)allkeys-random:随机删除所有键,直到腾出足够空间为止。
5)volatile-random:随机删除过期键,直到腾出足够空间为止。
6)volatile-ttl:根据键值对象的ttl属性,删除最近将要过期数据。如果
没有,回退到noeviction策略。
如果没有键满足回收的前提条件的话,策略volatile-lru, volatile-random以及volatile-ttl就和noeviction 差不多了。