Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间。Redis的过期策略就是指当Redis中缓存的key过期了,Redis该如何处理?这个就涉及到了我们接下来所讲的Redis的过期键的删除策略了。
一、过期键的删除策略
1、定时删除
在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。
优点:对内存是最友好的。可以及时释放键所占用的内存。
缺点:对CPU不太友好。特别在过期键比较多的情况下,删除过期键会占用相当一部分CPU时间。同时在内存不紧张,CPU紧张的情况下,将CPU用在删除和当前业务不相关的过期键上,无疑会对服务器响应时间和吞吐量造成影响。
2、惰性删除
放任键过期不管,但是每次从键空间中读写键时,都会检查取得键是否过期。如果过期就删除该键,否则返回该键。(键空间是一个保存了数据库所有键值对的数据结构)
优点:对CPU最友好。只有在操作的时候进行检查,删除的目标仅限于当前需要处理的键,不会在删除其他无关本次操作的过期键上花费任何CPU时间。
缺点:对内存不友好。这个十分容易理解了,键过期了,但因为一直没有被访问到,所以一直保留着(除非手动执行flusdb来主动清空当前数据库的所有key),类似于内存泄漏。
3、定期删除
每隔一段时间,程序就对数据库进行检查,删除里面的过期键。至于要删除多少过期键,以及检查多少数据库,则有算法决定。该策略是上述两种策略的折中方案,需要通过实际情况,来设置删除操作的执行时长和频率。
明白了过期键的删除策略后,那redis服务器又是采用什么策略来删除过期键的呢?实际上,Redis服务器使用的是惰性删除和定期删除两种策略,通过配合使用,服务器可以很好的平衡CPU和内存。其中惰性删除为redis服务器内置策略。而定期删除可以通过一下两种方式设置:
1.配置redis.conf的hz选项,默认为10(即1秒执行10次,值越大说明刷新频率越快,对Redis性能损耗也越大)
2.配置redis.conf的maxmemory最大值,当已用内存超过maxmemory限定时,就会触发主动清理策略。
了解了Redis的过期键删除策略,是不是感觉Redis的安全性已经很高了。但是这实际上还是有问题的,如果定期删除漏掉了很多过期key,然后你也没有及时检查,也就没走惰性检查,此时会怎么样?如果大量过期key堆积在内存里,导致redis内存块耗尽了,咋整?答案是:走内存淘汰机制。
二、内存淘汰机制
redis内存淘汰机制有以下几个:
- noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。(这个实际工作场景没人用,太恶心了。)
- allkeys-lru:当内存不足以容纳新写入数据时,在键空间,移除最近最少使用的key。(工作中常用)
- allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。(随机删除,风险太大,可能把热键给删除,影响业务使用)
- volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key(这个一般不太合适)。
- volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
- volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。
尽管Redis有了内存淘汰机制,但是这种机制是牺牲部分数据为代价的。但是有时候我们并不希望牺牲数据怎么办?这个时候我们可以将数据持久化本地,等需要用的时候再从本地取就好了。
三、持久化机制(RDB与AOF机制)
RDB:Redis DataBase
在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩。
优点:
1、整个reids数据库将只包含一个文件dump.rdb,方便持久化。
2、容灾性好,方便备份。
3、性能持久化,fork子进程来完成写操作,让主进程继续处理命令,所以IO最大化。使用单独子进程来进行持久化,主进程不会进行任何IO操作,保证了redis的高性能。
4、相对于数据集大时,比AOF的启动效率更高。
缺点:
1、数据安全性低。RDB是间隔一段时间进行持久化,如果持久化之间redis发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候。
2、由于RDB是通过fork子进程来协助数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。
AOF:Append Only File
以日志的形式记录服务器所处理的么一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作。
优点:
1、数据安全,Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步。事实上,每秒同步也是异步完成的,其效率也是非常高的,所差的是一旦系统出现宕机现象,那么这一秒钟之内修改的数据会丢失。而每修改同步,我们可以将其视为同步持久化,即每次发生的数据变化都会被立即记录到磁盘。
2、通过append模式写文件,即使中途服务器宕机也不会破坏已存在的内容,可以通过redis-check-aof工具解决一致性问题。
3、AOF机制的rewrite模式,定期对AOF文件进行重写,以达到压缩的目的。
缺点:
1、AOF文件比RDB文件大,且恢复速度慢。
2、数据集大的时候,比RDB启动效率低。
3、运行效率没有RDB高。
总结:
1、AOF比RDB更安全也更大
2、RDB性能比AOF好
3、如果两个都配了优先加载AOF