浏览器无法直接访问 Redis,通常通过后端 API 交互。解决访问难题需依托缓存机制,如 Cache Aside 模式,读请求先查缓存再查库,写请求先更新库再删缓存。数据同步原理核心在于保证缓存与数据库一致性,常用策略包括延时双删、更新缓存配合重试机制,以及设置过期时间淘汰冷数据。针对脑裂等异常,需配置最小从节点写入限制,确保数据不丢失,从而在高并发下维持系统性能与数据准确。
真正理解 redis 缓存
显然这个方案面临一些问题:缓存利用率低,许多不常用的数据会一直停留再缓存里面 定时刷新缓存数据的机制导致长时间可能读取到旧数据 所以这个不见得是一个兼具效率和可行性的方案 缓存利用率和一致性问题 如何提高缓存利用率 很自然可以想到,我只要把经常读取的数据存到缓存里面,不常读取的数据即使只放在 MySql 里面也不会有太大性能损耗 优化思路:写请求依旧只操作数据库 读请求优先读缓存,如果缓存不存在就读 MySql 然后回源到 redis 里面 同时,写入缓存的数据全部设置失效时间 图片 通过访问激活,失效时间限制,可以保证缓存里面的 Key 都是热点数据 数据一致性问题 要想保证缓存和数据库「实时」一致,那就不能再用定时任务刷新缓存了。所以,当数据发生更新时,我们不仅要操作数据库,还要一并操作缓存。具体操作就是,修改一条数据时,不仅要更新数据库,也要连带缓存一起更新。但数据库和缓存都更新,又存在先后问题,那对应的方案就有 2 个:(2026 年 4 月 25 日的资料)
Redis 缓存问题全面解析与解决方案_redis 缓存一致性应用场景及解决方案-CSDN 博客
1 Redis 缓存数据同步问题 1.1 数据更新策略 核心矛盾:数据库与缓存的数据同步存在延迟,特别是在并发场景下。两种基本策略:更新缓存:直接修改缓存数据 删除缓存:移除缓存数据,下次查询时重建 为何优先选择删除策略:1.2 延迟双删方案 针对"先删缓存后更新数据库"的脏数据问题:同步实现:# java //伪代码示例 public void updateData(Stringkey,Objectvalue) { //1. 首次删除缓存 redis.del(key); //2. 更新数据库 db.update(key,value);(消息于 2025 年 7 月 3 日发布)
谈谈 Redis 缓存和数据库一致性的处理方案
2.4、延时双删 + 重试 如下图所示:2、项目引入缓存 随着项目请求量越来越大,这时如果每次都从数据库中读数据,会有性能问题。这个阶段通常的做法是,引入「缓存」来提高读性能。如下图所示:3、数据同步 在引入 redis 作为缓存之后,就会出现 redis 数据和数据库数据如何同步的现象。相对于简单的方案:全量导入缓存 数据库的数据,全量刷入缓存 (不设置失效时间) 写请求只更新数据库,不更新缓存 启动一个定时任务,定时把数据库的数据,更新到缓存中 优点:所有读请求都可以直接「命中」缓存,不需要再查数据库,性能非常高。缺点:缓存利用率可能不高 (部分 redis-key),受定时任务影响导致数据会出现不一致 (时间有关)。4、缓存利用率 想要缓存利用率「最大化」,可以容易想到的方案是,缓存中只保留最近访问的「热数据」。如下图所示:设置缓存的失效时间。处理方案:写请求依旧只写数据库 读请求先读缓存,如果缓存不存在,则从数据库读取,并重建缓存 同时,写入缓存中的数据,都设置失效时间 随着时间的推移,不常用的 key 都会逐渐「过期」淘汰掉,最终缓存中保留的,都是经常被访问的「热数据」,缓存利用率得以最大化。2、解决方案 2.1、更新缓存 1、数据一致性 基于上面介绍的定时任务虽然也可以做到数据同步,但是局限性比较大,为了实现缓存利用率最大化。因此,需要在更新数据库后,即使更新缓存,缓存和数据库还是会有时间差,导致查询 redis 缓存的值是旧值,存在利用率不高的现象。期望:当数据发生更新时,我们不仅要操作数据库,还要一并操作缓存。当数据库和缓存都更新,又存在先后问题,那对应的方案就有 2 个:先更新数据库,后更新缓存 此时也有可能存在先后操作的时候,出现失败的场景。(发布时间是 2025 年 5 月 8 日)
解读 Redis 的四种企业级解决方案
然而当我们在使用 Redis 时会遇到一些意外情况影响数据同步的一致性,从而影响到项目的数据查询的正确性;下面是使用 Redis 时的常见问题以及解决方案:一、Redis 脑裂 1、Redis 脑裂概念 Redis 脑裂,顾名思义,就是同时出现了两个“大脑”主导,在 Redis 上就是短时间内同时出现了两个 Master;两个 Master 的后果就是会造成旧 Master 数据丢失;以下是 Redis 正常工作状态的示意图:Redis 正常工作状态示意图 当 Redis 的主机端由于网络问题导致主机端的网络分区与 sentinel 哨兵和 slave 从主机端网络分区不同时,sentinel 哨兵由于无法感知 Master 的存在,便会开始向所有从主机端获取状态挑选新主机端;Master 和其他访问端口不在一个网络分区时 Redis 的整体访问结构 但此时需要注意的是原主机端依旧是正常的 (没有挂机),这就说明客户端仍然可以向 Master 写入数据;此时整个 Redis 访问结构中存在两个主机端;这种现象就是 Redis 脑裂;2、Redis 脑裂对数据读写造成的影响 在 Redis 脑裂中,如果客户端依然基于原来的 Master 写入数据,那么当网络问题恢复后,Master 再次和其他端口同属一片网络分区;尽管它是主机端,但整个访问结构中已经存在 Master2 这个新主机端,所以 sentinel 哨兵会将 Master 降为从主机端 Slave2,然后再从 Master2 同步数据;这样就会导致,客户端一直是基于 Master 写入数据的,Master2 中只有网络出问题之前从 Master 同步的数据;网络出问题期间的数据在 Master,但是 Master 在网络问题解决后又被降为从主机端 Slave2 然后同步 Master2 的数据,所以网络出问题期间的数据就会丢失;更换主机端 Master2 后 Redis 的整体访问结构 3、解决方案 在海量数据读写操作的场景下,几毫秒的脑裂时间都可能导致超大量的数据丢失,所以需要避免这种情况;下面是 Redis 脑裂的解决方案:在 redis.conf 中配置两个参数:代码语言:txt AI 代码解释 min-replicas-to-write 1 min-replicas-max-lag 5 第一个参数的含义:主机端最少要和 1 个 slave 从主机端连接才会执行写入操作 第二个参数的含义:主机端向 slave 从主机端同步复制数据的延迟不能超过 5 秒,否则不执行写入操作 添加参数后,访问结构如下:不满足条件时,Master 主机端拒绝写入数据 配置参数后,根据上面的例子分析,当 Master 主机端和其他访问端处于不同的网络分区时,由于 Master 与 Slave 断联,无法将 Master 主机端内的数据复制同步到 Slave 从主机端,所以 Master 主机端会拒绝写入操作;这样一来,网络出问题期间的写入数据操作会全部在 Master2 新主机端上执行,从而不会造成数据丢失(2025 年 1 月 29 日)
如何解决 Redis 缓存和 MySQL 数据一致性的问题?[通俗易懂]
在高并发的业务场景下,数据库的性能瓶颈往往都是用户并发访问过大。所以,一般都使用 redis 做一个缓冲操作,让请求先访问到 redis,而不是直接去访问 MySQL 等数据库。从而减少网络请求的延迟响应 数据为什么会不一致 这样的问题主要是在并发读写访问的时候,缓存和数据相互交叉执行。一、单库情况下 同一时刻发生了并发读写请求,例如为 A(写) B (读)2 个请求 A 请求发送一个写操作到服务端,第一步会淘汰 cache,然后因为各种原因卡主了,不在执行后面业务 (例:大量的业务操作、调用其他服务处理消耗了 1s)。B 请求发送一个读操作,读 cache,因为 cache 淘汰,所以为空 B 请求继续读 DB,读出一个脏数据,并写入 cache A 请求终于执行完全,在写入数据到 DB 总结:因最后才把写操作数据入 DB,并没同步。cache 里面一直保持脏数据 脏数据是指源系统中的数据不在给定的范围内或对于实际业务毫无意义,或是数据格式非法,以及在源系统中存在不规范的编码和含糊的业务逻辑。二、主从同步,读写分离的情况下,读从库而产生脏数据 A 请求发送一个写操作到服务端,第一步会淘汰 cache A 请求写主数据库,写了最新的数据。B 请求发送一个读操作,读 cache,因为 cache 淘汰,所以为空 B 请求继续读 DB,读的是从库,此时主从同步还没同步成功。读出脏数据,然后脏数据入 cache 最后数据库主从同步完成 总结:这种情况下请求 A 和请求 B 操作时序没问题,是主从同步的时延问题 (假设 1s),导致读请求读取从库读到脏数据导致的不一致 根本原因:单库下,逻辑处理中消耗 1s。可能读到旧数据入缓存 主从 + 读写分离,在 1s 的主从同步时延中。(撰于 2023 年 7 月 3 日)
FAQ
问题 1:浏览器可以直接访问 Redis 数据库吗?
回答 1:不可以,Redis 是后端存储服务,浏览器需通过后端 API 间接访问,直接暴露 Redis 端口存在严重安全风险。
问题 2:缓存和数据库一致性如何保证?
回答 2:常用策略包括先更新数据库再删除缓存,或使用延时双删方案,配合重试机制确保最终一致性。
问题 3:Redis 脑裂会导致什么问题?
回答 3:脑裂会导致出现两个 Master,网络恢复后旧 Master 降级,期间写入的数据可能丢失,需配置最小从节点限制。