谈谈面试题之Redis的过期键的删除策略与内存淘汰机制以及数据持久化

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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值