vlambda博客
学习文章列表

架构选型,究竟啥时候选redis?

redis是互联网分层架构中,最常用的KV缓存,但不少同学仍然不知道,为啥要选择redis。
画外音:与之对比最多的,是memcache。
 
一、复杂数据结构,选择redis更合适
value是哈希,列表,集合,有序集合这类复杂的数据结构时,会选择redis,因为mc无法满足这些需求。

最典型的场景,用户订单列表,用户消息,帖子评论列表等。
 
二、持久化,选择redis更合适
mc无法满足持久化的需求,只得选择redis。
但是,这里要提醒的是,真的使用对了redis的持久化功能么?
 
千万不要把redis当作数据库用
(1)redis的定期快照不能保证数据不丢失;
(2)redis的AOF会降低效率,并且不能支持太大的数据量;

不要期望redis做固化存储会比mysql做得好,不同的工具做各自擅长的事情,把redis当作数据库用,这样的设计八成是错误的。
 
缓存场景,开启固化功能,有什么利弊?
如果只是缓存场景,数据存放在数据库,缓存在redis,此时如果开启固化功能:

优点是 ,redis挂了再重启,内存里能够快速恢复热数据,不会瞬时将压力压到数据库上,没有一个cache预热的过程。

缺点是 ,在redis挂了的过程中,如果数据库中有数据的修改,可能导致redis重启后,数据库与redis的数据不一致。
 
因此,只读场景,或者允许一些不一致的业务场景,可以尝试开启redis的固化功能。
 
三、高可用,选择redis更合适
redis天然支持集群功能,可以实现主动复制,读写分离。

redis官方也提供了sentinel集群管理工具,能够实现主从服务监控,故障自动转移,这一切,对于客户端都是透明的,无需程序改动,也无需人工介入。
画外音:memcache,要想要实现高可用,需要进行二次开发,例如客户端的双读双写,或者服务端的集群同步。
 
但是,这里要提醒的是,大部分业务场景,缓存真的需要高可用么?
(1)缓存场景,很多时候,是允许cache miss;
(2)缓存挂了,很多时候可以通过DB读取数据;

所以,需要认真剖析业务场景,高可用,是否真的是对缓存的主要需求?
画外音:即时通讯业务中,用户的在线状态,就有高可用需求。
 
四、存储的内容比较大,选择redis更合适
memcache的value存储,最大为1M,如果存储的value很大,只能使用redis。

当然,redis与memcache相比, 由于底层实现机制的差异 也有一些“劣势”的情况。

情况一:由于内存分配机制的差异,redis可能导致内存碎片
memcache使用 预分配内存池 的方式管理内存,能够省去内存分配时间。
redis则是 临时申请空间 ,可能导致碎片。
从这一点上,mc会更快一些。
 
情况二:由于虚拟内存使用的差异,redis可能会刷盘影响性能
memcache把所有的数据存储在 物理内存 里。
redis有自己的 VM机制 ,理论上能够存储比物理内存更多的数据,当数据超量时,会引发swap,把冷数据刷到磁盘上。
从这一点上,数据量大时,mc会更快一些。
画外音:新版本redis已经优化。
 
情况三:由于网络模型的差异,redis可能会因为CPU计算影响IO调度
memcache使用 非阻塞IO复用模型 ,redis也是使用 非阻塞IO复用模型
但由于redis还提供一些非KV存储之外的排序,聚合功能,在执行这些功能时, 复杂的CPU计算,会阻塞整个IO调度
从这一点上,由于redis提供的功能较多,mc会更快一些。
 
情况四:由于线程模型的差异,redis难以利用多核特效提升性能
memcache使用 多线程 ,主线程监听,worker子线程接受请求,执行读写,这个过程中,可能存在锁冲突。
redis使用 单线程 ,虽无锁冲突,但难以利用多核的特性提升整体吞吐量。
从这一点上,mc会快一些。

情况五:由于缺乏auto-sharding,redis只能手动水平扩展
不管是redis还是memcache,服务端集群 没有天然支持水平扩展 ,需要在客户端进行分片,这其实对调用方并不友好。如果能服务端集群能够支持水平扩展,会更完美一些。

最后说一点, 可能是很多人喜欢redis的原因之一 源码可读性高,代码质量很高。

看过redis和memcache的源码,从可读性上说,redis是我见过代码最清爽的软件,甚至没有之一,或许简单是redis设计的初衷,编译redis甚至不需要configure,不需要依赖第三方库,一个make就搞定了。
 
而memcache源码,可能是考虑了太多的扩展性,多系统的兼容性,代码不清爽,看起来费劲。

例如网络IO的部分,redis源码1-2个文件就搞定了,mc使用了libevent,一个fd传过来传过去,又pipe又线程传递的,特别容易把人绕晕。  

末了,推荐一个马士兵教育的 直播课 redis终极训练营》。
画外音:只需2分钱参与,很多内容是全网首发。

马士兵老师是谁?
99年清华毕业,从程序员干到CTO,一直致力于推动Java、大数据、AI生根中国,免费教育倡导者,其高并发直播课程广受欢迎,有千万次播放学习。

课程价格:原价299,本号粉丝仅需 0.02 元。
画外音:2分钱买不了吃亏,买不了上当。

学习资料

长按扫码,联系助教老师领取资料(备注:888)

折扣较大,限200人


训练营第一天
1、redis的前世今生
2、redis支持什么类型的数据结构
3、redis的NIO&线程模型
4、redis究竟是多线程还是单线程

训练营第二天
1、redis的五大Value类型内核分析
2、10万用户一年365天的登录情况如何用redis存储,并快速检索任意时间窗内的活跃用户
3、细节见真知:计算向数据移动、而非数据向计算移动
4、linux系统的支持:fork、copy on write
5、redis的持久化:RDB、AOF、RDB&AOF混合使用

训练营第三天
1、AKF划分原则、CAP定理
2、redis的集群:主从、哨兵机制
3、redis的集群:分片集群
4、redis的集群:代理集群的横向对比

参加的小伙伴可获《多线程与高并发》

还有机会领取大奖
1、马士兵老师内部实体资料
2、机械键盘
3、小米蓝牙耳机

《Redis涨薪必备》
课程价格:原价299,本号粉丝仅需 0.02元

全程直播授课,长按扫码,入群参与

扫码添加助教,直播授课只需0.02元(备注:888)

折扣较大,限200人


再强调一遍,扫码:
(1)领书与电子书;
(2)领预习资料;
(3)参加“redis”在线直播课程;
限200人。

点击“ 阅读原文 ”, 0.02 元购课,4个小时,值得!