Redis解决缓存一致性问题

news2024/11/15 17:34:42

文章目录

  • ☃️概述
  • ☃️数据库和缓存不一致采用什么方案
  • ☃️代码实现
  • ☃️其他


在这里插入图片描述

在这里插入图片描述


☃️概述

由于我们的 缓存的数据源来自于数据库, 而数据库的 数据是会发生变化的, 因此,如果当数据库中 数据发生变化,而缓存却没有同步, 此时就会有 一致性问题存在, 其后果是:

用户使用缓存中的过时数据,就会产生类似多线程数据安全问题,从而影响业务,产品口碑等;怎么解决呢?有如下几种方案

人工编码方式:缓存调用者在更新完数据库后再去更新缓存,也称之为双写方案

由系统本身完成:数据库与缓存的问题交由系统本身去处理

调用者只操作缓存:其他线程去异步处理数据库,实现最终一致


☃️数据库和缓存不一致采用什么方案

综合考虑使用方案一,但是方案一调用者如何处理呢?这里有几个问题

操作缓存和数据库时有三个问题需要考虑:

如果采用第一个方案,那么假设我们每次操作数据库后,都操作缓存,但是中间如果没有人查询,那么这个更新动作实际上只有最后一次生效,中间的更新动作意义并不大,我们可以把缓存删除,等待再次查询时,将缓存中的数据加载出来

  • 删除缓存还是更新缓存?

    • 更新缓存:每次更新数据库都更新缓存,无效写操作较多
    • 删除缓存:更新数据库时让缓存失效,查询时再更新缓存
  • 如何保证缓存与数据库的操作的同时成功或失败?

    • 单体系统,将缓存与数据库操作放在一个事务
    • 分布式系统,利用TCC等分布式事务方案

应该具体操作缓存还是操作数据库,我们应当是先操作数据库,再删除缓存,原因在于,如果你选择第一种方案,在两个线程并发来访问时,假设线程1先来,他先把缓存删了,此时线程2过来,他查询缓存数据并不存在,此时他写入缓存,当他写入缓存后,线程1再执行更新动作时,实际上写入的就是旧的数据,新的数据被旧数据覆盖了。

  • 先操作缓存还是先操作数据库?
    • 先删除缓存,再操作数据库
    • 先操作数据库,再删除缓存

在这里插入图片描述


☃️代码实现

根据id查询数据时,如果缓存未命中,则查询数据库,将数据库结果写入缓存,并设置超时时间

根据id修改数据时,先修改数据库,再删除缓存

@Transactionl
public Result update(){
//	执行更新逻辑


//	删除缓存
}

☃️其他

要保证数据库和Redis缓存之间的一致性,可以采用以下策略:

  • 缓存-旁路(Cache-Aside,Lazy Loading):在这种方式中,应用程序首先检查缓存中是否存在所需数据。如果缓存中存在数据,则直接返回给应用程序。如果缓存中不存在数据,则从数据库中获取,然后将数据存储到缓存中以备后续请求使用。为了保持一致性,当数据库中的数据更新时,你需要显式地使缓存中对应的数据失效或更新,可以在数据库更新后立即删除或更新缓存中的数据。

  • 读写-通过(Read-Through,Write-Through):在这种模式下,应用程序同时向数据库和缓存读写数据。当数据库中的数据更新时,缓存中的数据也会同时更新。同样,当从缓存中读取数据时,如果不存在,就从数据库中获取,然后再存储到缓存中。这确保了数据库和缓存的数据保持一致。

  • 写入-通过(Write-Through):类似于读写-通过,但在这种方法中,当数据写入数据库时,也会立即写入缓存。然而,读取操作仍然是从缓存中进行。这有助于减少缓存未命中的次数。

  • 缓存失效(Cache Invalidation):不是在每次数据库更新时都更新缓存,你可以选择使受影响的数据缓存失效。这意味着从缓存中删除过期的数据,这样下一次读取操作将从数据库中获取最新的数据。缓存失效可以通过应用程序中的触发器或事件来实现,它们检测数据库中的更改,然后通知缓存使相应的数据失效。

  • 生存时间(Time-To-Live,TTL):你可以为缓存的数据设置过期时间。这样即使数据库发生了更新,缓存也会在一定时间后过期,然后重新从数据库获取新鲜数据。

