当前位置: 首页 > news >正文

[Redis]——数据一致性,先操作数据库,还是先更新缓存?

目录

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

1.删除缓存还是更新缓存?

2.如何保证缓存与数据库的操作同时成功或失效

3.先操作缓存还是先操作数据库(多线程并发问题)

二、 缓存更新的最佳策略


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

1.删除缓存还是更新缓存?

  • 更新缓存:每次更新数据库都更新缓存,如果写多读少,这样效率太低。
  • 删除缓存:更新数据的同时让缓存失效,查询时再更新缓存。

🌳我们一般会采用删除缓存策略。

2.如何保证缓存与数据库的操作同时成功或失效

  • 单体系统,将缓存与数据库操作放在一个事务,利用事物本身原子性来保证。
  • 分布式系统,利用TCC等分布式事务方案。

3.先操作缓存还是先操作数据库(多线程并发问题

  • 先删除缓存,在操作数据库
  • 先操作数据库,在删除缓存

那哪一种比较好呢❓

解释:

        如果在线程1删除缓存,更新数据库的时候,线程2查询该数据,未命中,然后写入缓存,这就导致了数据库与缓存不一致,并且这种情况发生的概率很大,因为更新的时间可能是比较久的,而操作缓存是很快的,所以这种方式不好

另一种方式

 

解释:

         如果某一时刻,缓存突然失效了,线程1查询缓存未命中,准备写入缓存,这是线程2来更新数据库了,然后删除缓存,再然后线程1就要写入缓存了,数据又不一致了,但是这种情况发生的概率很小。

二、 缓存更新的最佳策略

主动更新缓存,并以超时剔除作为兜底方案,因为如果缓存过多可能导致内存不足

读操作:

  • 缓存命中直接返回
  • 未命中则查询数据库,并写入缓存,设定超时时间

写操作:

  • 先操作数据库,然后再删除缓存
  • 确保数据库和删缓存操作的一致性

相关文章:

  • 打卡--MySQL8.0 一(单机部署)
  • Pytorch学习 day09(简单神经网络模型的搭建)
  • 大模型产业落地,安全运营能否迎来“自动驾驶”时刻?
  • stable diffusion faceswaplab换脸插件报错解决
  • 【LLM】Advanced rag techniques: an illustrated overview
  • 论文导读:消费级大模型Yi (零一万物技术揭密)
  • LeNet5实战——衣服分类
  • RabbitMQ - 02 - 基本消息模型
  • vue中性能优化
  • Linux Docker安装redis缓存数据库
  • 怎么做加密文件二维码?分享文件更安全
  • 会话_过滤器_监听器笔记
  • 基于鳑鲏鱼优化算法(Bitterling Fish Optimization,BFO)的无人机三维路径规划
  • 大数据开发(Hadoop面试真题-卷四)
  • C++的一些基础语法
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 【译】理解JavaScript:new 关键字
  • 230. Kth Smallest Element in a BST
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • ERLANG 网工修炼笔记 ---- UDP
  • HTML中设置input等文本框为不可操作
  • Java反射-动态类加载和重新加载
  • Just for fun——迅速写完快速排序
  • leetcode388. Longest Absolute File Path
  • orm2 中文文档 3.1 模型属性
  • Sublime Text 2/3 绑定Eclipse快捷键
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • - 概述 - 《设计模式(极简c++版)》
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 小程序开发之路(一)
  • gunicorn工作原理
  • Linux权限管理(week1_day5)--技术流ken
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • scrapy中间件源码分析及常用中间件大全
  • ###STL(标准模板库)
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (Java数据结构)ArrayList
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET CORE Aws S3 使用
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .net反混淆脱壳工具de4dot的使用
  • ??javascript里的变量问题
  • @angular/cli项目构建--Dynamic.Form
  • @RequestBody与@ResponseBody的使用
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...