Redis的一致性

一、产生的原因

使用缓存,在进行写操作的时候就会出现不一致的问题。
一致性分为三类:强一致性,弱一致性,最终一致性

二、方案

2.1 延时双删

在更新数据库的操作前后分别进行一次删除缓存的操作,并在更新数据库之后线程休眠一段时间。

在这里插入图片描述

  1. 先删除缓存
  2. 再更新数据库
  3. 休眠一会(比如1秒),再次删除缓存。

这个休眠一会,一般多久呢?都是1秒?
休眠时间 = 读业务逻辑数据的耗时 + 几百毫秒。为了确保读请求结束,写请求可以删除读请求可能带来的缓存脏数据。

该方法优缺点思考:
这种方案还算可以,只有休眠那一会(比如就那1秒),可能有脏数据,一般业务也会接受的。但是如果第二次删除缓存失败呢?
缓存和数据库的数据还是可能不一致,对吧?
给Key设置一个自然的expire过期时间,让它自动过期怎样?
那业务要接受过期时间内,数据的不一致咯?还是有其他更佳方案呢?

2.2 删除缓存重试机制

当第二次删除缓存失败怎么办?那就再删一次呗,还不行就再删一次!
在这里插入图片描述

  1. 写请求更新数据库
  2. 缓存因为某些原因,删除失败
  3. 把删除失败的key放到消息队列
  4. 消费消息队列的消息,获取要删除的key
  5. 重试删除缓存操作

2.3 读取biglog异步删除缓存

删除缓存重试机制虽然能够解决一致性的问题,但是对代码的侵入性较大,可以进行如下优化:通过数据库的binlog来异步淘汰key。
在这里插入图片描述
以mysql为例,
可以使用阿里的canal将binlog日志采集发送到MQ队列里面
然后通过ACK机制确认处理这条更新消息,删除缓存,保证数据缓存一致性

三、可能出现的疑问

3.1 为什么先操作数据库,再操作缓存?

假设先操作缓存再操作数据库,可能会出现如下情况:
线程A先删除缓存,在A更新数据库的操作结束前,线程B去读数据,发现缓存没数据了,那么B就会去数据库中查询,结果读到的就是脏数据并存在缓存中,然后A更新完数据库,导致数据库和缓存中的值不一致。
如果先操作数据库再操作缓存,能保证一致性。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

广工电工与电子技术实验报告-按键键值识别和LED数码管显示

