目录
前言
Java中有GC,可以自动回收不再使用的Java对象。同样,Redis也是基于内存而运行的数据集合,也存在着对内存垃圾的回收和管理的问题。
管理Redis内存数据的两种方式
- 方式1:del命令直接删除一些键值对
对于Redis,del命令可以删除一些键值对,所以Redis比JVM更灵活(Java中不可直接操作JVM的gc,这也是jvm和redis的直接区别)。当内存运行空间满了之后,它还会按照回收机制去自动回收一些键值对,这和JVM有一定相似之处。但是当进行垃圾回收的时候,又有可能引发系统停顿,因此选择恰当的回收机制和回收时间将有利于系统性能的提高。
redis重
- 方式2:键值对设置过期时间
PS:如果redis保存的数据不设置过期时间,则会数据永久存储,ttl查询返回-1
下面为查看和设置键key的过期时间和指令
设置过期时间的应用场景
- 设置凭证业务相关的有效时间(验证码、session)
- 分布式锁RedLock
关键问题
如果key超时了,redis会回收key的存储空间吗?
不会。key超时了,redis不会自动回收,只会标识那些键值对超时了。主要是为了避免自动繁琐回收(如果实时有线程监控)造成系统的卡顿。避免出现太多的内存碎片。
回收策略
redis怎么回收超时的键值对(用的什么回收策略)?
设置回收频率,没有考虑具体什么算法。在redis的配置文件中有一个hz 10。默认一秒走10次回收,可以配置到1-500的范围,不建议超过100。
PS:即默认一秒走10次回收,redis一秒可以处理10万条数据,所以相比起来,一秒走十次不算什么
redis内存管理算法
具体有哪些算法?
LRU算法(即热点缓存):LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。
redis默认使用maxmemory-policy算法(最大内存策略)。弊端是:即当内存满了,只能读不能写。
改为采用volatile-lru算法。
LRU算法和TTL算法都不是精确的算法,而是一个近似的算法(近似LRU算法)。如果需要到精确,则需要按照使用的次数进行排序一系列的操作,这样必然会给回收过程中的系统性能大打折扣。
于是改为:通过采样的方式,结合LRU算法淘汰过期的键值对,进行回收。
PS:不够精确,权衡点是回收算法的性能
算法详细可参考:
https://www.cnblogs.com/linxiyue/p/10945216.html