Redis
文章平均质量分 85
洒脱的耿
这个作者很懒,什么都没留下…
展开
-
Redis如何避免数据丢失和如何实现数据快速恢复(持久化机制)
目前,Redis 的持久化主要有两大机制,即 AOF(Append Only File)日志和 RDB 快照。AOF日志说到日志,我们比较熟悉的是数据库的写前日志(Write Ahead Log, WAL),也就是说,在实际写数据前,先把修改的数据记到日志文件中,以便故障时进行恢复。不过,AOF 日志正好相反,它是写后日志,“写后”的意思是 Redis 是先执行命令,把数据写入内存,然后才记录日志。AOF日志的好处传统数据库的日志,例如 redo log(重做日志),记录的是修改后的数据,而 AOF原创 2021-03-24 09:55:20 · 631 阅读 · 0 评论 -
Redis的主从库是如何保持数据一致的
Redis 提供了主从库模式,以保证数据副本的一致,主从库之间采用的是读写分离的方式。为什么要采用读写分离的方式呢?如果不管是主库还是从库,都能接收客户端的写操作,要保持这个数据在三个实例上一致,就要涉及到加锁、实例间协商是否完成修改等一系列操作,但这会带来巨额的开销,影响Redis的性能表现。而主从库模式一旦采用了读写分离,所有数据的修改只会在主库上进行,不用协调三个实例。主库有了最新的数据后,会同步给从库,这样,主从库的数据就是一致的。主从库间如何进行第一次同步当我们启动多个 Redis 实例的原创 2021-03-25 14:52:13 · 858 阅读 · 0 评论 -
Redis在秒杀场景中的具体应用
秒杀场景包含了多个环节,可以分成秒杀前、秒杀中和秒杀后三个阶段,每个阶段的请求处理需求并不相同,Redis 并不能支撑秒杀场景的每一个环节。秒杀场景的两个特征:第一个特征是瞬时并发访问量非常高。一般数据库每秒只能支撑千级别的并发请求,而 Redis 的并发处理能力(每秒处理请求数)能达到万级别,甚至更高。所以,当有大量并发请求涌入秒杀系统时,我们就需要使用 Redis 先拦截大部分请求,避免大量请求直接发送给数据库,把数据库压垮。第二个特征是读多写少,而且读操作是简单的查询操作在秒杀场景下原创 2021-07-02 09:57:52 · 1257 阅读 · 0 评论 -
如何解决Redis主从集群中的脑裂问题
数据丢失问题的两种情况在主从集群中发生数据丢失,最常见的原因就是主库的数据还没有同步到从库,结果主库发生了故障,等从库升级为主库后,未同步的数据就丢失了。如果是这种情况的数据丢失,我们可以通过比对主从库上的复制进度差值来进行判断,也就是计算 master_repl_offset 和 slave_repl_offset 的差值。如果从库上的 slave_repl_offset 小于原主库的 master_repl_offset,那么,我们就可以认定数据丢失是由数据同步未完成导致的。通过排查客户原创 2021-06-22 13:40:55 · 1438 阅读 · 0 评论 -
Redis主从数据不一致及读取过期数据问题的解决方案
主从数据不一致问题因为主从库间的命令复制是异步进行的,所以有可能客户端从从库中读取到的值和主库中的最新值并不一致。具体来说,在主从库命令传播阶段,主库收到新的写命令后,会发送给从库。但是,主库并不会等到从库实际执行完命令后,再把结果返回给客户端,而是主库自己在本地执行完命令后,就会向客户端返回结果了。如果从库还没有执行主库同步过来的命令,主从库间的数据就不一致了。从库滞后执行同步命令主要有两种情况:一方面,主从库间的网络可能会有传输延迟,所以从库不能及时地收到主库发送的命令,从库上执行同步命令的原创 2021-06-10 15:50:38 · 2282 阅读 · 2 评论 -
Redis事务机制是否能保证ACID属性?
Redis中事务的执行过程包含三个步骤,Redis 提供了 MULTI、EXEC 两个命令来完成这三个步骤:第一步,客户端要使用一个命令显式地表示一个事务的开启。在 Redis 中,这个命令就是 MULTI。第二步,客户端把事务中本身要执行的具体操作(例如增删改数据)发送给服务器端。这些操作就是 Redis 本身提供的数据读写命令,例如 GET、SET 等。不过,这些命令虽然被客户端发送到了服务器端,但 Redis 实例只是把这些命令暂存到一个命令队列中,并不会立即执行。第三步,客户端向服原创 2021-06-07 14:06:48 · 294 阅读 · 0 评论 -
Redis如何无锁应对并发访问及如何实现分布式锁
Redis无锁应对并发访问原子操作是一种提供无锁并发访问控制的方法。原子操作是指执行过程保持原子性的操作,而且原子操作执行时并不需要再加锁,实现了无锁操作。并发访问控制对应的操作主要是数据修改操作。当客户端需要修改数据时,基本流程分成两步:客户端先把数据读取到本地,在本地进行修改;客户端修改完数据后,再写回 Redis。我们把这个流程叫做“读取 - 修改 - 写回”操作(Read-Modify-Write,简称为 RMW 操作)。当有多个客户端对同一份数据执行 RMW 操作的话,我们就原创 2021-06-04 14:19:21 · 791 阅读 · 0 评论 -
如何解决Redis作为缓存的雪崩、击穿、穿透难题
缓存雪崩缓存雪崩是指大量的应用请求无法在 Redis 缓存中进行处理,紧接着,应用将大量请求发送到数据库层,导致数据库层的压力激增。缓存雪崩一般是由两个原因导致的:第一个原因是:缓存中有大量数据同时过期,导致大量请求无法得到处理。解决方案:首先,我们可以避免给大量的数据设置相同的过期时间。如果业务层的确要求有些数据同时失效,你可以在用 EXPIRE 命令给每个数据设置过期时间时,给这些数据的过期时间增加一个较小的随机数。这样既避免了大量数据同时过期,同时也保证了这些数据基本在相近的时间失效,原创 2021-05-31 14:10:30 · 632 阅读 · 0 评论 -
Redis如何保证缓存和数据库的数据一致性
缓存只读模式下,在更新数据库和删除缓存值的过程中,无论这两个操作的执行顺序谁先谁后,只要有一个操作失败了,就会导致客户端读取到旧值。如何解决数据不一致问题对于读写缓存来说,要想保证缓存和数据库中的数据一致,就要采用同步直写策略。不过,需要注意的是,如果采用这种策略,就需要同时更新缓存和数据库。所以,我们要在业务应用中使用事务机制,来保证缓存和数据库的更新具有原子性,也就是说,两者要不一起更新,要不都不更新,返回错误信息,进行重试。只读缓存模式下,还有一种方式:重试机制。具体来说,可以把要删除的缓存原创 2021-05-27 16:52:21 · 1127 阅读 · 0 评论 -
Redis缓存数据的淘汰机制
缓存的容量设置多大合适数据访问都是有局部性的,也就是我们通常所说的“八二原理”,80% 的请求实际只访问了 20% 的数据。一般来说,会建议把缓存容量设置为总数据量的 15% 到 30%,兼顾访问性能和内存空间开销。对于 Redis 来说,一旦确定了缓存最大容量,比如 4GB,你就可以使用下面这个命令来设定缓存的大小了:CONFIG SET maxmemory 4gbRedis 缓存有哪些淘汰策略Redis 4.0 之前一共实现了 6 种内存淘汰策略,在 4.0 之后,又增加了 2 种策略。原创 2021-05-26 14:38:36 · 865 阅读 · 0 评论 -
Redis为什么适合做缓存?--Redis作为缓存的工作机制
Redis为什么适合做缓存?Redis 基于内存提供了高性能的数据存取功能。缓存中的数据量也是有限的,存储的数据超过缓存容量之后,缓存中的数据需要按一定规则淘汰出去,Redis 本身是支持按一定规则淘汰数据的,这也是 Redis 适合用作缓存的一个重要原因。Redis 缓存处理请求的两种情况把 Redis 用作缓存时,我们会把 Redis 部署在数据库的前端,业务应用在访问数据时,会先查询 Redis 中是否保存了相应的数据。此时,根据数据是否存在缓存中,会有两种情况。缓存命中:Redis 中有原创 2021-05-25 16:14:25 · 3359 阅读 · 1 评论 -
Redis的缓冲区溢出问题及应对方案
缓冲区的功能其实很简单,主要就是用一块内存空间来暂时存放命令数据,以免出现因为数据和命令的处理速度慢于发送速度而导致的数据丢失和性能问题。但因为缓冲区的内存空间有限,如果往里面写入数据的速度持续地大于从里面读取数据的速度,就会导致缓冲区需要越来越多的内存来暂存数据。当缓冲区占用的内存超出了设定的上限阈值时,就会出现缓冲区溢出。客户端输入和输出缓冲区为了避免客户端和服务器端的请求发送和处理速度不匹配,服务器端给每个连接的客户端都设置了一个输入缓冲区和输出缓冲区,我们称之为客户端输入缓冲区和输出缓冲区。原创 2021-05-24 10:15:52 · 2981 阅读 · 1 评论 -
为什么Redis删除数据后内存占用率还是很高?
当数据删除后,Redis 释放的内存空间会由内存分配器管理,并不会立即返回给操作系统。所以,操作系统仍然会记录着给 Redis 分配了大量内存。这往往会伴随一个潜在的风险点:Redis 释放的内存空间可能并不是连续的,那么,这些不连续的内存空间很有可能处于一种闲置的状态。这就会导致一个问题:虽然有空闲空间,Redis 却无法用来保存数据,不仅会减少 Redis 能够实际保存的数据量,还会降低 Redis 运行机器的成本回报率。什么是内存碎片?通常情况下,内存空间闲置,往往是因为操作系统发生了较为严重的原创 2021-05-21 16:24:22 · 246 阅读 · 0 评论 -
如何判断Redis性能是否变慢以及如何应对
如何判断Redis是不是变慢了?一个最直接的方法,就是查看 Redis 的响应延迟。第二个方法,也就是基于当前环境下的 Redis 基线性能做判断。所谓的基线性能呢,也就是一个系统在低压力、无干扰下的基本性能,这个性能只由当前的软硬件配置决定。从 2.8.7 版本开始,redis-cli 命令提供了–intrinsic-latency 选项,可以用来监测和统计测试期间内的最大延迟,这个延迟可以作为 Redis 的基线性能。其中,测试时长可以用–intrinsic-latency 选项的参数来指定。如原创 2021-05-20 15:38:04 · 466 阅读 · 0 评论 -
Redis实例有哪些阻塞点--快速排查Redis阻塞问题
和客户端交互时的阻塞点网络 IO 有时候会比较慢,但是 Redis 使用了 IO 多路复用机制,避免了主线程一直处在等待网络连接或请求到来的状态,所以,网络 IO 不是导致 Redis 阻塞的因素。键值对的增删改查操作是 Redis 和客户端交互的主要部分,也是 Redis 主线程执行的主要任务。所以,复杂度高的增删改查操作肯定会阻塞 Redis。这里有一个最基本的标准,就是看操作的复杂度是否为 O(N)。Redis 中涉及集合的操作复杂度通常为 O(N),我们要在使用时重视起来。例如集合元素全量查询原创 2021-05-19 13:43:09 · 422 阅读 · 0 评论 -
Redis如何实现消息队列的需求
消息队列存取消息的过程:在分布式系统中,当两个组件要基于消息队列进行通信时,一个组件会把要处理的数据以消息的形式传递给消息队列,然后,这个组件就可以继续执行其他操作了;远端的另一个组件从消息队列中把消息读取出来,再在本地进行处理。消息队列在存取消息时,必须要满足三个需求,分别是消息保序、处理重复的消息和保证消息可靠性。基于 List 的消息队列解决方案具体来说,生产者可以使用 LPUSH 命令把要发送的消息依次写入 List,而消费者则可以使用 RPOP 命令,从 List 的另一端按照消息的写入顺序原创 2021-05-18 17:10:26 · 185 阅读 · 1 评论 -
Redis如何保存时间序列数据
时间序列数据的写入特点是要能快速写入,而查询的特点有三个:点查询,根据一个时间戳,查询相应时间的数据;范围查询,查询起始和截止时间戳范围内的数据;聚合计算,针对起始和截止时间戳范围内的所有数据进行计算,例如求最大 / 最小值,求均值等。关于快速写入的要求,Redis 的高性能写特性足以应对了;而针对多样化的查询需求,Redis 提供了两种方案。第一种方案是,组合使用 Redis 内置的 Hash 和 Sorted Set 类型,把数据同时保存在 Hash 集合和 Sorted Set 集合原创 2021-05-18 13:41:16 · 984 阅读 · 1 评论 -
Redis集合类型数据的统计模式
Redis集合类型常见的四种统计模式,包括聚合统计、排序统计、二值状态统计和基数统计。聚合统计所谓的聚合统计,就是指统计多个集合元素的聚合结果,包括:统计多个集合的共有元素(交集统计);把两个集合相比,统计其中一个集合独有的元素(差集统计);统计多个集合的所有元素(并集统计)。当你需要对多个集合进行聚合计算时,Set 类型会是一个非常不错的选择。不过,这里有一个潜在的风险:Set 的差集、并集和交集的计算复杂度较高,在数据量较大的情况下,如果直接执行这些计算,会导致 Redis 实例阻塞。所以我们可原创 2021-05-17 17:46:06 · 821 阅读 · 0 评论 -
Redis如何选择节省内存开销的数据类型
为什么 String 类型内存开销大?String 类型并不是适用于所有场合的,它有一个明显的短板,就是它保存数据时所消耗的内存空间较多。所以当数据量过大时使用String 类型保存数据并不是好的选择。其实,除了记录实际数据,String 类型还需要额外的内存空间记录数据长度、空间使用等信息,这些信息也叫作元数据。当实际保存的数据较小时,元数据的空间开销就显得比较大了。因为 Redis 的数据类型有很多,而且,不同数据类型都有些相同的元数据要记录(比如最后一次访问的时间、被引用的次数等),所以,Red原创 2021-04-01 14:55:01 · 609 阅读 · 0 评论 -
Redis如何使用切片集群保存大规模数据
切片集群,也叫分片集群,就是指启动多个 Redis 实例组成一个集群,然后按照一定的规则,把收到的数据划分成多份,每一份用一个实例来保存。为了保存大量数据,我们可以使用大内存云主机和切片集群两种方法。实际上,这两种方法分别对应着 Redis 应对数据量增多的两种方案:纵向扩展(scale up)和横向扩展(scale out)。纵向扩展:升级单个 Redis 实例的资源配置,包括增加内存容量、增加磁盘容量、使用更高配置的 CPU。横向扩展:横向增加当前 Redis 实例的个数。纵向扩展的好处是,原创 2021-03-29 20:19:09 · 290 阅读 · 0 评论 -
Redis主库挂了后如何不间断服务---哨兵机制
Redis 主从集群中,哨兵机制是实现主从库自动切换的关键机制,它有效地解决了主从复制模式下主库故障的问题。哨兵其实就是一个运行在特殊模式下的 Redis 进程,主从库实例运行的同时,它也在运行。哨兵主要负责的就是三个任务:监控、选主(选择主库)和通知。监控是指哨兵进程在运行时,周期性地给所有的主从库发送 PING 命令,检测它们是否仍然在线运行,如果主库没有在规定时间内响应哨兵的 PING 命令,哨兵就会判定主库下线,然后开始自动切换主库的流程。哨兵机制通常会采用多实例组成的集群模式进行部署,原创 2021-03-26 13:54:32 · 414 阅读 · 1 评论