通过采用这些策略中的一种或多种组合,你可以在应用程序中保持数据库和Redis缓存之间的一致性。每种方法都有其复杂性、性能和一致性保证方面的权衡,所以选择最适合你应用需求的策略即可。

在这里插入图片描述



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1706388.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python的selenium爬取

1.selenium 1.1.前言 使用python的requests模块还是存在很大的局限性,例如:只发一次请求;针对ajax动态加载的网页则无法获取数据等等问题。特此,本章节将通过selenium模拟浏览器来完成更高级的爬虫抓取任务。 1.2.什么是seleniu…

Redis 主从搭建简单教程

安装单机 首先拿到安装包 wget https://download.redis.io/releases/redis-7.0.15.tar.gz然后进行解压 tar -zxvf redis-7.0.15.tar.gz 然后创建一个文件夹myredis将原始配置文件进行备份 mkdir /myrediscp redis.conf /myredis/redis7.conf 将配置文件复制进去 最后使用vim编…

深入Java:JSON解析与操作的艺术

哈喽,大家好,我是木头左! 一、初识JSON:数据格式的优雅舞者 在现代Web开发中,JSON(JavaScript Object Notation)以其轻量级和易于阅读的特点成为了数据交换的首选格式。它基于JavaScript的一个…

Python教程:使用Python和PyQt编写进制转换器工具

1.介绍 在现代计算中,进制转换是一项常见且重要的任务。为了简化这个过程,我们也可以利用Python和PyQt自己写一个直观且易于使用的进制转换器工具。这个工具将支持二进制、八进制、十进制和十六进制的相互转换,并提供良好的用户界面和交互体…

finetuning大模型准备(基于Mac环境)

为finetuning进行的热身准备,涉及周边的软件工具,方法。 问题1:finetuning过程较长,采用系统自带命令行没有后台,前台被杀后,容易造成训练失败。 解决方法: tmux可以开启后台训练 问题2&…

参数高效微调PEFT(二)快速入门P-Tuning、P-Tuning V2

参数高效微调PEFT(二)快速入门P-Tuning、P-Tuning V2 参数高效微调PEFT(一)快速入门BitFit、Prompt Tuning、Prefix Tuning 今天,我们继续了解下来自清华大学发布的两种参数高效微调方法P-Tuning和P-Tuning v2。可以简单的将P-Tuning是认为针对Prompt Tuning的改进…

P9 【力扣+知识点】【算法】【二分查找】C++版

【704】二分查找(模板题)看到复杂度logN,得想到二分 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标&#xff0…

“揭秘:为什么羊驼Ollama成为计算机运行大型语言模型的最佳拍档?“

最近,AIM 评测了在计算机上本地运行大语言模型(LLM)的最佳工具,Ollama 脱颖而出,成为最高效的解决方案,提供了无与伦比的灵活性。Ollama 是 Jeffrey Morgan 开发的一款开源工具,它正在彻底改变爱…

网络渗透day2

Windows登录的明文密码存储过程和密文存储位置 明文密码存储过程: Windows操作系统不会以明文形式存储用户密码。相反,当用户设置或更改密码时,系统会对密码进行哈希处理,然后存储其哈希值。哈希处理的目的是为了提高密码的安全性…

前端SEO优化包括哪些方面?

前端SEO优化主要关注网站的用户体验和页面内容的呈现,以确保网站对搜索引擎友好并能吸引用户 首先,要注意页面结构,用对的HTML标签比如标题和段落,这样搜索引擎更容易理解你的网页是怎么组织的,同时,保持H…

Linux 系统中 ODBC 驱动的安装与配置指南

