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(默认):当内存不足以容纳新写入数据时,新写入操作会报错。