《Redis核心技术与实战》学习笔记
文章平均质量分 94
《Redis核心技术与实战》学习笔记
久违の欢喜
Stay hungry, Stay young
展开
-
03 | 高性能IO模型:为什么单线程Redis能那么快?
文章目录Redis核心技术与实战基础篇03 | 高性能IO模型:为什么单线程Redis能那么快?Redis 为什么用单线程?单线程 Redis 为什么那么快?基本 IO 模型与阻塞点非阻塞模式基于多路复用的高性能 I/O 模型Redis核心技术与实战基础篇03 | 高性能IO模型:为什么单线程Redis能那么快?Redis 是单线程,主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。 但 Redis 的其他功能,比如持久化、原创 2022-03-07 16:38:20 · 140 阅读 · 0 评论 -
40 | Redis的下一步:基于NVM内存的实践
Redis核心技术与实战未来篇40 | Redis的下一步:基于NVM内存的实践非易失存储(Non-Volatile Memory,NVM) 器件具有容量大、性能快、能持久化保存数据的特性,这些刚好就是 Redis 追求的目标。同时,NVM 器件像 DRAM 一样,可以让软件以字节粒度进行寻址访问,所以,在实际应用中,NVM 可以作为内存来使用,称为 NVM 内存。Redis 发展的下一步,就可以基于 NVM 内存来实现大容量实例,或者是实现快速持久化数据和恢复。NVM 内存的特性与使用模式Re原创 2021-12-27 15:55:31 · 651 阅读 · 0 评论 -
39 | Redis 6.0的新特性:多线程、客户端缓存与安全
Redis核心技术与实战未来篇39 | Redis 6.0的新特性:多线程、客户端缓存与安全Redis 6.0 中新增了 4 个关键新特性,分别是面向网络处理的多 IO 线程、客户端缓存、细粒度的权限控制,以及 RESP 3 协议的使用。面向网络处理的多 IO 线程可以提高网络请求处理的速度,而客户端缓存可以让应用直接在客户端本地读取数据,这两个特性可以提升 Redis 的性能。除此之外,细粒度权限控制让 Redis 可以按照命令粒度控制不同用户的访问权限,加强了 Redis 的安全保护。RESP原创 2021-12-27 15:20:42 · 682 阅读 · 0 评论 -
38 | 通信开销:限制Redis Cluster规模的关键因素
Redis核心技术与实战实践篇38 | 通信开销:限制Redis Cluster规模的关键因素原创 2021-12-27 10:52:11 · 253 阅读 · 0 评论 -
37 | 数据分布优化:如何应对数据倾斜?
Redis核心技术与实战实践篇37 | 数据分布优化:如何应对数据倾斜?数据倾斜有两类:数据量倾斜:在某些情况下,实例上的数据分布不均衡,某个实例上的数据特别多。数据访问倾斜:虽然每个集群实例上的数据量相差不大,但是某个实例上的数据是热点数据,被访问得非常频繁。如果发生了数据倾斜,那么保存了大量数据,或者是保存了热点数据的实例的处理压力就会增大,速度变慢,甚至还可能会引起这个实例的内存资源耗尽,从而崩溃。数据量倾斜的成因和应对方法当数据量倾斜发生时,数据在切片集群的多个实例上分布不均衡,原创 2021-12-24 17:49:14 · 1785 阅读 · 0 评论 -
36 | Redis支撑秒杀场景的关键技术和实践都有哪些?
Redis核心技术与实战实践篇36 | Redis支撑秒杀场景的关键技术和实践都有哪些?秒杀场景包含了多个环节,可以分成秒杀前、秒杀中和秒杀后三个阶段,每个阶段的请求处理需求并不相同,Redis 并不能支撑秒杀场景的每一个环节。秒杀场景的负载特征对支撑系统的要求第一个特征是瞬时并发访问量非常高。一般数据库每秒只能支撑千级别的并发请求,而 Redis 的并发处理能力(每秒处理请求数)能达到万级别,甚至更高。所以,当有大量并发请求涌入秒杀系统时,就需要使用 Redis 先拦截大部分请求,避免大量请求原创 2021-12-24 14:59:50 · 174 阅读 · 0 评论 -
35 | Codis VS Redis Cluster:我该选择哪一个集群方案?
Redis核心技术与实战实践篇35 | Codis VS Redis Cluster:我该选择哪一个集群方案?Codis 的整体架构和基本流程Codis 集群中包含了 4 类关键组件:codis server:这是进行了二次开发的 Redis 实例,其中增加了额外的数据结构,支持数据迁移操作,主要负责处理具体的数据读写请求。codis proxy:接收客户端请求,并把请求转发给 codis server。Zookeeper 集群:保存集群元数据,例如数据位置信息和 codis proxy 信原创 2021-12-24 11:58:24 · 379 阅读 · 0 评论 -
33 | 脑裂:一次奇怪的数据丢失
Redis核心技术与实战实践篇33 | 脑裂:一次奇怪的数据丢失问题主从集群有 1 个主库、5 个从库和 3 个哨兵实例,在使用的过程中,发现客户端发送的一些数据丢失,直接影响到了业务层的数据可靠性。所谓的脑裂,就是指在主从集群中,同时有两个主节点,它们都能接收写请求。 而脑裂最直接的影响,就是客户端不知道应该往哪个主节点写入数据,结果就是不同的客户端会往不同的主节点上写入数据。而且,严重的话,脑裂会进一步导致数据丢失。为什么会发生脑裂?最初发现的问题是:在主从集群中,客户端发送的数据丢失。为原创 2021-12-22 17:04:10 · 902 阅读 · 0 评论 -
32 | Redis主从同步与故障切换,有哪些坑?
Redis核心技术与实战实践篇32 | Redis主从同步与故障切换,有哪些坑?主从数据不一致假设主从库之前保存的用户年龄值是 19,但是主库接收到了修改命令,已经把这个数据更新为 20 ,但是,从库中的值仍然是 19。那么,如果客户端从从库中读取用户年龄值,就会读到旧值。因为主从库间的命令复制是异步进行的,所以才会出现这种情况。具体来说,在主从库命令传播阶段,主库收到新的写命令后,会发送给从库。但是,主库并不会等到从库实际执行完命令后,再把结果返回给客户端,而是主库自己在本地执行完命令后,就会向原创 2021-12-22 16:03:21 · 417 阅读 · 0 评论 -
31 | 事务机制:Redis能实现ACID属性吗?
Redis核心技术与实战实践篇31 | 事务机制:Redis能实现ACID属性吗?事务是指对数据进行读写的一系列操作。事务在执行时,会提供 ACID 属性保证,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。.........原创 2021-12-22 11:47:34 · 157 阅读 · 0 评论 -
30 | 如何使用Redis实现分布式锁?
Redis核心技术与实战实践篇30 | 如何使用Redis实现分布式锁?Redis 属于分布式系统,当有多个客户端需要争抢锁时,必须要保证这把锁不能是某个客户端本地的锁。 否则的话,其它客户端无法访问这把锁,当然也就不能获取这把锁。在分布式系统中,当有多个客户端需要获取锁时,需要分布式锁。此时,锁保存在一个共享存储系统中,可以被多个客户端共享访问和获取。Redis 本身可以被多个客户端共享访问,正好就是一个共享存储系统,可以用来保存分布式锁。而且 Redis 的读写性能高,可以应对高并发的锁操作场原创 2021-12-20 16:00:12 · 152 阅读 · 0 评论 -
29 | 无锁的原子操作:Redis如何应对并发访问?
Redis核心技术与实战实践篇29 | 无锁的原子操作:Redis如何应对并发访问?为了保证并发访问的正确性,Redis 提供了两种方法,分别是加锁和原子操作。加锁是一种常用的方法,在读取数据前,客户端需要先获得锁,否则就无法进行操作。当一个客户端获得锁后,就会一直持有这把锁,直到客户端完成数据更新,才释放这把锁。加锁有两个问题:一个是,如果加锁操作多,会降低系统的并发访问性能;第二个是,Redis 客户端要加锁时,需要用到分布式锁,而分布式锁实现复杂,需要用额外的存储系统来提供加解锁操作。原创 2021-12-20 11:17:49 · 226 阅读 · 0 评论 -
28 | Pika:如何基于SSD实现大容量Redis?
Redis核心技术与实战实践篇28 | Pika:如何基于SSD实现大容量Redis?应用 Redis 时,随着业务数据的增加(比如说电商业务中,随着用户规模和商品数量的增加),就需要 Redis 能保存更多的数据。可以使用 Redis 切片集群,把数据分散保存到多个实例上。但如果要保存的数据总量很大,但是每个实例保存的数据量较小的话,就会导致集群的实例规模增加,这会让集群的运维管理变得复杂,增加开销。可以通过增加 Redis 单实例的内存容量,形成大内存实例,每个实例可以保存更多的数据。但这也并原创 2021-12-15 11:35:25 · 260 阅读 · 0 评论 -
27 | 缓存被污染了,该怎么办?
Redis核心技术与实战实践篇27 | 缓存被污染了,该怎么办?在一些场景下,有些数据被访问的次数非常少,甚至只会被访问一次。当这些数据服务完访问请求后,如果还继续留存在缓存中的话,就只会白白占用缓存空间。这种情况,就是缓存污染。当缓存污染不严重时,只有少量数据占据缓存空间,此时,对缓存系统的影响不大。但是,缓存污染一旦变得严重后,就会有大量不再访问的数据滞留在缓存中。如果这时数据占满了缓存空间,再往缓存中写入新数据时,就需要先把这些数据逐步淘汰出缓存,这就会引入额外的操作时间开销,进而会影响应用的原创 2021-12-14 10:40:45 · 170 阅读 · 0 评论 -
26 | 缓存异常(下):如何解决缓存雪崩、击穿、穿透难题?
Redis核心技术与实战实践篇26 | 缓存异常(下):如何解决缓存雪崩、击穿、穿透难题?缓存雪崩缓存雪崩是指大量的应用请求无法在 Redis 缓存中进行处理,应用然后就将大量请求发送到数据库层,导致数据库层的压力激增。导致缓存雪崩的第一个原因:缓存中有大量数据同时过期,导致大量请求无法得到处理。解决方案:第一种方案:避免给大量的数据设置相同的过期时间。如果业务层的确要求有些数据同时失效,可以在用 EXPIRE 命令给每个数据设置过期时间时,给这些数据的过期时间增加一个较小的随机数(例如,原创 2021-12-13 15:54:34 · 295 阅读 · 0 评论 -
25 | 缓存异常(上):如何解决缓存和数据库的数据不一致问题?
Redis核心技术与实战实践篇25 | 缓存异常(上):如何解决缓存和数据库的数据不一致问题?缓存和数据库的数据不一致是如何发生的?这里的“一致性”包含了两种情况:缓存中有数据,那么,缓存的数据值需要和数据库中的值相同;缓存中本身没有数据,那么,数据库中的值必须是最新值。对于读写缓存来说,要想保证缓存和数据库中的数据一致,就要采用同步直写策略。 在业务应用中,要使用事务机制,来保证缓存和数据库的更新具有原子性,也就是说,两者要不一起更新,要不都不更新,返回错误信息,进行重试。否则,就无法实原创 2021-12-13 10:24:34 · 1185 阅读 · 0 评论 -
24 | 替换策略:缓存满了怎么办?
Redis核心技术与实战实践篇24 | 替换策略:缓存满了怎么办?设置多大的缓存容量合适?蓝线表示的是 “八二原理”,有 20% 的数据贡献了 80% 的访问,而剩余的数据虽然体量很大,但只贡献了 20% 的访问量,这 80% 的数据在访问量上就形成了一条长长的尾巴,称为 “长尾效应”。如果按照“八二原理”来设置缓存空间容量,也就是把缓存空间容量设置为总数据量的 20% 的话,就有可能拦截到 80% 的访问。红线上 80% 的数据贡献的访问量,超过了传统的长尾效应中 80% 数据能贡献的访问量原创 2021-12-10 15:27:50 · 210 阅读 · 0 评论 -
23 | 旁路缓存:Redis是如何工作的?
Redis核心技术与实战实践篇23 | 旁路缓存:Redis是如何工作的?缓存的特征计算机系统中,默认有两种缓存:CPU 里面的末级缓存,即 LLC,用来缓存内存中的数据,避免每次从内存中存取数据;内存中的高速页缓存,即 page cache,用来缓存磁盘中的数据,避免每次从磁盘中存取数据。跟内存相比,LLC 的访问速度更快,而跟磁盘相比,内存的访问是更快。所以,缓存的第一个特征:在一个层次化的系统中,缓存一定是一个快速子系统,数据存在缓存中时,能避免每次从慢速子系统中存取数据。 对应到原创 2021-11-24 17:09:10 · 1106 阅读 · 0 评论 -
21 | 缓冲区:一个可能引发“惨案”的地方
Redis核心技术与实战实践篇21 | 缓冲区:一个可能引发“惨案”的地方缓冲区的功能主要是:用一块内存空间来暂时存放命令数据,以免出现因为数据和命令的处理速度慢于发送速度而导致的数据丢失和性能问题。 但因为缓冲区的内存空间有限,如果往里面写入数据的速度持续地大于从里面读取数据的速度,就会导致缓冲区需要越来越多的内存来暂存数据。当缓冲区占用的内存超出了设定的上限阈值时,就会出现缓冲区溢出。如果发生了溢出,就会出现数据丢失。如果不给缓冲区的大小设置上限,会怎样?随着累积的数据越来越多,缓冲区占用内存原创 2021-11-22 17:05:14 · 1058 阅读 · 0 评论 -
20 | 删除数据后,为什么内存占用率还是很高?
Redis核心技术与实战实践篇20 | 删除数据后,为什么内存占用率还是很高?问题:删除数据,数据量已经不大了,为什么使用 top 命令查看时,Redis 依然占用了很多内存?因为当数据删除后,Redis 释放的内存空间会由内存分配器管理,并不会立即返回给操作系统。所以,操作系统仍然会记录着给 Redis 分配了大量内存。潜在的风险点:Redis 释放的内存空间可能并不是连续的,这些不连续的内存空间很有可能处于一种闲置的状态。这就会导致一个问题:虽然有空闲空间,Redis 却无法用来保存数据,不仅原创 2021-11-19 17:49:58 · 205 阅读 · 0 评论 -
18 - 19 | 波动的响应延迟:如何应对变慢的Redis?
Redis核心技术与实战实践篇18 - 19 | 波动的响应延迟:如何应对变慢的Redis?Redis 真的变慢了吗?方法一:查看 Redis 的响应延迟。Redis 命令的执行时间突然就增长到了几秒,基本就可以认定 Redis 变慢了。这种方法是看 Redis 延迟的绝对值,但是,在不同的软硬件环境下,Redis 本身的绝对性能并不相同。比如,在环境 A 中,当延迟为 1ms 时,判定 Redis 变慢了,但是环境 B 硬件配置高,那么,在环境 B 下,可能延迟是 0.2ms 的时候,就可以认原创 2021-11-19 11:39:31 · 460 阅读 · 0 评论 -
17 | 为什么CPU结构也会影响Redis的性能?
Redis核心技术与实战实践篇17 | 为什么CPU结构也会影响Redis的性能?主流的 CPU 架构一个 CPU 处理器中一般有多个运行核心,运行核心也称为物理核,每个物理核都可以运行应用程序。每个物理核都拥有私有的一级缓存(Level 1 cache,简称 L1 cache),包括一级指令缓存和一级数据缓存,以及私有的二级缓存(Level 2 cache,简称 L2 cache)。因为 L1 和 L2 缓存是每个物理核私有的,所以,当数据或指令保存在 L1、L2 缓存时,物理核访问它们的延迟原创 2021-11-16 16:07:18 · 996 阅读 · 0 评论 -
16 | 异步机制:如何避免单线程模型的阻塞?
Redis核心技术与实战实践篇16 | 异步机制:如何避免单线程模型的阻塞?影响 Redis 性能的 5 大方面的潜在因素,分别是:Redis 内部的阻塞式操作;CPU 核和 NUMA 架构的影响;Redis 关键系统配置;Redis 内存碎片;Redis 缓冲区。Redis 实例有哪些阻塞点?客户端:网络 IO,键值对增删改查操作,数据库操作;磁盘:生成 RDB 快照,记录 AOF 日志,AOF 日志重写;主从节点:主库生成、传输 RDB 文件,从库接收 RDB 文件、清空数原创 2021-11-15 16:47:02 · 1244 阅读 · 0 评论 -
15 | 消息队列的考验:Redis有哪些解决方案?
Redis核心技术与实战实践篇15 | 消息队列的考验:Redis有哪些解决方案?消息队列的消息存取需求消息队列在存取消息时,必须要满足三个需求,分别是消息保序、处理重复的消息和保证消息可靠性。需求一:消息保序对于要求消息保序的场景来说,一旦出现消息被乱序处理的情况,就可能会导致业务逻辑被错误执行,从而给业务方造成损失。需求二:重复消息处理消费者从消息队列读取消息时,有时会因为网络堵塞而出现消息重传的情况。此时,消费者可能会收到多条重复的消息。对于重复的消息,消费者如果多次处理,就可能造成一原创 2021-11-05 11:29:22 · 307 阅读 · 0 评论 -
14 | 如何在Redis中保存时间序列数据?
Redis核心技术与实战实践篇14 | 如何在Redis中保存时间序列数据?与发生时间相关的一组数据,就是时间序列数据。 这些数据的特点是没有严格的关系模型,记录的信息可以表示成键和值的关系(例如,一个设备 ID 对应一条记录),所以,并不需要专门用关系型数据库(例如 MySQL)来保存。而 Redis 的键值数据模型,正好可以满足这里的数据存取需求。时间序列数据的读写特点写的特点在实际应用中,时间序列数据通常是持续高并发写入。同时,时间序列数据的写入主要就是插入新数据,而不是更新一个已存在的原创 2021-11-03 11:38:10 · 966 阅读 · 0 评论 -
13 | GEO是什么?
Redis核心技术与实战实践篇13 | GEO是什么?还可以定义新的数据类型吗?面向 LBS 应用的 GEO 数据类型LBS(Location-Based Service,位置信息服务) 应用访问的数据是和人或物关联的一组经纬度信息,而且要能查询相邻的经纬度范围,GEO 非常适合应用在 LBS 服务的场景中。GEO 的底层结构GEO 类型的底层数据结构就是用 Sorted Set 来实现的。以叫车应用为例,用 Sorted Set 来保存车辆的经纬度信息时,Sorted Set 的元素是车辆原创 2021-10-30 11:04:26 · 781 阅读 · 0 评论 -
12 | 有一亿个keys要统计,应该用哪种集合?
Redis核心技术与实战实践篇12 | 有一亿个keys要统计,应该用哪种集合?原创 2021-10-28 16:32:51 · 163 阅读 · 0 评论 -
11 | “万金油”的String,为什么不好用了?
Redis核心技术与实战实践篇11 | “万金油”的String,为什么不好用了?原创 2021-10-15 15:32:13 · 614 阅读 · 0 评论 -
09 | 切片集群:数据增多了,是该加内存还是加实例?
Redis核心技术与实战基础篇09 | 切片集群:数据增多了,是该加内存还是加实例?原创 2021-10-14 16:34:22 · 231 阅读 · 0 评论 -
08 | 哨兵集群:哨兵挂了,主从库还能切换吗?
Redis核心技术与实战基础篇08 | 哨兵集群:哨兵挂了,主从库还能切换吗?一旦多个实例组成了哨兵集群,即使有一个哨兵实例出现故障挂掉了,其他哨兵还能继续协作完成主从库切换的工作,包括判定主库是不是处于下线状态,选择新主库,以及通知从库和客户端。在配置哨兵的信息时,只需要用到下面的这个配置项,设置主库的 IP 和端口,并没有配置其他哨兵的连接信息。sentinel monitor <master-name> <ip> <redis-port> <quor原创 2021-10-13 16:59:29 · 172 阅读 · 0 评论 -
07 | 哨兵机制:主库挂了,如何不间断服务?
Redis核心技术与实战基础篇07 | 哨兵机制:主库挂了,如何不间断服务?如果主库发生故障,直接会影响到从库的同步,因为从库没有相应的主库可以进行数据复制操作。而且,如果客户端发送的都是读操作请求,那还可以由从库继续提供服务,这在纯读的业务场景下还能被接受。但是,一旦有写操作请求,按照主从库模式下的读写分离要求,需要由主库来完成写操作。如果主库挂了,就需要运行一个新主库,比如说把一个从库切换为主库,把它当成主库。这就涉及到三个问题:主库真的挂了吗?该选择哪个从库作为主库?怎么把新主库的相关原创 2021-10-13 11:40:50 · 161 阅读 · 0 评论 -
06 | 数据同步:主从库如何实现数据一致?
Redis核心技术与实战基础篇06 | 数据同步:主从库如何实现数据一致?Redis 具有高可靠性,有两层含义:一是数据尽量少丢失,二是服务尽量少中断。AOF 和 RDB 保证了前者,而对于后者,Redis 的做法就是增加副本冗余量,将一份数据同时保存在多个实例上。Redis 提供了主从库模式,以保证数据副本的一致,主从库之间采用的是读写分离的方式。读操作:主库、从库都可以接收;写操作:首先到主库执行,然后,主库将写操作同步给从库。疑问:为什么要采用读写分离的方式呢?如果客户端对同一个数原创 2021-10-12 15:52:25 · 429 阅读 · 0 评论 -
05 | 内存快照:宕机后,Redis如何实现快速恢复?
Redis核心技术与实战基础篇05 | 内存快照:宕机后,Redis如何实现快速恢复?AOF 方法的好处是每次执行只需要记录操作命令,需要持久化的数据量不大。一般而言,只要采用的不是 always 的持久化策略,就不会对性能造成太大影响。用 AOF 方法进行故障恢复,需要逐一把操作日志都执行一遍。如果操作日志非常多,Redis 就会恢复得很缓慢,影响到正常使用。内存快照所谓内存快照,就是指内存中的数据在某一个时刻的状态记录。对 Redis 来说,它实现类似照片记录效果的方式,就是把某一时刻的状原创 2021-10-09 16:51:23 · 269 阅读 · 0 评论 -
04 | AOF日志:宕机了,Redis如何避免数据丢失?
Redis核心技术与实战基础篇04 | AOF日志:宕机了,Redis如何避免数据丢失?AOF 日志是如何实现的?AOF(Append Only File)日志是写后日志,“写后”的意思是 Redis 是先执行命令,把数据写入内存,然后才记录日志。AOF 里记录的内容*3”表示当前命令有三个部分,每部分都是由“$+数字”开头,后面紧跟着具体的命令、键或值。这里,“数字”表示这部分中的命令、键或值一共有多少字节。AOF 为什么要先执行命令再记日志?为了避免额外的检查开销,Redis 在向原创 2021-10-09 14:20:19 · 231 阅读 · 0 评论