首页 > 数据库 >记录Redis+MQ延迟双删保证缓存一致性

记录Redis+MQ延迟双删保证缓存一致性

时间:2024-10-18 22:49:07浏览次数:15  
标签:缓存 删除 双删 数据库 Redis 更新 MQ blogId 延迟

场景描述

在博客系统中,用户可以给博客点赞或者评论,这些操作需要更新数据库中的数据,同时要保证缓存中的博客信息与数据库保持一致。为了提高性能,博客数据会存放在Redis缓存中。但当有大量用户同事点赞或是评论时,缓存和数据库中的数据可能出现不一致。

何谓延迟双删?

延迟双删的核心思想:更新数据库数据的同时,处理Redis缓存中的数据,以避免缓存和数据库中的数据不一致。

双删

在更新数据库之前删除缓存中的博客数据
更新数据库之后,为了防止第一次删除缓存和数据库更新之间,产生新的缓存(一个新的并发请求产生在删除缓存之后,更新数据库之前再次写入了旧缓存,导致不一致问题),所以在更新数据库后的一,延迟一段时间再次删除缓存。

实现步骤

  1. 当用户点赞或评论某篇博客时,首先将Redis缓存中对应的博客数据删除
public void deleteCacheBeforeUpdate(Long blogId) {
    // 删除Redis中缓存的博客数据
    redisTemplate.delete("blog:" + blogId);
}
  1. 更新数据库
public void updateBlogInDatabase(Long blogId) {
    // 假设有一个点赞服务或评论服务,执行数据库更新
    blogService.updateLikeCount(blogId); // 点赞操作
    // 或者
    blogService.updateCommentCount(blogId); // 评论操作
}
  1. 延迟删除缓存(通过RabbitMQ异步处理)
    发送延迟删除缓存的消息到RabbitMQ:更新数据库后,将延迟删除的任务放入RabbitMQ消息队列,并设置一个适当的延迟时间
public void sendDelayedCacheDeletion(Long blogId) {
    // 发送博客ID到RabbitMQ消息队列,延迟一段时间后删除缓存
    rabbitTemplate.convertAndSend("cache-delete-queue", blogId);
}

RabbitMQ监听消息,进行第二次缓存删除操作。

