Java后端开发面试题篇——Redis

Redis的数据持久化策略有哪些

RDB的执行原理?

bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。 fork采用的是copy-on-write技术: 当主进程执行读操作时,访问共享内存; 当主进程执行写操作时,则会拷贝一份数据,执行写操作。

Java后端开发面试题篇——Redis_第1张图片

 因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。

Java后端开发面试题篇——Redis_第2张图片

什么是缓存穿透,怎么解决 什么是布隆过滤器

缓存穿透:查询一个不存在的数据,mysql查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库

解决方案一:缓存空数据,查询返回的数据为空,仍把这个空结果进行缓存

优点:简单 缺点:消耗内存,可能会发生不一致的问题

解决方案二:布隆过滤器

优点:内存占用较少,没有多余key

缺点:实现复杂,存在误判

误判率:数组越小误判率就越大,数组越大误判率就越小,但是同时带来了更多的内存消耗

用redisson实现布隆过滤器

什么是缓存击穿,怎么解决

缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮

解决方案一:互斥锁

Java后端开发面试题篇——Redis_第3张图片

解决方案二:逻辑过期

Java后端开发面试题篇——Redis_第4张图片

什么是缓存雪崩,怎么解决

缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力

解决方案: 给不同的Key的TTL添加随机值

利用Redis集群提高服务的可用性

给缓存业务添加降级限流策略

给业务添加多级缓存

redis双写问题

双写一致性:当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致

1、延迟双删

Java后端开发面试题篇——Redis_第5张图片

2、 

Java后端开发面试题篇——Redis_第6张图片

3、 

 Java后端开发面试题篇——Redis_第7张图片

Redis分布式锁如何实现、Redis实现分布式锁如何合理的控制锁的有效时长

redisson实现的分布式锁-可重入

主从一致性

RedLock(红锁):不能只在一个redis实例上创建锁,应该是在多个redis实例上创建锁(n / 2 + 1),避免在一个redis实例上加锁

Redis的数据删除策略有哪些

惰性删除:设置该key过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key

优点 :对CPU友好,只会在使用该key时才会进行过期检查,对于很多用不到的key不用浪费时间进行过期检查

缺点 :对内存不友好,如果一个key已经过期,但是一直没有使用,那么该key就会一直存在内存中,内存永远不会释放

定期删除:每隔一段时间,我们就对一些key进行检查,删除里面过期的key(从一定数量的数据库中取出一定数量的随机key进行检查,并删除其中的过期key)

优点:可以通过限制删除操作执行的时长和频率来减少删除操作对 CPU 的影响。另外定期删除,也能有效释放过期键占用的内存

缺点:难以确定删除操作执行的时长和频率

Redis的过期删除策略:惰性删除 + 定期删除两种策略进行配合使用

Redis的数据淘汰策略有哪些

Java后端开发面试题篇——Redis_第8张图片

Redis集群有哪些方案, 知道嘛

主从复制

哨兵模式

分片集群

Redis是单线程的,但是为什么还那么快?

Redis是纯内存操作,执行速度非常快

采用单线程,避免不必要的上下文切换可竞争条件,多线程还要考虑线程安全问题

使用I/O多路复用模型,非阻塞IO

你可能感兴趣的:(java,redis,开发语言)