Redis 详解
发表于|技术
被公司要求做一次技术分享,刚好很忙随手选了个缓存方面的题目。忙(拖)了N久之后,终于有闲心搞一搞了,顺便当总结八股文了,说不定以后还用得到。 这一个系列的笔记会持续的比较久,从极客时间上的《Redis 核心技术与实战》课程入手,计划着碰到什么啃什么吧,就当拓展知识面了,毕竟对于单身狗来说,别的啥没有,就是时间多。
三大主线
- 高性能主线:包括线程模型、数据结构、持久化、网络框架;
- 高可靠主线:包括主从复制、哨兵机制;
- 高可扩展主线;包括数据分片、负载均衡。
Redis 问题画像图
相关推荐

2022-03-15
Redis 高可靠主线 - 主从复制
我们总说的 Redis 具有高可靠性,其实有两层含义: 一是数据尽量少丢失 二是服务尽量少中断 AOF 和 RDB 保证了前者,而对于后者,Redis 的做法就是增加副本冗余量,将一份数据同时保存在多个实例上。即使有一个实例出现了故障,需要过一段时间才能恢复,其他实例也可以对外提供服务,不会影响业务使用。 多实例保存同一份数据,听起来好像很不错,但是,我们必须要考虑一个问题:这么多副本,它们之间的数据如何保持一致呢?数据读写操作可以发给所有的实例吗? 实际上,Redis 提供了主从库模式,以保证数据副本的一致,主从库之间采用的是读写分离的方式。读操作:主库、从库都可以接收;写操作:首先到主库执行,然后,主库将写操作同步给从库。 那么,主从库同步是如何完成的呢?主库数据是一次性传给从库,还是分批同步?要是主从库间的网络断连了,数据还能保持一致吗?本节我们就聊聊主从库同步的原理,以及应对网络断连风险的方案。 一、主从库间是如何同步的?当我们启动多个 Redis 实例的时候,它们相互之间就可以通过 replicaof 命令形成主库和从库的关系: 当然也可以直接在配置文件中配置: ...
2023-05-05
Redis 高可用主线 - 分片集群
一、分片集群分片集群(切片集群),就是指启动多个 Redis 实例组成一个集群,然后按照一定的规则,把收到的数据划分成多份,每一份用一个实例来保存。 在面向百万、千万级别的用户规模时,横向扩展的 Redis 分片集群会是一个非常好的选择。但是同时,又引申出来两个问题: 数据分片后,在多个实例之间如何分布? 客户端怎么确定想要访问的数据在哪个实例上? 从 3.0 开始,官方提供了一个名为 Redis Cluster 的方案,用于实现分片集群。Redis Cluster 方案中就规定了数据和实例的对应规则。 具体来说,Redis Cluster 方案采用哈希槽(Hash Slot,接下来我会直接称之为 Slot),来处理数据和实例之间的映射关系。在 Redis Cluster 方案中,一个分片集群共有 16384 个哈希槽(2^14),这些哈希槽类似于数据分区,每个键值对都会根据它的 key,被映射到一个哈希槽中。 具体的映射过程分为两大步:首先根据键值对的 key,按照 CRC16 算法计算一个 16 bit 的值;然后,再用这个 16bit 值对 16384 取模,得到 0~...

2022-02-08
Redis 高性能主线 - 持久化
目前,Redis 的持久化主要有两大机制,即 AOF(Append Only File)日志和 RDB 快照。 一、 AOF说到日志,我们比较熟悉的是数据库的写前日志(Write Ahead Log, WAL)(redolog,binlog等),也就是说,在实际写数据前,先把修改的数据记到日志文件中,以便故障时进行恢复。不过,AOF 日志正好相反,它是写后日志,“写后”的意思是 Redis 是先执行命令,把数据写入内存,然后才记录日志。 那 AOF 为什么要先执行命令再记日志呢?要回答这个问题,我们要先知道 AOF 里记录了什么内容。 传统数据库的日志,例如 redo log(重做日志),记录的是修改后的数据,而 AOF 里记录的是 Redis 收到的每一条命令,这些命令是以文本形式保存的。 我们以 Redis 收到“set testkey testvalue”命令后记录的日志为例,看看 AOF 日志的内容。其中,“*3”表示当前命令有三个部分,每部分都是由“$+数字”开头,后面紧跟着具体的命令、键或值。这里,“数字”表示这部分中的命令、键或值一共有多少字节。例如,“$3 set...

2021-12-29
Redis 高性能主线 – 线程模型&网络框架
在看这篇文章之前,需要先对 linux 的 epoll 模型有所了解。请参考: Linux IO 模型 IO 多路复用 Redis内置了一个高性能事件循环器,叫做AE。其定义和实现可以在ae*.h/cpp这些文件中找到。 事件驱动模型Redis 的事件驱动模型处理 2 类事件: 文件事件,如连接建立、接受请求命令、发送响应等; 时间事件,如 Redis 中定期要执行的统计、key 淘汰、缓冲数据写出、rehash等。 一、文件事件处理Redis 的文件事件采用典型的 Reactor 模式进行处理。Redis 文件事件处理机制分为 4 部分: 连接 socket IO 多路复用程序 文件事件分派器 事件处理器 虽然多个文件事件可能会并发出现,但 IO 多路复用程序总会将所有产生事件的 socket 放入一个队列中,通过这个队列,有序的把这些文件事件通知给文件分派器。 1. IO多路复用Redis 封装了 4 种多路复用程序,每种封装实现都提供了相同的 API 实现。编译时,会按照性能和系统平台,选择最佳的 IO 多路复用函数作为底层实现,选择顺序是,首先尝...