(2023打卡)每日两道面试题|一道算法题|7月6日
1.面试题
1.1.Redis持久化
1.1.1RDB
(Redis Database Backup File Redis数据备份文件)被叫做Redis数据快照。简单来说就是把内存中所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。
主动备份
[root@localhost`]# redis-cli
127.0.0.6379> save #由Redis主进程来执行RDB,会阻塞所有命令
127.0.0.6379> bgsave #开启子线程执行RDB,避免主进程收到影响
Redis内部有触发RDB的机制,可以再redis.conf文件中找到。
#900秒内,如果至少有1个key被修改,则执行bgsave
save 900 1
#300秒内,有10个key被修改,则执行bgsave
save 300 10
#60秒内,有10000个key被修改,则执行bgsave
save 60 10000
RDB的执行原理
bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据,完成fork后读取内存数据并写入RDB文件
fork采用的copy-on-write技术:写时拷贝
1.1.2.AOP
AOP全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录再AOF文件,可以看作是命令日志文件。
AOF默认是关闭的,需要修改redis.conf配置文件来开启AOF
#是否开启AOF功能,默认是no
appendonly yes
#AOF文件的名称
appendfilename ”appendonly.aof“
AOF的命令记录的频率也可以通过redis.conf文件来配
#表示每执行一次写命令,立即记录到AOF文件
appendfsync always
#写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写道AOF文件,是默认方案
appendfsync everysec
#写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no
配置项 | 刷盘时机 | 优点 | 缺点 |
---|---|---|---|
Always | 同步刷盘 | 可靠性高,几乎不丢数据 | 性能影响大 |
everysec | 每秒刷盘 | 性能适中 | 最多丢失1秒数据 |
no | 操作系统控制 | 性能最好 | 可靠性较差,可能丢失大量数据 |
因为是记录命令,AOF文件会比RDB文件大的多,而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF执行重写功能,用最少的命令达到相同效果。
Redis也会再触发阈值时自动去重写AOF文件。阈值也可以再redis.conf中配置
#AOF文件比上次文件,增长超过多少百分比则触发重写
autp-aof-rewrite-percentage 100
#AOF文件体积最小多大以上才触发重写
auto-aof-rewrite-min-size 64mb
总结(RDB和AOF)
RDB | AOF | |
---|---|---|
持久化方式 | 定时对整个内存做快照 | 记录每一次执行的命令 |
数据完整性 | 不完整,两次备份之间会丢失 | 相对完整,取决于刷盘策略 |
文件大小 | 会有压缩,文件体积小 | 记录命令,文件体积很大 |
宕机恢复速度 | 很快 | 慢 |
数据恢复优先级 | 低,因为数据完整性不如AOF | 高,因为数据完整性更高 |
系统资源占用 | 高,大量CPU和内存消耗 | 低,主要是磁盘IO资源 但AOF重写时会占用大量CPU和内存资源 |
使用场景 | 可以容忍数分钟的数据丢失,追求更快的启动速度 | 对数据安全性要求较高常见 |
面试题
redis作为缓存,数据的持久化是怎么做的?
这两种持久化方式有什么区别呢?
这两种方式,那种恢复的比较快呢?
答案
1.2.数据过期策略
redis中对于过期key删除的策略
1.2.1.惰性删除
设置该key过期时间后,我们不去管他,当需要该key时,我们再检查其是否过期,如果过期,我们就删掉他,反之返回该key。
优点 :对CPU友好,只会在使用该key时才会进行过期检查,对于很多用不到的key不用浪费时间进行过期检查
缺点 :对内存不友好,如果一个key已经过期,但是一直没有使用,那么该key就会一直存在内存中,内存永远不会释放
1.2.2.定期删除
每个一段时间,我们就对一些key进行检查,删除里面过期的key(从一定数量的数据库中取出一定数量的随机key进行检查,并删除其中的过期key)
定期有两种模式:
- SLOW模式是定时任务,执行频率默认为10hz,每次不超过25ms,以通过修改配置文件redis.conf的hz选项来调整这个次数
- FAST模式执行频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms
优点:可以通过限制删除操作执行的时长和频率来减少删除操作对CPU的影响,另外定期删除,也能有效释放过期键占用的内存。
缺点:难以确定删除操作执行的时长和频率
Redis的过期删除策略:惰性删除+定时删除两种策略进行配合使用
总结(数据过期策略)
惰性删除:访问key的时候判断是否过期,如果过期,则删除
定期删除:定期检查一定量的key是否过期(SLOW模式+FAST模式)
Redis的过期删除策略:惰性删除+定时删除两种策略进行配合使用
面试题
Redis的数据过期策略有那些?
答案
2.算法题
2.1.分析:
满足条件的只能是偶数,奇数拆分出来不满足条件,所以首先判断是否为偶数,如不是直接返回空数组,反之接下来就开始寻找拆分成最多数目的正偶数数组
代码分析
- 放置结果
- 奇数不满足,直接返回
- 把数据遍历出来,把最后一位数,换成数组中最后一位加上finalSum,因为前面一直再减finalSum,具体参考下图,以22为例,当i<=finalSum时停止遍历,也就是i=8 finialSum=2时,此时数组中最后一位是8,finialSum是2,因为结果不允许出现类似于2,2 4,4这种重复值所以当分解结果i>finialSum时,就会跳出循环,停止分解,以最后那个数为数组最后一位的结果
class Solution {
public List<Long> maximumEvenSplit(long finalSum) {
List<Long> res=new ArrayList<>();
if(finalSum%2>0){
return res;
}
for(long i=2;i<=finalSum;i+=2){
res.add(i);
finalSum-=i;
}
res.set(res.size()-1,res.get(res.size()-1)+finalSum);
return res;
}
}
2.2.使用技术重点:
通过一个for循环,层层分解,得到至少倒数第二位正偶数数组。
for(int i =2;i<=finalSum;i+=2)
最后一位则,通过for中的判断,分解不动的数字,修改数组中的最后一位。得到结果