石家庄明确新冠最新研判,seo建站是什么,做网站毕设任务书,如何做一个导航网站redis 相关面试题#xff08;一#xff09; 文章目录 redis 相关面试题#xff08;一#xff09;**面试官**#xff1a;什么是缓存穿透 ? 怎么解决 ?**面试官**#xff1a;好的#xff0c;你能介绍一下布隆过滤器吗#xff1f;**面试官**#xff1a;什么是缓存击穿 …redis 相关面试题一 文章目录 redis 相关面试题一**面试官**什么是缓存穿透 ? 怎么解决 ?**面试官**好的你能介绍一下布隆过滤器吗**面试官**什么是缓存击穿 ? 怎么解决 ?**面试官**什么是缓存雪崩 ? 怎么解决 ?**面试官**redis做为缓存mysql的数据如何与redis进行同步呢双写一致性**面试官**那这个排他锁是如何保证读写、读读互斥的呢**面试官**你听说过延时双删吗为什么不用它呢**面试官**redis做为缓存mysql的数据如何与redis进行同步呢双写一致性**面试官**redis做为缓存数据的持久化是怎么做的**面试官**这两种持久化方式有什么区别呢**面试官**这两种方式哪种恢复的比较快呢 面试官什么是缓存穿透 ? 怎么解决 ?
候选人
嗯~~我想一下
缓存穿透是指查询一个一定不存在的数据如果从存储层查不到数据则不写入缓存这将导致这个不存在的数据每次请求都要到 DB 去查询可能导致 DB 挂掉。这种情况大概率是遭到了攻击。
解决方案的话我们通常都会用布隆过滤器来解决它
面试官好的你能介绍一下布隆过滤器吗
候选人
嗯是这样~
布隆过滤器主要是用于检索一个元素是否在一个集合中。我们当时使用的是redisson实现的布隆过滤器。
它的底层主要是先去初始化一个比较大数组里面存放的二进制0或1。在一开始都是0当一个key来了之后经过3次hash计算模于数组长度找到数据的下标然后把数组中原来的0改为1这样的话三个数组的位置就能标明一个key的存在。查找的过程也是一样的。
当然是有缺点的布隆过滤器有可能会产生一定的误判我们一般可以设置这个误判率大概不会超过5%其实这个误判是必然存在的要不就得增加数组的长度其实已经算是很划分了5%以内的误判率一般的项目也能接受不至于高并发下压倒数据库。
面试官什么是缓存击穿 ? 怎么解决 ?
候选人
嗯
缓存击穿的意思是对于设置了过期时间的key缓存在某个时间点过期的时候恰好这时间点对这个Key有大量的并发请求过来这些请求发现缓存过期一般都会从后端 DB 加载数据并回设到缓存这个时候大并发的请求可能会瞬间把 DB 压垮。
解决方案有两种方式
第一可以使用互斥锁当缓存失效时不立即去load db先使用如 Redis 的 setnx 去设置一个互斥锁当操作成功返回时再进行 load db的操作并回设缓存否则重试get缓存的方法
第二种方案可以设置当前key逻辑过期大概是思路如下
①在设置key的时候设置一个过期时间字段一块存入缓存中不给当前key设置过期时间
②当查询的时候从redis取出数据后判断时间是否过期
③如果过期则开通另外一个线程进行数据同步当前线程正常返回数据这个数据不是最新
当然两种方案各有利弊
如果选择数据的强一致性建议使用分布式锁的方案性能上可能没那么高锁需要等也有可能产生死锁的问题
如果选择key的逻辑删除则优先考虑的高可用性性能比较高但是数据同步这块做不到强一致。
面试官什么是缓存雪崩 ? 怎么解决 ?
候选人
嗯
缓存雪崩意思是设置缓存时采用了相同的过期时间导致缓存在某一时刻同时失效请求全部转发到DBDB 瞬时压力过重雪崩。与缓存击穿的区别雪崩是很多key击穿是某一个key缓存。
解决方案主要是可以将缓存失效时间分散开比如可以在原有的失效时间基础上增加一个随机值比如1-5分钟随机这样每一个缓存的过期时间的重复率就会降低就很难引发集体失效的事件。
面试官redis做为缓存mysql的数据如何与redis进行同步呢双写一致性
候选人嗯就说我最近做的这个项目里面有xxxx根据自己的简历上写的功能需要让数据库与redis高度保持一致因为要求时效性比较高我们当时采用的读写锁保证的强一致性。
我们采用的是redisson实现的读写锁在读的时候添加共享锁可以保证读读不互斥读写互斥。当我们更新数据的时候添加排他锁它是读写读读都互斥这样就能保证在写数据的同时是不会让其他线程读数据的避免了脏数据。这里面需要注意的是读方法和写方法上需要使用同一把锁才行。
面试官那这个排他锁是如何保证读写、读读互斥的呢
候选人其实排他锁底层使用也是setnx保证了同时只能有一个线程操作锁住的方法
面试官你听说过延时双删吗为什么不用它呢
候选人延迟双删如果是写操作我们先把缓存中的数据删除然后更新数据库最后再延时删除缓存中的数据其中这个延时多久不太好确定在延时的过程中可能会出现脏数据并不能保证强一致性所以没有采用它。
面试官redis做为缓存mysql的数据如何与redis进行同步呢双写一致性
候选人嗯就说我最近做的这个项目里面有xxxx根据自己的简历上写的功能数据同步可以有一定的延时符合大部分业务
我们当时采用的阿里的canal组件实现数据同步不需要更改业务代码部署一个canal服务。canal服务把自己伪装成mysql的一个从节点当mysql数据更新以后canal会读取binlog数据然后在通过canal的客户端获取到数据更新缓存即可。
面试官redis做为缓存数据的持久化是怎么做的
候选人在Redis中提供了两种数据持久化的方式1、RDB 2、AOF
面试官这两种持久化方式有什么区别呢
候选人RDB是一个快照文件它是把redis内存存储的数据写到磁盘上当redis实例宕机恢复数据的时候方便从RDB的快照文件中恢复数据。
AOF的含义是追加文件当redis操作写命令的时候都会存储这个文件中当redis实例宕机恢复数据的时候会从这个文件中再次执行一遍命令来恢复数据
面试官这两种方式哪种恢复的比较快呢
候选人RDB因为是二进制文件在保存的时候体积也是比较小的它恢复的比较快但是它有可能会丢数据我们通常在项目中也会使用AOF来恢复数据虽然AOF恢复的速度慢一些但是它丢数据的风险要小很多在AOF文件中可以设置刷盘策略我们当时设置的就是每秒批量写入一次命令 大家好我是xwhking一名技术爱好者目前正在全力学习 Java前端也会一点如果你有任何疑问请你评论或者可以加我QQ2837468248说明来意希望能够与你共同进步