【redis学习之四】Redis的过期键处理及键淘汰策略

    在redis中可以通过如下命令设置键的生存时间或生命周期:

EXPIRE  KEY  TTL 命令用于将key的生存时间设置为ttl秒
PEXPIRE  KEY  TTL  命令用于将key的生存时间设置为ttl毫秒
EXPIREAT  KEY  TIMESTAMP  命令用于将key的过期时间设置为timestamp所指定的秒数时间戳
PEXPIREAT  KEY  TIMESTAMP  命令用于将key的过期时间设置为timestamp所指定的毫秒时间戳 
PERSIST  KEY  移除key的过期时间

    实际上这四个命令在最终执行的时候都会转化成pexpire命令来执行    

Redis是如何判断一个键过期的呢?    

    在redis中维护了一个expires字典,里面保存了数据库中所有设置了过期时间的键的过期时间,称为过期字典。我们可以用ttl(time to live)命令去查看key的剩余生存秒数,也可以用pttl查看key的剩余生存毫秒数,过程即是拿着key去expires字典中获取到key的过期毫秒时间戳,再减去当前时间戳,即可得到key的剩余生存时间。

    而判断key是否过期,也是通过过期字典来完成的:

    ①首先检查给定键是否存在于过期字典中,若存在则取得键的过期时间

    ②检查当前UNIX时间戳是否大于键的过期时间,如果是的话则键已过期,若否则未过期

Redis的过期键删除策略:

    如果一个键过期了那肯定是需要删除的,否则留在仍然留在内存中会导致取到过期数据,同时也浪费内存,那它什么时候会被删除呢?有两种策略:

    ①惰性删除策略:程序在取出键时才对key进行过期检查,若过期则删除,否则照常执行,这个策略对cpu是友好的,因为不用额外的线程去自动清理过期key,但是是对内存不友好的,因为如果一直没有对这些过期键进行获取的话,这些键会一直留在内存中,造成垃圾数据内存泄漏

    ②定期删除策略:每隔一段时间执行一次删除过期键的操作,并通过限制删除操作执行的时常和频率来减少删除操作对cpu时间的影响

Redis综合了这两种策略来实现过期键的删除:

1、首先所有读写数据库的redis命令在执行之前都会对输入键通过过期字典进行检查,如果已过期则将key删除,然后再执行请求命令,该返回空返回空,该set值set值;

2、redis还实现了定期删除策略,在规定的时间内,分多次遍历服务器的各个数据库,从数据库的expires字典中随机抽查一部分键的过期时间,并删除其中过期键

通过两种策略的结合,redis实现了过期键删除的时间与空间的平衡。

内存不足时Redis的键淘汰策略:

    redis在32位系统有最大内存限制3G,但是在64位系统并未有限制,因此我们需要在redis.conf文件中设置其最大占用内存值,否则将无限制使用内存甚至把服务器撑爆。设置方法如下:

maxmemory 100mb

    当内存达到设置的最大值之后,再次进行写操作,redi会首先根据配置的键淘汰策略尝试淘汰数据,释放空间;若是未设置淘汰策略或是根据淘汰策略仍不能清理出空间,则拒绝写操作,但是读操作并不影响。

    因此,我们在设置了最大使用内存后还得配置合适的键淘汰策略,以使redis服务更高可用。根据redis.conf注释我们知道键淘汰策略有如下几种:

volatile-lru:使用LRU算法进行数据淘汰(淘汰上次使用时间最早的,且使用次数最少的key),只淘汰设定了有效期的key
allkeys-lru:使用LRU算法进行数据淘汰,所有的key都可以被淘汰
volatile-random:随机淘汰数据,只淘汰设定了有效期的key
allkeys-random:随机淘汰数据,所有的key都可以被淘汰
volatile-ttl:淘汰剩余有效期最短的key

    redis默认的淘汰策略为noeviction,即不淘汰,显然是不行的,我们需要根据不同的应用场景配置不同的淘汰策略。推荐使用volatile-lru,对于很重要的、更新又不频繁的数据不应该设置过期时间,而对于更新频率较高,或是对一致性要求较高的数据可以设置过期时间,然后通过volatile-lru,对于这些设置了过期时间的键值,通过least-recently-used最近不常使用的规则进行删除,保留热点数据,提高缓存命中率。

    需要注意的是,如果是redis集群配置了主从复制的话,maxmemory不能设置得跟服务器主机内存太接近,因为主从复制将占用一部分内存,最好保证一定的内存余量。





猜你喜欢

转载自blog.csdn.net/smartValentines/article/details/80616652