实验代码 Key_LED.v module Key_LED (key, HEX0); input[3:0] key; output[6:0] HEX0; reg[3:0] A; always (key) begin if (key[0] < 0) begin A 4b0001; end else if (key[1] < 0) begin A 4b0010; end else if (key[2] < 0) begin A 4b0011; end else if (key[…

Java——分支语句

控制结构是管理代码执行流程的基础。主要包括顺序控制、分支控制和循环控制。 一、顺序控制 顺序控制是最基本的控制结构&#xff0c;程序按照代码的书写顺序逐行执行。 public class SequentialControl {public static void main(String[] args) {int a 5;int b 10;int s…

jupyter notebook使用conda环境

pycharm中安装过可以使用的库在jupyter notebook中导入不进来 1 检查pycharm中安装的库的位置 2 检查jupyter notebook中安装的库的位置 3 查看jupyter notebook内核名字 可以看到jupyter notebook中内核名字叫ipykernel 4 安装ipykernel 在pycharm的terminal中 pip instal…

微服务:Rabbitmq利用jackson序列化消息为Json发送并接收

消息序列化 Spring默认会把你发送的消息通过JDK序列化为字节发送给MQ&#xff0c;接收消息的时候&#xff0c;再把字节反序列化为Java对象。 我们可以配置JSON方式来序列化&#xff0c;这样体积更小&#xff0c;可读性更高。 引入依赖&#xff1a; <dependency><g…

CV每日论文---2024.6.3

1、Video-MME: The First-Ever Comprehensive Evaluation Benchmark of Multi-modal LLMs in Video Analysis 中文标题&#xff1a;Video-MME&#xff1a;视频分析领域首个多模态法学硕士综合评估基准 简介&#xff1a;Video-MME 是一个全面评估多模态大语言模型&#xff08;M…

18、Go Gin框架中的binding验证器使用

一、binding功能介绍 Gin的binding包提供了一组功能&#xff0c;用于将请求的数据自动绑定到结构体&#xff0c;并根据结构体标签进行数据验证。常用的标签有binding和validate&#xff0c;通过这些标签可以指定数据的类型和验证规则。 常见标签 binding:"required"…

今日好料推荐(运维服务管理流程+互联网运维)

今日好料推荐&#xff08;运维服务管理流程互联网运维&#xff09; 本文内容是运维服务管理的梳理 参考资料内容&#xff1a;运维服务管理流程设计&互联网运维理论与实践 参考资料在文末获取&#xff0c;关注我&#xff0c;分享优质前沿资料&#xff08;IT、运维、编码、…

斜拉桥智慧施工数字孪生

基于图扑自主研发的 HT for Web 产品&#xff0c;利用现场照片及 CAD 图纸&#xff0c;结合 PBR 材质&#xff0c;搭建了具有赛博朋克风格的智慧斜拉桥可视化解决方案&#xff0c;精准复现斜拉桥建造规划过程&#xff0c;辅助运维人员对桥梁基建过程的网格化管理。提高桥梁的建…

【Spring Cloud Alibaba】Nacos统一配置管理

目录 回顾问题 统一配置管理配置中心的解决方案&#xff1a;Nacos的关键特性动态配置服务小结 Nacos的架构 Spring Cloud Alibaba Nacos Config1.创建项目2.添加依赖3.添加启动注解4.添加配置信息5.使用控制器类动态读取配置信息6.Nacos Server添加配置信息7.测试 Nacos Namesp…

大疆、西圣、枫笛领夹麦哪个好?大疆、西圣领夹麦克风测评对比

不知道大家有没有想过一个问题&#xff0c;为什么有些视频或直播的声音听起来那么清晰&#xff0c;仿佛身临其境&#xff1f;其实最主要的就是麦克风的原因&#xff0c;我们以前用的麦克风或多或少都会存在一些小毛病例如&#xff1a;音质不清晰、传输不稳定容易断断续续、声音…

国内PLM系统厂商,国内PLM系统哪个公司最受欢迎

国内PLM系统厂商,国内PLM系统哪个公司最受欢迎 国内PLM系统厂商中&#xff0c;要确定哪个公司的产品最受欢迎&#xff0c;需要考虑多个因素&#xff0c;包括市场份额、客户评价、技术实力、产品线完整性以及服务支持等。虽然无法直接给出一个具体的“最受欢迎”的排名&#xff…

centos7安装kubernetes v1.28.2

centos7安装kubernetes v1.28.2 一&#xff0e;环境部署 1.1基础环境配置 主机IP 主机名规划 172.17.48.15 master 172.17.48.3 node1 1.2修改机器名称 #永久修改主机名 hostnamectl set-hostname master && bash #在master上操作 hostnamectl set-hostname …

分层存储的图片的3d显示

分层存储的图片叠层成为3d&#xff0c;并显示。 文件夹D:\mask内的分层存储的图像文件&#xff1a; 1、显示为3d点云&#xff1a; import open3d as o3d import numpy as np from PIL import Imagedef convert_images_to_point_cloud(image_paths):points []for i, image_pa…

windows中安装zookeeper

https://zhuanlan.zhihu.com/p/692451839 【zookeeper】在Windows上启动zookeeper_windows启动zk-CSDN博客 Index of /apache/zookeeper/zookeeper-3.9.2 Index of /apache/zookeeper/zookeeper-3.9.2 Zookeeper的应用场景 1、配置管理 2、服务注册中心 3、主从协调 4、…

【OpenHarmony】ArkTS 语法基础 ③ ( @Component 自定义组件生命周期回调函数 | @Entry 页面生命周期回调函数 )

文章目录 一、ArkTS Component 自定义组件生命周期1、自定义组件生命周期2、aboutToAppear 函数执行时机和作用3、aboutToDisappear 函数执行时机和作用4、代码示例 二、ArkTS Entry 页面生命周期1、Entry 页面生命周期2、onBackPress 和 onPageHide 回调函数无关联 三、代码示…

【NoSQL数据库】Redis简介

Redis Redis简介 Redis关系型数据库和非关系型数据库Redis 简介redis速度快的原因 Redis 配置Linux 源码安装 关系型数据库和非关系型数据库 关系型数据库&#xff08;Relational Database&#xff09;和非关系型数据库&#xff08;Non-Relational Database&#xff09;是两种…

[个人感悟] 多线程问题应该考察哪些问题? (Java篇)

前言 “如何做一个合格的多线程开发者? 你真的懂多线程么&#xff1f;” 作为编程初学者被问的最多的问题, 本文就这个问题. 详细的讲讲对方究竟为什么要问这个问题, 并且回答问题的主要思路框架. PS: 本文主体背景为Java语言. 其他语言应当为同理. 问题 - 单线程问题 什么是…

中信建投证券信息技术部PMO高级经理张子洋受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 中信建投证券股份有限公司信息技术部PMO高级经理张子洋先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“浅谈项目管理标准化的建设及实践分享”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xff01; 议题…

[Flask]开源项目--基于Faster R-CNN的在线害虫识别系统

项目演示效果可见视频&#xff1a; 【现已开源】害虫在线识别系统-基于pytorchflaskhttps://www.bilibili.com/video/BV1yx4y1u74y/?vd_source80963105a0c8d89bb119f3ebca249b22&#xff01;&#xff01;&#xff01;---本项目仅供交流学习&#xff0c;禁止商用---&#xff0…

【外汇天眼】选择外汇EA的关键:策略适配、风险控制与稳定性评估

外汇EA&#xff08;Expert Advisor&#xff09;是外汇交易市场中广泛使用的自动化交易系统。它们通过预定义的规则和算法自动执行交易&#xff0c;旨在为交易者提供便捷的交易体验&#xff0c;同时提高交易效率和准确性。本文将从策略选择、风险控制和稳定性评估三个方面&#…