----- 学习笔记 -----
案例背景
我们现在就模拟一场面试,假如我是面试官,你是候选人,我问你:
Redis 属于单线程还是多线程?
这道题其实就在考察 Redis 的线程模型(这几乎是 Redis 必问的问题之一)。
案例分析
很多初级研发工程师基本都知道 Redis 是单线程的,并且能说出 Redis 单线程的一些优缺点,比如,实现简单,可以在无锁的情况下完成所有操作,不存在死锁和线程切换带来的性能和时间上的开销,但同时单线程也不能发挥多核 CPU 的性能。
很明显,如果你停留在上面的回答思路上,只能勉强及格,因为对于这样一道经典的面试题,你回答得没有亮点,几乎丧失了机会。一个相对完整的思路应该基于 Redis 单线程,补充相关的知识点,比如:





























问题+回复:
1
分库分表 + binlog 方式也不能保证在高并发场景下缓存和数据库一致性吧?假如主从同步有延迟,而且万一延迟还比较大呢,这个时候缓存和数据库就不一致了,这个该解决?
回复: 除了强事务,不能保证绝对的一致性,需要站在业务上对可用性和延迟做取舍,或者采用性能更到的存储介质
2
如何实现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?》
如果你觉得这个系列有价值,也欢迎转发给有需要的朋友。

---END---