Linux 下的 ODBC 包 从发布包中获取,包名为 openGauss-*.*.0-ODBC.tar.gz。Linux 环境下,开发应用程序要用到 unixODBC 提供的头文件(sql.h、sqlext.h 等)和库 libodbc.so。这些头文件和库可从 unixODBC-2.3.0 的安装包中获得。 …

@EnableConfigurationProperties源码解析

前言 EnableConfigurationProperties注解的使用,请移步相关博文:EnableConfigurationProperties注解使用 前置知识 Import注解作用简述 注入的类一般继承 ImportSelector 或者 ImportBeanDefinitionRegistrar 接口 继承ImportSelector接口&#xff…

黑龙江某市数字孪生地下水监测系统平台项目建设经验

项目背景 地下水是一种特殊而珍贵的资源,它具有不可替代性,与经济发展及人民生活息息相关,针对日趋严峻的水资源危机,如何合理利用有限的水资源,保障国民经济的可持续发展是一个迫切需要解决的问题。 黑龙江某市积极…

SpringMvc-restful设计风格

Restful 1、入门1.1 简介1.2 实例 1、入门 1.1 简介 RESTFul是什么 RESTFul是WEB服务接口的一种设计风格。 RESTFul定义了一组约束条件和规范&#xff0c;可以让WEB服务接口更加简洁、易于理解、易于扩展、安全可靠。 1.2 实例 web.xml <?xml version"1.0"…

系统测试需求指南(Word版-软件全套资料下载)

1 目的 2 概述 3 测试需求 3.1 测试范围 3.2 测试目标 4 测试需求的现状 5 测试需求的内容 5.1 主体内容 5.2 管理内容 6 测试需求的制定 6.1 需求信息来源 6.2 需求分析 6.2.1 功能性需求 6.2.2 系统功能需求 6.2.3 界面需求 6.2.4 安装需求 6.2.5 业务需求 …

教师信息素养四个方面是什么

在这个信息爆炸的时代&#xff0c;老师们该如何提升自己的信息素养&#xff1f;信息素养&#xff0c;这个看似简单的概念&#xff0c;实际上包含着丰富的内涵和多维度的技能。它不仅仅是获取信息的能力&#xff0c;更是一种综合运用信息资源&#xff0c;解决教学和生活中问题的…

gRPC 状态码解读:一文看懂

gRPC 是什么&#xff1f; gRPC&#xff08;gRPC Remote Procedure Call&#xff09;是一个高性能的开源框架&#xff0c;它通过远程过程调用&#xff08;RPC&#xff09;机制促进应用程序之间的通信。 gRPC 框架使客户端应用程序能够调用不同机器上的服务器应用程序的方法&am…

零拷贝(Zero Copy)

目录 零拷贝&#xff08;Zero Copy&#xff09; 1.什么是Zero Copy? 2.物理内存和虚拟内存 3.内核空间和用户空间 4.Linux的I/O读写方式 4.1 I/O中断原理 4.2 DMA传输原理 5.传统I/O方式 5.1传统读操作 5.2传统写操作 6.零拷贝 6.1.用户态直接IO 6.2.mmapwrite …

计算机图形学入门02:线性代数基础

1.向量&#xff08;Vetors&#xff09; 向量表示一个方向&#xff0c;还能表示长度&#xff08;向量的摸&#xff09;。一般使用单位向量表示方向。 向量加减&#xff1a;平行四边形法则、三角形法则。比卡尔坐标系描述向量&#xff0c;坐标直接相加。 1.1向量点乘&#xff08;…

帆软报表点击表格给数据集传递参数案例

一、效果 有四个模块&#xff0c;分别是采购总金额&#xff0c;采购总数量&#xff0c;采购合同数量&#xff0c;采购合同申请数量通过点击单元格上的月份&#xff0c;展示不同的月份数据&#xff0c;进行单元格和表格之间的联动 二、准备好数据库表和展示数据内容 2.1 建表 …