Redis面试主题:过期回收

Redis的内存回收,主要围绕如下两个方面来进行:

①Redis过期策略:删除已经过期的数据;

②Redis淘汰策略:内存使用到达maxmemory上限时触发内存淘汰数据。

Redis过期策略

在Redis中,提供了expire命令设置一个键的过期时间,到期之后Redis会自动删除它,这个在我们的实际使用过程中用的非常多,Redis中设置过期时间有如下两种方式:

  ①expire命令:expire key seconds(先set key,然后设置过期时间。其中seconds 参数表示键的过期时间,单位为秒。expire 返回值为1表示设置成功,0表示设置失败或者键不存在)

  ②setex命令:setex key seconds value(设置键的同时,直接设置过期时间)

  expire命令的seconds单位为秒,最小精确至1秒,如果想要更精确的控制键的过期时间,可以使用pexpire命令,pexpire命令的单位是毫秒。pexpire key 1000 与expire key 1 相等

Redis键值过期删除原理

①消极方法(passive way):

在主键被访问时,如果发现它已经失效,那么就删除它。此处有一个问题就是:对于那些从未被查询过的key,即使它们已经过期,该方法也无法删除该过期key

 ②积极方法(active way):

周期性的从设置了失效时间的 key 中,选择一部分失效的 key 进行删除操作。因此Redis会周期性的随机测试一些key,已过期的key将会被删除。Redis每秒会进行10次操作,根据键的过期比例,使用快慢两种速率回收键,具体的流程:

  1.随机的测试20个带有timeout(过期时间)信息的key;

  2.删除其中已经过期的key;

  3.如果超过25%的key被删除,则重复执行步骤1

Redis淘汰策略

Redis的淘汰策略,是指当内存使用达到maxmemory极限时,需要使用LAU淘汰算法来决定清理掉哪些数据,以保证新数据的存入。

maxmemory用来设置redis存放数据的最大的内存大小,一旦超出这个内存大小之后,就会立即使用Redis的淘汰策略,来清理掉部分数据。

 对于64 bit的机器,如果maxmemory设置为0,那么就默认不限制内存的使用,直到耗尽机器中所有的内存为止;,但是对于32 bit的机器,有一个隐式的闲置就是3GB。

Redis淘汰默认的是noeviction策略,即当内存达到阈值的时候,所有引起申请内存的命令会报错。

共有如下8种淘汰策略:

   1.volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,使用LRU算法,移除最近最少使用的key;

   2.allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,使用LRU算法,移除最近最少使用的key;

   3.volatile-lfu:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,使用LFU算法,移除最近最少使用的key;

   4.allkeys-lfu:当内存不足以容纳新写入数据时,在键空间中,使用LFU算法,移除最近最少使用的key;

   5.volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key;

   6.allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key;

   7.volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除;

   8.noeviction(默认):当内存不足以容纳新写入数据时,新写入操作会报错。

You May Also Like

About the Author: daidai5771

发表评论

电子邮件地址不会被公开。 必填项已用*标注