课程地址:新版Java面试专题视频教程,java八股文面试全套真题+深度详解(含大厂高频面试真题)_哔哩哔哩_bilibili
课程名称:新版Java面试专题视频教程,java八股文面试全套真题+深度详解(含大厂高频面试真题)
一、面试准备
二、Redis
Redis的面试占很大篇幅,很重要。
1. 布隆过滤器:
1. 自己写
- 布隆过滤器_百度百科 (这里有自己写的java代码实现布隆过滤器)
2. Google 开发著名的 Guava 库(单机、内存)
- 【项目实践03】【布隆过滤器】-CSDN博客
- https://juejin.cn/post/6844904007790673933?searchId=202404272300043574EFFB0E7CD94BEB09
- 布隆过滤器介绍及实战应用(防止缓存穿透)_布隆过滤器实战-CSDN博客
3. Redisson实现(适用分布式)
- 最牛一篇布隆过滤器详解-腾讯云开发者社区-腾讯云
- Redis详解(十三)------ Redis布隆过滤器-腾讯云开发者社区-腾讯云
- https://juejin.cn/post/7355011549827350555?searchId=202404272300043574EFFB0E7CD94BEB09
- 布隆过滤器-腾讯云开发者社区-腾讯云
- 【Redisson】Redisson--布隆(Bloom Filter)过滤器_redisson布隆过滤器-CSDN博客
2. 缓存击穿概念&解决方案
常见的解决方案有两种:
互斥锁:给重建缓存逻辑加锁,避免多线程同时指向
逻辑过期:热点key不要设置过期时间,在活动结束后手动删除。
缓存击穿实现代码:
- Redis 缓存击穿问题及解决方案_Redis_脚本之家
- 缓存穿透、雪崩、击穿实践-腾讯云开发者社区-腾讯云
3. 双写一致
总结:
- 第一种方案:更新数据之后删除缓存,并为缓存设置过期时间。(延迟双删也有不一致风险,反而增加了业务复杂性:黑马微服务课程2-CSDN博客);
- 第二种方案:采用Redisson提供的读写锁,强一致,性能低,只有要求强一致的场景采用;
- 第三种方案:最终一致方案,使用MQ中间件。
- 第四种方案:canal中间件,最终一致方案。
4. 持久化
1)RDB的执行原理?
bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。 fork采用的是copy-on-write技术: 当主进程执行读操作时,访问共享内存; 当主进程执行写操作时,则会拷贝一份数据,执行写操作。
2)AOF vs RDB
RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。
AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。
AOF默认是关闭的。AOF的命令记录的频率也可以通过redis.conf文件来配。
因为是记录命令,AOF文件会比RDB文件大的多,通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,进行文件压缩。Redis也会在触发阈值时自动去重写AOF文件。阈值也可以在redis.conf中配置:
5. 数据过期策略
假如redis的key过期之后,会立即删除吗?
- 惰性删除:访问key的时候判断是否过期,如果过期,则删除;
- 定期删除:定期检查一定量的key是否过期( SLOW模式+ FAST模式)
- Redis的过期删除策略:惰性删除 + 定期删除两种策略进行配合使用
6. 数据淘汰策略
假如缓存过多,内存是有限的,内存被占满了怎么办?
- Redis提供了8种不同的数据淘汰策略,默认是noeviction不删除任何数据,内存不足直接报错
- LRU:最少最近使用。用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高
- LFU:最少频率使用。会统计每个key的访问频率,值越小淘汰优先级越高
- 平时开发过程中用的比较多的就是allkeys-lru(结合自己的业务场景)
数据淘汰策略-使用建议
- 优先使用 allkeys-lru 策略。充分利用 LRU 算法的优势,把最近最常访问的数据留在缓存中。如果业务有明显的冷热数据区分,建议使用。
- 如果业务中数据访问频率差别不大,没有明显冷热数据区分,建议使用 allkeys-random,随机选择淘汰。
- 如果业务中有置顶的需求,可以使用 volatile-lru 策略,同时置顶数据不设置过期时间,这些数据就一直不被删除,会淘汰其他设置过期时间的数据。
- 如果业务中有短时高频访问的数据,可以使用 allkeys-lfu 或 volatile-lfu 策略。
关于数据淘汰策略其他的面试问题
1)数据库有1000万数据 ,Redis只能缓存20w数据, 如何保证Redis中的数据都是热点数据 ?
- 使用allkeys-lru(挑选最近最少使用的数据淘汰)淘汰策略,留下来的都是经常访问的热点数据。
2)Redis的内存用完了会发生什么?
- 主要看数据淘汰策略是什么?如果是默认的配置( noeviction ),会直接报错。
7. 分布式锁
redis分布式锁,是如何实现的?
需要结合项目中的业务进行回答,通常情况下,分布式锁使用的场景: 集群情况下的定时任务、抢单、幂等性场景。
1)抢券:加synchronized可以吗?
如果是单体项目,并且只启动了一台服务,synchronized锁是没问题的。但如果集群部署,也就是将同一份代码部署在多台服务器上,synchronized就不行了。synchronized属于本地锁,JVM锁,只能解决同一JVM下线程的互斥,无法解决多个JVM下线程的互斥,所以在集群下,就不能使用本地锁了,只能使用外部锁解决(分布式锁)。
2)Redis分布式锁setnx
- 死锁问题 -> 设置失效时间;
- 锁的失效时长不好控制 -> 自动续期(看门狗线程);
- 释放别人的锁 -> 设置锁key对应的UUID的value值;
3)Redisson分布式锁