《程序猿之Redis缓存实战 · Redis 与数据库一致性》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗

🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍

文章目录

    • [Redis 与数据库一致性](#Redis 与数据库一致性)

Redis 与数据库一致性

【问题背景】

使用Redis做一个缓存操作,让请求先访问到redis,而不是直接访问MySQL等数据库。

读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新(数据库和缓存更新),就容易出现缓存(Redis)和数据库(MySQL)间的数据一致性问题。

不管是先写MySQL数据库,再删除Redis缓存;还是先删除缓存,再写库,都有可能出现数据不一致的情况。

【方案一:延时双删】

latex 复制代码
先删除Redis缓存数据,再更新Mysql,延迟几百毫秒再删除Redis缓存数据,这样就算在更新Mysql时,有其他线程读了Mysql,把老数据读到了Redis中,那么也会被删除掉,从而把数据保持一致。

延时双删 是一种常见的解决 Redis 和数据库一致性问题的方案,它可以有效地降低数据不一致的概率。

原理:

  • 写入 Redis: 当用户修改数据时,先写入 Redis 缓存。
  • 异步更新数据库: 同时异步地将修改操作发送到数据库进行更新。
  • 延时删除 Redis: 为了防止数据库更新失败导致数据不一致,在数据库更新成功后,延时一段时间再删除 Redis 缓存。

优点:

  • 提高性能: 由于大部分请求都命中缓存,可以有效地提高系统性能。
  • 降低数据不一致的概率: 延时删除可以确保数据库更新成功后,Redis 缓存才会被删除,从而降低数据不一致的概率。

缺点:

  • 存在短暂的数据不一致: 在延时删除期间,Redis 缓存和数据库数据可能存在短暂的不一致。
  • 需要额外的逻辑: 需要实现延时删除机制,增加代码复杂度。

适用场景:

  • 对于对数据一致性要求不高的场景,延时双删是一个不错的选择。
  • 对于需要高性能的场景,延时双删可以有效地提高系统性能。
java 复制代码
@Component
public class CacheUtil {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    // 删除数据的方法
    public void deleteWithDelay(String key, String dbKey) {
        // 第一次删除 Redis 中的数据
        redisTemplate.delete(key);

        // 等待一段时间(例如 500 毫秒)
        try {
            TimeUnit.MILLISECONDS.sleep(500);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }

        // 从数据库中删除数据(假设有一个数据库操作的方法)
        deleteFromDatabase(dbKey);

        // 再次删除 Redis 中的数据
        redisTemplate.delete(key);
    }

    // 模拟从数据库中删除数据的方法
    private void deleteFromDatabase(String dbKey) {
        // 实际的数据库删除逻辑
        System.out.println("Deleting from database: " + dbKey);
        // 例如:repository.deleteById(dbKey);
    }
}

【其他方案】

1、队列 + 重试机制

2、异步更新缓存(基于订阅binlog的同步机制)

相关推荐
OH_TPC10 分钟前
【鸿蒙优选三方库】@react-native-ohos/react-native-fast-image:高性能图片加载与缓存组件
缓存·华为·harmonyos·鸿蒙
Aloudata18 分钟前
语义层 vs MCP 工具层:Agent 调用数据时,语义应该放在哪一层
数据库·数据分析·chatbi·data agent·语义层
zcmodeltech18 分钟前
源网荷储一体化沙盘模型多场景控制系统设计——基于STM32与Modbus RTU的源网荷储、多能互补、冷热电三联供全场景联动方案,服务范围覆盖全国
数据库·人工智能·stm32·单片机·嵌入式硬件
数智启示录21 分钟前
PostgreSQL 执行计划实战(第 9 篇):SQL 和索引没变,计划为什么突然慢一百倍
数据库·经验分享·sql·postgresql·面试
liangshanbo121524 分钟前
手写 Event Emitter(事件发射器)
缓存
Gent_倪37 分钟前
MySQL分库、分表、分区详解
数据库·mysql
额额额对了43 分钟前
Linux 数据库开发实战:使用 C 语言与 SQLite3 构建轻量级终端词典
linux·数据库·oracle
qq_246839751 小时前
postgresql xxhash64 哈希函数实现
数据库·postgresql·哈希算法
希望奇迹很安静1 小时前
等级保护测评
网络·数据库
会博通·代码搬运工1 小时前
疾控档案落地难点:异构业务系统并存,高价值纸质凭证如何回流业务闭环
数据库·档案管理·档案管理系统·智能扫描设备·会博通