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

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 多路复用函数作为底层实现,选择顺序是,首先尝...

2022-03-15
Redis 高可靠主线 - 主从复制
我们总说的 Redis 具有高可靠性,其实有两层含义: 一是数据尽量少丢失 二是服务尽量少中断 AOF 和 RDB 保证了前者,而对于后者,Redis 的做法就是增加副本冗余量,将一份数据同时保存在多个实例上。即使有一个实例出现了故障,需要过一段时间才能恢复,其他实例也可以对外提供服务,不会影响业务使用。 多实例保存同一份数据,听起来好像很不错,但是,我们必须要考虑一个问题:这么多副本,它们之间的数据如何保持一致呢?数据读写操作可以发给所有的实例吗? 实际上,Redis 提供了主从库模式,以保证数据副本的一致,主从库之间采用的是读写分离的方式。读操作:主库、从库都可以接收;写操作:首先到主库执行,然后,主库将写操作同步给从库。 那么,主从库同步是如何完成的呢?主库数据是一次性传给从库,还是分批同步?要是主从库间的网络断连了,数据还能保持一致吗?本节我们就聊聊主从库同步的原理,以及应对网络断连风险的方案。 一、主从库间是如何同步的?当我们启动多个 Redis 实例的时候,它们相互之间就可以通过 replicaof 命令形成主库和从库的关系: 当然也可以直接在配置文件中配置: ...

2022-03-31
Redis 高可靠主线 - 哨兵机制
上一篇文章,我们了解了主从库集群模式。在这个模式下,如果从库发生故障了,可以通过 psync/sync 重新进行同步。那么如果主库发生了故障,我们该怎么办呢? 这时候我们就需要一个新主库,比方说把一个从库切换为主库。这就涉及到三个问题: 主库真的挂了吗? 该选择哪个从库作为主库? 怎么把新主库的相关信息通知给从库和客户端呢? 为了解决这些问题,redis 引入了哨兵机制。在 Redis 主从集群中,哨兵机制是实现主从库自动切换的关键机制,它有效地解决了上面三个问题。 一、哨兵模式哨兵其实就是一个运行在特殊模式下的 Redis 进程,主从库实例运行的同时,它也在运行。哨兵主要负责的就是三个任务:监控、选主和通知 1. 监控监控是指哨兵进程在运行时,周期性地给所有的主从库发送 PING 命令,检测它们是否仍然在线运行。如果实例没有在规定时间内响应哨兵的 PING 命令,哨兵就会把它标记为“下线状态”;如果它是主库的话,哨兵就会判定主库下线,然后开始自动切换主库的流程。 1. 主观下线”和“客观下线”哨兵进程会使用 PING 命令检测它自己和主、从库的网络连接情况,用来判...

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...