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

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

2021-11-30
Redis 高性能主线 - 数据结构
高性能主线:包括线程模型、数据结构、持久化、网络框架; 高可靠主线:包括主从复制、哨兵机制; 高可扩展主线;包括数据分片、负载均衡。 一、键和值以什么结构组织?为了实现从键到值的快速访问,Redis 使用了一个哈希表来保存所有键值对。 当我们往哈希表中写入更多数据时,哈希冲突是不可避免的问题。Redis 解决哈希冲突的方式,就是链式哈希。 但是,这里依然存在一个问题,哈希冲突链上的元素只能通过指针逐一查找再操作。随着哈希表里写入的数据越来越多,哈希冲突可能也会越来越多,这就会导致某些哈希冲突链过长,进而导致这个链上的元素查找耗时长,效率下降。因此,redis 引入了 rehash 机制,来对哈希表进行扩容。 1. rehashrehash 的主要思路是增加现有的哈希桶数量,让逐渐增多的 entry 元素能在更多的桶之间分散保存,减少单个桶中的元素数量(缩短链表的长度),从而减少单个桶中的冲突。 具体到 Redis, 它默认使用了两个全局哈希表:哈希表1和哈希表2。一开始,当你刚插入数据时,默认使用哈希表1,此时的哈希表2并没有被分配空间。随着数据逐步增多,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 多路复用函数作为底层实现,选择顺序是,首先尝...

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