(2023打卡)每日两道面试题|一道算法题|7月6日

(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)

RDBAOF
持久化方式定时对整个内存做快照记录每一次执行的命令
数据完整性不完整,两次备份之间会丢失相对完整,取决于刷盘策略
文件大小会有压缩,文件体积小记录命令,文件体积很大
宕机恢复速度很快
数据恢复优先级低,因为数据完整性不如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.分析:

满足条件的只能是偶数,奇数拆分出来不满足条件,所以首先判断是否为偶数,如不是直接返回空数组,反之接下来就开始寻找拆分成最多数目的正偶数数组

代码分析

  1. 放置结果
  2. 奇数不满足,直接返回
  3. 把数据遍历出来,把最后一位数,换成数组中最后一位加上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中的判断,分解不动的数字,修改数组中的最后一位。得到结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jacob_uln

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值