面试官: 说说线上Redis部署方案
当面试官问, 你们生产环境Redis是怎么部署的,, 通常需要结合高可用redis部署方案进行回答,
我来给大家讲下 种主流的、生产级的Redis架构方案:
单实例模式
首先, 最基础的 单实例模式。
优点是: 超级简单,零成本,部署起来分分钟搞定。
但缺点也非常致命:
它没有备份,服务器一断电,或者程序一崩,数据就可能丢了,服务也立马停掉。
它的内存和CPU,完全受限于单台服务器的配置,想扩容就只能加内存条,升级CPU,这叫“垂直扩展”,很快就会到天花板。
所以,单实例只适合做一些临时、非关键的任务,或者在开发环境里玩一玩。
主从+哨兵模式

那怎么解决单实例的可靠性问题呢?可以用 主从复制 + 哨兵。
这个架构就专业多了,它包含三种角色:
一个 主节点(Master):他是家里唯一的劳动力,所有“写”数据的操作都得经过它。
一个或多个 从节点(Slave):它们只负责从主节点那里同步数据,相当于做了个实时备份,可以分担“读”数据的压力。
还有几个 哨兵(Sentinel):它们就像是24小时待命的“保姆”,不存数据,只负责监控。一旦发现主节点“心跳停止”了,哨兵们就会立刻开会投票,从剩下的从节点里,选一个新的出来当老大,保证服务能自动恢复。
好处是: 实现了高可用,读请求也可以分流,性能更好了并且纯redis就可以实现无需第三方依赖。
坏处是: 它没解决内存容量的问题。所有数据还是一份完整的,主节点的内存瓶颈依然存在。
这个方案非常经典,适合那些数据量不大,但读操作特别多,而且对可用性要求很高的场景。
分片集群+一致性hash

为了解决单台机器内存不够用的问题,就有了 分片集群 的想法。
简单说,就是把数据打散,存到好几台Redis服务器上。你之前是一个书架装所有的书, 现在分几个书架装不同的书。A-H 放1号架,I-P 放2号架,Q-Z 放3号架。
那电脑怎么知道哪个数据该存哪台机器呢?它会通过一致性哈希算法。你可以把它想象成一个二的三十二次方的圆环。 主要分2步:
- 服务器上环: 先把你的3台服务器(比如叫Redis-A, Redis-B, Redis-C)各自的IP地址进行哈希计算,随机分布在这个圆环的几个点上。比如,A在2点位置,B在6点位置,C在10点位置。
2.数据上环,顺时针找家: 现在来了一本书,通过对key进行hash计算,它落在了4点的位置。它会 顺时针 走,遇到的第一个服务器是谁?是Redis-B(在6点位置)。好,这本书就存到Redis-B里。如果另一本书落在11点,它顺时针走,就会存到Redis-A(在2点位置)。
好处是: 机器不够可以随时加,容量能变得很大。
坏处是: 每次加减机器,牵连的数据要“搬家”,会有点麻烦, 而且数据可能分得不是很均匀。
Redis Cluster

为了提供一个更完善、更官方的分布式解决方案,Redis在3.0版本后正式推出了 Redis Cluster。
这是一个 去中心化 的架构。大家看图,整个集群由多个主节点(M1, M2, M3)组成,每个主节点还可以挂载自己的从节点(图中未画出,但实际部署时必须有)。它没有中心代理节点,客户端可以连接集群中的任意一个节点。
它的核心设计是 哈希槽 (Hash Slot)。Redis Cluster预设了16384个哈希槽,每个Key通过CRC16算法计算后,会映射到这16384个槽中的某一个。集群在启动时,会将这些槽均匀地分配给所有的主节点。例如,M1负责0-5460,M2负责5461-10922,以此类推。
当客户端向一个节点(比如M1)发送一个关于某个Key的命令时,如果这个Key所属的哈希槽正好由M1负责,M1就直接处理。如果发现这个Key属于M3,M1 会返回一个 MOVED 重定向指令,告诉客户端这个Key在M3上,客户端会缓存这个信息并重定向请求到M3。

节点之间通过 Gossip协议 互相通信,交换彼此的状态信息,从而维护整个集群。
优点:
官方方案,去中心化设计,避免了代理层的性能瓶颈。
数据按哈希槽分布,扩容和缩容非常方便,只需在节点间迁移哈希槽即可,过程自动化且对服务影响小。
内置高可用,每个主节点都有从节点,主节点宕机后会自动进行故障转移。
缺点:
Gossip协议会带来一定的网络开销。
对于需要操作多个Key的批量命令(如 mget, mset),如果这些Key分布在不同的哈希槽中,Redis Cluster的支持非常有限,需要客户端进行拆分处理。
怎么选?

挑一种适合你项目的解决方案
单实例:只适用于 开发测试 或个人项目,任何生产环境都不应使用。
主从+哨兵:适用于 数据量不大、并发要求不是极限高,但对高可用有明确要求的场景。特别是读多写少的业务,可以通过增加从节点来水平扩展读性能。
Redis Cluster:这是 官方推荐的、面向未来的首选分布式方案。适用于 海量数据、高并发 的场景。
至于一致性hash方案,他算是一种比较原始的方案,可以说是现代分布式缓存系统的基石。 但是还需要自己动手造轮子就没必要了。Redis Cluster 和 Codis可以看作是在一致性哈希思想基础上的重大改进和工程化落地。
希望通过今天的分享,大家对Redis的几种主流部署模式有了更清晰、更系统的认识。感谢大家的收听如果视频对你有帮助可以支持下!