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

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

2021-12-28
Redis 高性能主线
三大主线 高性能主线:包括线程模型、数据结构、持久化、网络框架; 高可靠主线:包括主从复制、哨兵机制; 高可扩展主线;包括数据分片、负载均衡。 今天,我们来探讨一个很多人都很关心的问题:“为什么单线程的 Redis 能那么快?”首先,我要和你厘清一个事实,我们通常说,Redis 是单线程,主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的 一方面,Redis 的大部分操作在内存上完成,再加上它采用了高效的数据结构,例如哈希表和跳表,这是它实现高性能的一个重要原因。 另一方面,就是 Redis 采用了多路复用机制,使其在网络 IO 操作中能并发处理大量的客户端请求,实现高吞吐率 Redis单线程处理IO请求性能瓶颈主要包括2个方面: 1、任意一个请求在server中一旦发生耗时,都会影响整个server的性能,也就是说后面的请求都要等前面这个耗时请求处理完成,自己才能被处理到。耗时的操作包括以下几种: a、操作bigk...
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...