暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【面试专题】10)技术&架构提升系列:当问到:Redis原理

云世 2021-10-11
253

----- 学习笔记 -----


提及缓存,就不得不提 Redis,Redis 已经是现在使用最广泛的缓存中间件了,这一讲,以 Redis 的原理为切入点,带你了解在面试过程中那些与 Redis 原理有关的题目,帮你捋清答题思路,抓住重点。
【面试专题】|7)技术&架构设计提升系列:面试题目及解题的正确姿势

案例背景 

我们现在就模拟一场面试,假如我是面试官,你是候选人,我问你:

 

Redis 属于单线程还是多线程?

 

这道题其实就在考察 Redis 的线程模型(这几乎是 Redis 必问的问题之一)。

案例分析

很多初级研发工程师基本都知道 Redis 是单线程的,并且能说出 Redis 单线程的一些优缺点,比如,实现简单,可以在无锁的情况下完成所有操作,不存在死锁和线程切换带来的性能和时间上的开销,但同时单线程也不能发挥多核 CPU 的性能。

 

很明显,如果你停留在上面的回答思路上,只能勉强及格,因为对于这样一道经典的面试题,你回答得没有亮点,几乎丧失了机会。一个相对完整的思路应该基于 Redis 单线程,补充相关的知识点,比如:

 

 

问题+回复:


1

分库分表 + binlog 方式也不能保证在高并发场景下缓存和数据库一致性吧?假如主从同步有延迟,而且万一延迟还比较大呢,这个时候缓存和数据库就不一致了,这个该解决?

回复: 除了强事务,不能保证绝对的一致性,需要站在业务上对可用性和延迟做取舍,或者采用性能更到的存储介质


如何实现Redis和Mysql的数据一致性,有2种解决方案:

方案1:先删除缓存,后更新数据库

方案2: 方案1在高并发场景下还是会存在缓存与数据库不一致,所以将多线程并发操作缓存转换成单线程操作,这样就不会存在数据一致性的问题了,具体实现为: 创建一个线程池,每个线程绑定一个队列,多线程并发时,将更新和查询操作都封装成runable, 并且对要操作的数据进行Hash,将相同的数据都Hash到线程池里的同一个线程(如:线程A)上并入队列,然后线程A单线程的方式操作缓存和DB, 这样就不会存在数据一致性问题了。这是我想到的2种方案。在高并发场景下,如何保证缓存和DB的一致性,不知道还有没有其他的更好的方案


回复: 单线程总不会错,但是效率不能忍,即可以尝试分库分表 + binlog 的方式


3

基于cannel解析mysql binlog同步到redis基于MQ同步到redis

回复: 是一种方案


4

阿里云的redis是多线程的吧,这个原理是啥呢?怎么实现的呢?

回复: 不太了解阿里云的Redis,Redis最新版本是支持多线程的

 

5

频繁更新的数据怎样能保证ABA问题呢?

回复: Redis层面不存在,应用层面是存在的,解决方案可以在数据中加入版本号(version),对version设定一个约定,强制只能递增。 

往期推荐

关注 云世 微信公众号。

【面试专题】|1)技术&架构设计提升系列:当面试问到“架构设计”?》

【面试专题】|2)技术&架构设计提升系列:当面试问到“系统设计”?》

【面试专题】|3)技术&架构设计提升系列:当面试问到CAP?》

【面试专题】|4)技术&架构设计提升系列:当面试问到“分布式原理”?》

【面试专题】|5)技术&架构设计提升系列:当面试问到“事务一致性”?》

【面试专题】|6)技术&架构设计提升系列:当面试问到“分布式锁”?》

【面试专题】|7)技术&架构设计提升系列:当面试问到RPC?

 

如果你觉得这个系列有价值,也欢迎转发给有需要的朋友。


喜欢就|关注|转发|点赞|订阅专题吧
公号专题
【职场硬实力】:云原生」「微服务」「Service Mesh」「K8s」「Docker
【职场软实力】:职场养分」「职场软实力认知跨越


---END---

后台回复 “云技术” 领取送阿里云技术资料:阿里云云效DevOps解决方案|深入浅出Kubernetes|阿里云技术面试红宝书。回复 “java视频教程” 领取全网最全JAVA视频教程课。回复 “PPT” 领取海量面试资料和简历模板。



文章转载自云世,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论