目录

前言

管理Redis内存数据的两种方式

设置过期时间的应用场景

关键问题

回收策略

redis内存管理算法


前言

Java中有GC,可以自动回收不再使用的Java对象。同样,Redis也是基于内存而运行的数据集合,也存在着对内存垃圾的回收和管理的问题。

Redis学习笔记8之内存管理,超时指令

 

管理Redis内存数据的两种方式

  • 方式1:del命令直接删除一些键值对

对于Redis,del命令可以删除一些键值对,所以Redis比JVM更灵活(Java中不可直接操作JVM的gc,这也是jvm和redis的直接区别)。当内存运行空间满了之后,它还会按照回收机制去自动回收一些键值对,这和JVM有一定相似之处。但是当进行垃圾回收的时候,又有可能引发系统停顿,因此选择恰当的回收机制和回收时间将有利于系统性能的提高。

redis重

  • 方式2:键值对设置过期时间

PS:如果redis保存的数据不设置过期时间,则会数据永久存储,ttl查询返回-1

下面为查看和设置键key的过期时间和指令

Redis学习笔记8之内存管理,超时指令

 

设置过期时间的应用场景

  1. 设置凭证业务相关的有效时间(验证码、session)
  2. 分布式锁RedLock

 

关键问题

如果key超时了,redis会回收key的存储空间吗?

不会。key超时了,redis不会自动回收,只会标识那些键值对超时了。主要是为了避免自动繁琐回收(如果实时有线程监控)造成系统的卡顿。避免出现太多的内存碎片。

 

回收策略

redis怎么回收超时的键值对(用的什么回收策略)?

设置回收频率,没有考虑具体什么算法。在redis的配置文件中有一个hz 10。默认一秒走10次回收,可以配置到1-500的范围,不建议超过100。
PS:即默认一秒走10次回收,redis一秒可以处理10万条数据,所以相比起来,一秒走十次不算什么

 

redis内存管理算法

具体有哪些算法?

Redis学习笔记8之内存管理,超时指令

LRU算法(即热点缓存):LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。

 

redis默认使用maxmemory-policy算法(最大内存策略)。弊端是:即当内存满了,只能读不能写。

改为采用volatile-lru算法。

LRU算法和TTL算法都不是精确的算法,而是一个近似的算法(近似LRU算法)。如果需要到精确,则需要按照使用的次数进行排序一系列的操作,这样必然会给回收过程中的系统性能大打折扣。

于是改为:通过采样的方式,结合LRU算法淘汰过期的键值对,进行回收。

Redis学习笔记8之内存管理,超时指令

PS:不够精确,权衡点是回收算法的性能

 

算法详细可参考:

https://www.cnblogs.com/linxiyue/p/10945216.html

 

 

相关文章: