Java面试题-Redis-第二天(Redis持久化、过期键删除策略、内存淘汰策略)

目录

一、Redis持久化机制

二、Redis过期键删除策略

三、Redis内存淘汰策略


一、Redis持久化机制

为了能重用Redis数据,防止系统故障造成数据丢失,我们就需要将Redis中的数据写入到磁盘中,也就是持久化

1. 有哪些方式

有rdb和aof两种方式

rdb指的是在指定的时间间隔内将数据集以快照的方式存入到磁盘中,它恢复时是将快照文件直接读取到内存中

它的特点是 对数据完整性和一致性要求不高的(因为如果在即将备份的时候还没备份的时候,Redis突然宕机了,那么就会丢失掉最后一次快照之后的所有修改) 另外是适合大规模的数据恢复,因为它是以快照的方式,恢复速度很快。同时它存入的快照也不大,省空间。但是它无法很好的保障数据不丢失....rdb的方式适合用来作备份

aof就是以日志的方式来记录每个写操作,将redis执行过程中所有的写指令都记录下来,只追加文件而不改写文件,Redis重启的时候会将日志文件中的内容从前往后执行一遍以完成数据的恢复工作。它的特点是因为是记录了每一条指令,其精度很高,即使如果出现了什么问题导致几条指令没有被记录下来,问题也不会很大,基本上也不会指令丢失,可以很好的将数据还原,能很好的保证数据的一致性和完整性,基本上数据不会丢失,但是它的缺点是:因为最后恢复的时候需要逐行执行命令,因此效率不高,恢复速度慢,另外就是对于相同的数据集,aof的方式产生的文件更大,另外就是因为是追加的方式,会造成文件越来越大,于是redis就新增的重写机制,当aof文件大小超过所设定的阈值时,Redis就会将aof文件内容进行压缩,只是保留可以恢复数据的最小指令集

2. 该如何选择

对数据完整性和一致性要求不那么高,但是对效率恢复速度有要求的,使用rdb的方式。甚至如果说对数据根本也就不那么敏感,并且能直接从其他地方重写生成补回的,可以关闭掉持久化

如果对数据一致性和完整性要高要求的,选择aof

如果是作内存数据库,那么建议两个都打开,能够兼得两种方式的好处。在Redis4.0的时候就对持久化机制作了优化:混合持久化的方式

也是一个aof文件,但是前半段是rdb格式的全量数据,后半段是aof格式的增量数据

它的优点很明显,集合了两种方式的优势

缺点是兼容性差,在4.0版本之前,都识别不了这个aof文件,同时前半段是rdb格式阅读性差

3. Redis持久化数据和缓存怎么做扩容

如果redis当作缓存使用,使用一致性hash实现动态扩容缩容

如果redis用作持久化存储数据库使用,必须使用固定的keys-to-nodes映射关系,也就是节点数量一旦确定就不能被修改。否则的话,如果是Redis节点需要动态变化,就必须使用可以在运行时进行数据再平衡的一套系统,当前只有redis集群可以做到这一点

二、Redis过期键删除策略

三种:

1. 定时删除

也就是在设置某个key的过期时间同时,创建一个定时器,让这个定时器在该过期时间到来时,立即执行删除操作

优点是对内存友好,能够保证内存中的key一旦过期就能立即删除

缺点是对cpu不友好,在过期键很多的时候,删除键是需要占用一部分cpu时间的,对服务器的吞吐量和响应时间造成了影响

2. 惰性删除

设置完key的过期时间后,我们不去管他,只有当我们需要使用它的时候,再去检查是否过期,再去进行删除

优点是对cpu友好,因为我只是会在使用它的时候才会去进行检查,对于很多用不到的key不用浪费时间去进行过期检查

缺点是:如果存在大量的key不去用它,那么这些键就会一直存在于内存中,永远不被删除,内存永远得不到释放,造成内存泄漏

3. 定期删除

也就是我隔一段时间去检查,删除过期的key

优点就是其实兼顾了定时删除和惰性删除的特点,可以通过限制删除操作的时长和频率来减少删除操作对cpu的影响。另外定期删除,也能够有效释放过期键占用的内存

缺点就是如果删除操作的时长和频率如果控制的不好,那么就会像定时删除和定期删除那样

三、Redis内存淘汰策略

redis不断删除一些过期数据,但是很多没有设置过期时间的数据也会越来越多,那么内存不够用的时候是怎么处理的呢?就是基于内存淘汰策略,删除掉一些不常用的数据,保证redis服务器正常运行

一共有8种

1. noeviction:这是默认策略,不会删除任何数据,拒绝所有写入操作并返回客户端oom的错误消息,redis只响应删和读操作

2. allkeys-lru:从所有的key使用lru算法进行淘汰(lru:最近最少使用算法)

3. allkeys-lfu:从所有的key中使用lfu算法进行淘汰(lfu:最不常用算法,根据使用频率计算,4.0版本新增的)

4. volatile-random:从设置了过期时间的key中随机的淘汰数据

5. volatile-lru:从设置了过期时间的key使用lru算法进行淘汰(lru:最近最少使用算法)

6. volatile-lfu:从设置了过期时间的key中使用lfu算法进行淘汰(lfu:最不常用算法,根据使用频率计算,4.0版本新增的)

7. volatile-random:从设置了过期时间的key随机的淘汰数据

8. volatile-ttl:从设置了过期时间的key中,淘汰即将过期的数据

你可能感兴趣的:(Redis,Java面试题,redis,java面试)