首页 > 数据库 >redis 缓存一致性

redis 缓存一致性

时间:2024-05-31 16:23:08浏览次数:23  
标签:缓存 err redis 更新 回填 一致性 gin id

问题

在使用缓存中一般都是先看看缓存是否有数据,没有查 db,再回填到缓存。

然后更新时候一般是更新 db,更新完了再删除或者回填缓存。

然而因为缓存与数据库是两个独立的系统,很难去保证原子性,所以就产生了一致性的问题。

 比如说:

  1. 一个查询请求查到了数据库数据,然后准备更新到缓存。
  2. 在上一步中间状态时候有更新请求更新了数据,还删了一次缓存。
  3. 第一步更新缓存在第二步之后完成,导致缓存出现旧数据。

解决

上面说到了一些缓存更新顺序问题,在使用 Redis 时可以将查询请求的回填改为 Setnx,更新操作使用 Set 方式回填缓存。

当出现问题情况时,更新的新数据会直接强制更新上缓存,而旧数据的更新会因为已有缓存而取消重复更新。

但是如果是两个写并发时用上面的方法就没有用了。

带上版本号进行乐观锁,但实现成本很高,如果用切面方式改造需要改造中间件:

  1. 同步操作 DB
  2. 高版本 Cache 无法覆盖 低版本 Cache。

低并发时也可以考虑缓存双删。

func updateDataHandler(c *gin.Context) {
    id := c.Param("id")
    var requestBody struct {
        Data string `json:"data"`
    }
    if err := c.BindJSON(&requestBody); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

    // 更新前删除缓存
    deleteCache(id)

    // 更新数据库
    updateDataInDB(id, requestBody.Data)

    // 更新后再次删除缓存,使用 Goroutine 异步操作
    go func() {
        time.Sleep(500 * time.Millisecond)
        deleteCache(id)
    }()

    c.JSON(http.StatusOK, gin.H{"status": "success"})
}

 

标签:缓存,err,redis,更新,回填,一致性,gin,id
From: https://www.cnblogs.com/caiawo/p/18224781

相关文章

  • 两台windowserver服务器配置Redis哨兵集群
    十年河东,十年河西,莫欺少年穷学无止境,精益求精redis下载地址:https://github.com/tporadowski/redis/releases 这里选择压缩版,不选择安装版1、集群环境 主机master:局域网IP  172.27.40.27从机slave:局域网IP  172.27.40.29 2、修改主从相关配置-两台服务器均需修改......
  • Springcloud学习笔记68--springboot 整合Caffeine 本地缓存
    一、本地缓存介绍缓存在日常开发中启动至关重要的作用,由于是存储在内存中,数据的读取速度是非常快的,能大量减少对数据库的访问,减少数据库的压力。之前介绍过Redis这种NoSql作为缓存组件,它能够很好的作为分布式缓存组件提供多个服务间的缓存,但是Redis这种还是需要网络开销,增......
  • 防止浏览器缓存了静态的配置等文件(例如外部的config.js 等文件)
    防止浏览器缓存了静态的配置文件前言1、在script引入的时候添加随机数1.1、引入js文件1.2、引入css文件2、通过html文件的<meta>设置防止缓存3、使用HTTP响应头:前言在实际开发中浏览器的缓存问题一直是一个很让人头疼的问题,尤其是我们打包时候防止的静态配置文件con......
  • Redis-Redis为什么快
    参考文章:Redis常见面试题总结(上)redisIO多路复用模型详解JavaIO模型详解1.Redis是什么Redis(REmoteDIctionaryServer)是一个基于C语言开发的开源NoSQL数据库(BSD许可)。与传统数据库不同的是,Redis的数据是保存在内存中的(内存数据库,支持持久化),因此读写速度非常快,被广......
  • redis集群
    redis集群搭建注意:Redis5以上版本适用1、直接使用下面的步骤mkdir/redis-cluster/7000/redis-cluster/7001/redis-cluster/7002/redis-cluster/7003/redis-cluster/7004/redis-cluster/7005//创建六个文件夹代表六个redis服务存放目录touchredis.conf//每个目录创......
  • Spring Boot 集成 MyBatis、Redis、RabbitMQ 和 Elasticsearch 教程
    1.环境准备确保你的开发环境已经安装了以下软件:JavaDevelopmentKit(JDK)1.8或更高版本ApacheMaven或Gradle作为构建工具一个文本编辑器或IDE(如IntelliJIDEA或Eclipse)Redis、RabbitMQ和Elasticsearch服务器2.创建项目使用SpringInitializr创建一个新项......
  • redis命令大全
    通用命令命名说明例子keys查看指定指定通配符的keykeyskeyskey1dbsize返回整个数据库中key的数量exists判断指定key是否存在existskey1del删除指定key,返回删除的个数delkey1expire设置在多长时间以后过期(秒)expirek110expireat设置在......
  • nginx fastcgi_buffers 缓存
    nginxfastcgi_buffers设置打开nginx的warn级别error_log,看到如下信息:2011/04/2317:24:08[warn]9639#0:*44anupstreamresponseisbufferedtoatemporaryfile/tmp/fastcgi_temp/8/0/0000000008whilereadingupstream,client:118.118.118.118,server:sealing......
  • redis实现分布式锁
    Redis实现分布式锁分布式锁一般有三种实现方式:1、基于数据库乐观锁;2、基于Redis的分布式锁;3、基于Zookeeper的分布式锁。本文档主要介绍基于Redis实现分布式锁的方法。1、加锁//redis加锁publicbooleangetLock(Jedisjedis,Stringkey,intexpire){Stringuuid=UUID.ran......
  • 前端需要知道的缓存知识总结
    HTTP缓存是一种用于提高网站性能和减少带宽使用的技术。当用户访问一个网页时,浏览器会下载页面上的所有资源(如HTML、CSS、JavaScript等),这些资源会占用大量的带宽和时间。为了减少这些资源的加载时间,HTTP缓存机制被引入。......