当前位置:首页 > 问答 > 正文

Redis架构那些事儿,边学边用视频带你搞懂底层设计和实战技巧

(引用来源:视频开场白) “大家好,欢迎来到‘Redis架构那些事儿’,很多同学在用Redis的时候,可能只是停留在简单的set、get命令,但对于它底层是怎么工作的,为什么能这么快,以及在真正的大流量场景下怎么用才能不出问题,可能就比较模糊了,这个系列视频,我们就来一起钻进去,看看Redis的肚子里到底有什么乾坤。”

(引用来源:第一部分 - 为什么Redis这么快?) “首先要搞懂的第一个核心问题就是:Redis为什么能这么快?很多人第一反应是‘因为它基于内存’,没错,内存读写比磁盘快太多了,这是它的基础,但光有这个还不够。(引用来源:视频中画图解释)你看啊,如果每个请求来了,Redis都要去磁盘读写一下,那再快的内存也白搭,它的数据主要是在内存里操作的,但这又引出一个新问题:单线程怎么扛住高并发?

(引用来源:视频讲解单线程模型) 这里有个关键点,Redis的处理核心是单线程的,你可能会觉得奇怪,现在都多核时代了,为啥还用单线程?这不是瓶颈吗?恰恰相反,它避免了多线程带来的锁的竞争和上下文切换的消耗。(引用来源:比喻说明)你可以把它想象成一个办事极其高效的银行柜台,虽然只有一个柜员,但他速度极快,而且只办简单的业务(像存钱取钱这种纯内存操作),从不磨蹭,客户来的请求(网络IO)呢,由专门的接待员(IO多路复用机制)先排好队、整理好单子,然后柜员按顺序一口气处理掉,这样避免了多个柜员抢一个保险箱(数据)的麻烦,反而整体效率更高,这个‘接待员’就是Epoll、Kqueue这样的技术,它能同时监听成千上万个客户端的连接,哪个有活了就通知主线程,这才是高并发的关键。”

(引用来源:第二部分 - 数据是怎么存的和没的?) “了解了单线程模型,我们再看数据在Redis里是怎么安家的,最基础的就是这个(引用来源:动画展示数据结构)‘键值对’结构,但Redis的值可不是简单的字符串,它提供了五种核心数据结构:String(字符串)、List(列表)、Hash(哈希表)、Set(集合)、Sorted Set(有序集合),你用对了数据结构,性能天差地别,比如要存一个用户信息(姓名、年龄、城市),你用String一个个存三个key,就不如用一个Hash结构存成一个key,这样网络开销小,操作也方便。

(引用来源:讲解内存回收) 数据总不能只进不出吧?内存是有限的,所以得有淘汰策略,Redis提供了好几种策略让你选,比如LRU(最近最少使用)、LFU(最不经常使用)、随机淘汰等。(引用来源:实战建议)在实战中,你一定要根据业务特点设置maxmemory-policy,比如你是做缓存,那用LRU就很合适;如果你是做临时数据存储,设置过期时间TTL让数据自动过期删除可能更直接。”

(引用来源:第三部分 - 保证数据不丢:持久化机制) “下一个关键问题是:数据都在内存里,服务器要是突然断电或者宕机了,数据不就全没了吗?怎么保证数据不丢?这就是Redis的持久化机制要解决的问题,它提供了两种主要方案:

第一种叫RDB(快照),就像是给当前的内存数据拍一张全景照片,保存成一个压缩文件(dump.rdb)。(引用来源:比喻)好处是恢复起来特别快,因为直接把这个文件读进内存就行了,缺点是可能会丢数据,比如你设置5分钟拍一次,那宕机时可能就丢了最近5分钟的数据。

第二种叫AOF(追加日志),它不拍照,而是像个记账先生,把每一个写命令都记录在一个日志文件里。(引用来源:比喻)这样即使宕机,重启后把日志里的命令重新执行一遍,就能恢复数据,数据完整性高,但缺点是日志文件会越来越大,恢复速度也比RDB慢。

(引用来源:实战技巧)生产环境通常两者结合使用,用AOF来保证数据安全,同时定期用RDB来做一次快照备份,方便快速恢复和灾难备份。”

(引用来源:第四部分 - 扛不住怎么办?主从、哨兵和集群) “单机Redis再强,也有性能上限和单点故障的风险,这时候就需要扩展了,最简单的扩展是主从复制。(引用来源:架构图)就是一个主节点(Master)负责写,多个从节点(Slave)负责读和备份,主节点把数据变化同步给从节点,这样实现了读写分离,读压力可以分散出去。

但主节点挂了怎么办?这就需要哨兵(Sentinel)机制了。(引用来源:动画演示)哨兵是一个独立的进程,它像个监工,时刻盯着主节点和从节点,一旦发现主节点宕机了,它就会自动从从节点里选举出一个新的主节点,让其他从节点跟着新主节点,并通知客户端连接新的地址,这样就实现了高可用。

如果数据量非常大,一个节点内存装不下了,或者写操作太多一个主节点扛不住呢?那就得上Redis Cluster(集群)了。(引用来源:示意图)Cluster把数据分片存储在多个主节点上,每个主节点负责一部分数据槽(slot),数据自动分布,客户端可以连接任意节点,如果数据不在这个节点上,节点会告诉客户端正确的地址,这样既扩展了存储容量,也分摊了写压力。”

(引用来源:视频结尾总结) “所以你看,从单线程模型到数据结构,从持久化到高可用集群,Redis的架构设计是一环扣一环的,理解了这些底层设计,你在实战中才能做出正确的选择:比如什么时候该用哪种数据结构,缓存大小和淘汰策略怎么设,业务发展到什么阶段该引入主从、哨兵或者集群,希望这个视频能帮你不仅‘会用’Redis,更能‘懂’Redis,在实战中少踩坑,我们下期再见!”

Redis架构那些事儿,边学边用视频带你搞懂底层设计和实战技巧