目录
问题四: redis作为缓存,mysql的数据如何redis进行同步?(双写一致性)
业务场景一:那怎么保证双写一致呐?(一致性要求高的业务需求)
业务场景二:延迟一致怎么做?(允许短暂的不一致,实际开发中最为主流的)
编辑 问题六:假设redis的key过期之后,会立即删除吗?(数据过期策略)
问题七: 假如缓存过多,内存是有限的,内存被占满了怎么办?(数据淘汰策略)
1、数据库有1000万数据,Redis只能缓存20w数据,如何保证Redis中的数据都是热点数据?
以下问题包括知识点和面试题,看的时候直接看《模拟面试即可》,后续持续更新中。。。
一、项目中哪些地方使用了redis
一般这个问题要结合自己的实际项目经历回答,面试想这样问:一方面验证你的项目场景的真实性,二是为了作为深入发问的切入点
比如你回答了使用了:(可能会被问道的相关问题或知识点)
问题一:发生了缓存穿透该怎么解决?
以下是正常使用缓存的流程:
那么什么是缓存穿透呐?
那为什么会出现这种情况呐?
解决方案:
方案一:缓存空数据
方案二:布隆过滤器
模拟面试
问题二: 发生了缓存击穿该怎么解决?
什么是缓存击穿?
解决方案:
方案一:互斥锁
方案二:逻辑过期
模拟面试
问题三: 发生了缓存雪崩该怎么解决?
什么是缓存雪崩?
解决方案:
模拟面试:
问题四: redis作为缓存,mysql的数据如何redis进行同步?(双写一致性)
这个时候我们就要考虑是先删除缓存,还是先修改数据库?
情况一:先删除缓存,再操作数据库
正常情况:
不正常情况:因为线程是交替执行的,这种方式可能会出现脏数据的现象
情况二:先操作数据库,再删除缓存
正常情况:
不正常情况:这种方式可能会出现脏数据的现象
那么为什么要删除两次缓存?
为什么要延时删除?
业务场景一:那怎么保证双写一致呐?(一致性要求高的业务需求)
但是这样的话,性能就有点差了
当然我们都是知道的,放入redis的数据一般都是读多写少
所以使用读写锁就可以了
特点:强一致,性能差(强一致性情况下才会使用)
业务场景二:延迟一致怎么做?(允许短暂的不一致,实际开发中最为主流的)
方案一:基于MQ的异步通知
方案二:基于Canal的异步通知
模拟面试
强一致性回答:
最终一致性回答:
问题五:redis作为缓存,数据的持久化是怎么做的?
RDB
什么是RDB呐?
人工主动备份:
Redis自动备份:
Redis内部有触发RDB的机制,可以再redis.conf文件中找到,格式如下:
RDB的执行原理:
AOF
什么是AOF呐?
优点:
缺点:
Redis也会在触发阈值时自动去重写AOF文件。阈值也可以在redis.conf中配置:
RDB与AOD对比
模拟面试
问题六:假设redis的key过期之后,会立即删除吗?(数据过期策略)
什么是数据过期策略呐?
惰性删除
定期删除
什么是定期删除呐?
定期清理的两种模式
Redis的过期删除策略:惰性删除 + 定期删除两种策略进行配合使用
模拟面试
问题七: 假如缓存过多,内存是有限的,内存被占满了怎么办?(数据淘汰策略)
什么是数据淘汰策略?
LRU例子:key1是在3s之前访问的,key2是在9s之前访问的,删除的就是key2
LFU例子:key1最近5s访问了4次,key2最近5s访问了9次,删除的就是key1
关于数据淘汰策略其他的面试问题?
1、数据库有1000万数据,Redis只能缓存20w数据,如何保证Redis中的数据都是热点数据?
2、Redis的内存用完了会发生什么?
模拟面试
以上问题都是基于你的项目:redis使用的场景是缓存这部分;下面则是基于你的项目redis使用场景是分布式锁
问题八:redis分布式锁,是如何实现的?
情景模拟———抢券执行
正常情况:
异常情况:
当线程1执行完,此时的库存是0,当线程2执行完之后,库存再减一,就变成-1了,就会出现超卖的情况
加锁操作:
适用于单体项目,服务只部署在一台服务器上的,这个方法是没问题的,但是往往我们的服务都是集群的
分布式锁解决这个问题:
、
redis分布式锁
Redis实现分布式锁如何合理的控制锁的有效时长?
redisson实现的分布式锁——执行流程
实例代码:
redisoon实现的分布式锁,是否可以重入呐?
可重入,利用hash结构记录线程id和重入次数
redisson实现的分布式锁——主从一致性
模拟面试
下面则是redis其他的问题