redis过期删除

redis的过期删除策略是:惰性删除和定期删除配合使用。

1.定期删除

由redis.c/activeExpireCycle 函数实现,函数每秒运行10次,每次运行时,都从一定数量的数据库中取出一定数量的随机键进行检查,并删除其中的过期键。可以通过修改配置文件redis.conf 的 hz 选项来调整这个次数,但是不建议将这个值设置超过 100,否则会对CPU造成比较大的压力。
因为key太多,如果全盘扫描所有的key会非常耗性能,所以是随机抽取一些key来删除。这样就有可能删除不完,需要惰性删除配合。

2.惰性删除

Redis的惰性删除策略由 db.c文件下expireIfNeeded 函数实现,所有键读写命令执行之前都会调用 expireIfNeeded 函数对其进行检查,如果过期,则删除该键,然后执行键不存在的操作;未过期则不作操作,继续执行原有的命令。

我们看到,通过过期删除策略,对于某些永远使用不到的键,并且多次定期删除也没选定到并删除,那么这些键同样会一直驻留在内存中,又或者在Redis中存入了大量的键,这些操作可能会导致Redis内存不够用,这时候就需要Redis的内存淘汰策略了。

redis内存淘汰策略

1.设置redis的最大内存
在配置文件redis.conf 中,可以通过参数 maxmemory 来设定最大内存,不设定该参数默认是无限制的,但是通常会设定其为物理内存的四分之三。

2.设置内存淘汰策略
当现有内存大于 maxmemory 时,便会触发redis主动淘汰内存方式,通过设置 maxmory-policy ,有如下几种淘汰方式:

  • (1).noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。默认策略
  • (2).volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。 (LRU:最近使用 Least Recently Used )
  • (3).allkeys-lru:利用LRU算法移除任何key (和上一个相比,删除的key包括设置过期时间和不设置过期时间的)。通常使用该方式。
  • (4).allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
  • (5).volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
  • (6).volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。

持久化时处理过期

Redis的两种持久化策略:RDB和AOF。在持久化和数据恢复阶段,对过期key也有一些特殊的处理。

RDB

从内存数据库持久化数据到RDB文件:持久化key之前,会检查是否过期,过期的key不进入RDB文件 从RDB文件恢复数据到内存数据库:数据载入数据库之前,会对key先进行过期检查,如果过期,不导入数据库。

AOF

从内存数据库持久化数据到AOF文件:当key过期后,还没有被删除,此时进行执行持久化操作(该key是不会进入aof文件的,因为没有发生修改命令)
当key过期后,在发生删除操作时,程序会向aof文件追加一条del命令(在将来的以aof文件恢复数据的时候该过期的键就会被删掉)。

总结

Redis过期删除策略是采用惰性删除和定期删除这两种方式组合进行的,惰性删除能够保证过期的数据我们在获取时一定获取不到,而定期删除设置合适的频率,则可以保证无效的数据及时得到释放,而不会一直占用内存数据。
但是我们说Redis是部署在物理机上的,内存不可能无限扩充的,当内存达到我们设定的界限后,便自动触发Redis内存淘汰策略,而具体的策略方式要根据实际业务情况进行选取。