Java面试题——Redis(1)

讨论了Redis缓存中缓存雪崩的概念,以及与缓存击穿的区别。提到使用Redis的读写锁和Redisson实现一致性,对比了RDB和AOF数据持久化方式,讨论了数据同步方法(如canal)和过期/淘汰策略(包括LRU和LFU)。
摘要由CSDN通过智能技术生成

f72a4170dfe9696f8fe899c8773cb592.jpeg

候选人:嗯!!缓存雪崩意思是设置缓存时采用了相同的过期时间,导致缓存在某一时刻同 时失效,请求全部转发到DB,DB 瞬时压力过重雪崩。与缓存击穿的区别:雪崩是很多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 文件中可以设置刷盘策略,我们当时设置的就是每秒批量写入一次命令 

面试官:Redis的数据过期策略有哪些 ?

候选人:嗯~,在redis中提供了两种数据过期删除策略 第一种是惰性删除,在设置该key过期时间后,我们不去管它,当需要该key 时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key。第二种是 定期删除,就是说每隔一段时间,我们就对一些key进行检查,删 除里面过期的key 定期清理的两种模式:SLOW模式是定时任务,执行频率默认为10hz,每次不超过25ms,以通过修改配 置文件redis.conf 的 hz 选项来调整这个次数 FAST模式执行频率不固定,每次事件循环会尝试执行,但两次间隔不低于2ms, 每次耗时不超过1ms Redis的过期删除策略:惰性删除 + 定期删除两种策略进行配合使用。 

面试官:Redis的数据淘汰策略有哪些 ?

候选人:嗯,这个在redis中提供了很多种,默认是noeviction,不删除任何数据,内 部不足直接报错 是可以在redis的配置文件中进行设置的,里面有两个非常重要的概念,一个 是LRU,另外一个是LFU LRU的意思就是最少最近使用,用当前时间减去最后一次访问时间,这个值 越大则淘汰优先级越高。LFU的意思是最少频率使用。会统计每个key的访问频率,值越小淘汰优先级 越高 我们在项目设置的allkeys-lru,挑选最近最少使用的数据淘汰,把一些经常 访问的key留在redis中

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

代码前哨站

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

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

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

打赏作者

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

抵扣说明:

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

余额充值