@RabbitListener(queues = "cache-delete-queue")
public void handleCacheDelete(Long blogId) {
    try {
        // 设置延迟时间,比如500毫秒 可以采用延迟队列
        Thread.sleep(500); // 模拟延迟
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    // 删除Redis缓存中的博客数据
    redisTemplate.delete("blog:" + blogId);
}

执行逻辑:

// 1. 删除缓存,确保读取的下一次是最新数据
deleteCacheBeforeUpdate(blogId);

// 2. 更新数据库中的博客点赞数或评论数
updateBlogInDatabase(blogId);

// 3. 发送延迟删除缓存的消息到RabbitMQ
sendDelayedCacheDeletion(blogId);

以上方案可以在一定程度上保证缓存一致性,但不是绝对的,在某些极端情况下还是会存在缓存不一致的情况。可以结合分布式锁来确保缓存的一致性。在更新数据库和处理缓存删除的过程中,通过锁机制保证只有一个线程可以操作缓存,从而避免多个线程并发地写入缓存。

最后,延迟双删策略虽然能有效解决大部分并发下的缓存一致性问题,但在极端高并发场景中仍可能会出现短暂的不一致。通过引入分布式锁,可以进一步增强缓存和数据库之间的一致性,确保在并发操作时只有一个线程能够执行缓存和数据库的操作。此外,如果对一致性要求更高,还可以在数据库更新后直接更新缓存而不是删除缓存,进一步提高数据的一致性。或者直接更新缓存,cache优于DB的情景。

标签:缓存,删除,双删,数据库,Redis,更新,MQ,blogId,延迟
From: https://blog.csdn.net/weixin_52630811/article/details/143062546

相关文章

  • RabbitMQ系列学习笔记(八)--发布订阅模式
    文章目录一、发布订阅模式原理二、发布订阅模式实战1、消费者代码2、生产者代码3、查看运行结果本文参考:尚硅谷RabbitMQ教程丨快速掌握MQ消息中间件rabbitmqRabbitMQ详解Centos7环境安装Erlang、RabbitMQ详细过程(配图)一、发布订阅模式原理在开发过程中,有一......
  • RabbitMQ系列学习笔记(十)--通配符模式
    文章目录一、通配符模式原理二、通配符模式实战1、消费者代码2、生产者代码3、查看运行结果本文参考:尚硅谷RabbitMQ教程丨快速掌握MQ消息中间件rabbitmqRabbitMQ详解Centos7环境安装Erlang、RabbitMQ详细过程(配图)一、通配符模式原理通配符模式(Topics)是在路......
  • Redis架构演进之单机版Redis和数据持久化
    单机版Redis假设现在有一个业务应用,需要引入Redis来提高应用的性能,此时可以选择部署一个单机版的Redis来使用业务应用可以把Redis当作缓存来使用,从MySQL里查询数据,然后写入Redis中,之后业务应用再从Redis里读取数据,因为Redis的数据都是存储在内存里的,所以整体的速度很快。......
  • Redis 集群:高效缓存与数据存储的利器
    在当今的互联网时代,数据的存储和处理速度至关重要。Redis作为一种高性能的内存数据库,广泛应用于各种场景。而Redis集群则进一步提升了Redis的可用性、扩展性和性能。本文将为你详细介绍Redis集群的简介以及三种模式。一、Redis集群简介Redis集群是由多个Redis......
  • Redis主从复制原理
    Redis主从复制(Master-SlaveReplication)是Redis提供的一种数据冗余方案,用于实现数据的热备份和高可用性。其原理可以概括为以下几个关键点:角色定义:主节点(Master):处理写操作,并将其写操作同步给从节点。从节点(Slave):通常只处理读操作,从主节点接收数据同步。复制过程:当......
  • Redis 集群部署
    Redis集群部署环境系统:CentOS7版本:redis-7.2.6下载地址:https://download.redis.io/releases/主从集群结构三个节点:一个主节点,两个从节点IPPORT角色192.168.93.1006379master192.168.93.1016379slave192.168.93.1026379slave步骤安装前置依赖......
  • 【深度知识】5.Prometheus-PromQL查询监控数据和语法说明
    成就你的写作梦想立即下载 【深度知识】5.Prometheus-PromQL查询监控数据和语法说明笔名辉哥 简书优秀创作者0.8682021-03-2822:20IP属地:上海打开App  1.摘要PromQL(PrometheusQueryLanguage)是Prometheus自己开发的数据查询DSL......
  • Redis 万字入门教程
    0.前言文章已经收录到GitHub个人博客项目,欢迎Star:https://github.com/chenyl8848/chenyl8848.github.io或者访问网站,进行在线浏览:https://chenyl8848.github.io/1.NoSQL1.1NoSQL介绍NoSQL(NotOnlySQL),意即不仅仅是SQL,泛指非关系型的数据库。NoSQL这个技术......
  • 手写MSMQ微软消息队列收发工具类
    一、MSMQ介绍MSMQ(MicrosoftMessageQueuing)是微软开发的消息队列技术,支持事务,支持异步发送和接收消息。两个重要的概念:队列和消息。队列是存放消息的容器和传输消息的通道。消息是在队列上存储和传输的数据的基本单元;这个消息在计算机上的存在形式可以是任意格式的文件;在C#程序......
  • [Redis] 在Linux中安装Redis并连接图形化工具详细过程(附下载链接)
    前言安装Redis之前应该在虚拟机中安装Linux系统,这里使用centos7版本[linux]在VMware中安装linux、文件下载及详细安装过程(附下载链接)-CSDN博客安装Linux后,更换yum源为阿里云并安装gcc依赖[Linux]CentOS7替换yum源为阿里云并安装gcc详细过程(附下载链接)-CSDN博客redis-6......