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

redis的缓存更新策略以及如何保证redis与数据库的数据一致性

redis的缓存更新策略有这么几种:

1、由应用直接和redis以及数据库相连接:
        查询数据时,应用去redis中查询,查不到的话再由应用去数据库中查询,并将查询结果放在redis;
        更新数据时,由应用去触发redis数据的删除以及数据库的update。
2、应用只跟redis相连接,redis跟数据库连接:
        查询时,应用去redis中查,查不到的话,由redis去数据库中查,将查询到的结果缓存在redis并返回给应用;
        更新时,由应用去更新redis,并且由redis将数据同步到数据库。
3、应用只跟redis相连接,redis跟数据库连接:
        查询数据时,由应用去redis中查询;
        更新数据时,由应用更新到redis中之后就返回,redis异步将数据更新到数据库。
4、应用只跟redis连接,后台服务跟数据库连接:
        查询数据时,由应用去redis中查询;
        由后台服务自动将数据库中的最新数据更新到redis。


        需要注意的是,第一种更新策略,无论是先删除redis中的数据还是先update数据库,都会存在redis中出现脏数据的问题。

        比如:如果我们先删redis再update数据库,那么可能某个请求1删完redis了,还没来得及update 数据库,有另外一个请求2到达要进行查询这条数据,请求2在redis中查不到,就去db查,在db中查到了旧数据,并将旧数据再次放进redis,在请求1完成db的update之后,redis和db出现了数据不一致的情况,redis中出现了脏数据。
        再比如,有一条数据在redis中不存在,在db中存在,有两个请求同时到达,请求1要查询这条数据,请求2要更新这条数据,请求1在redis中未查到这条数据,所以去db查,这时请求2还未完成对于db的更新,所以请求1在db中查到了旧数据,这时请求2完成了db的update,并且删除了redis中的数据[当然现在redis中还是没有这条数据,也就无数据可删],在请求2完成了redis的删除动作之后,请求1将手里之前查到的旧数据又放进了redis。

        解决这个问题,可以用延迟双删策略。


延迟双删策略:

        对于更新操作分三步:先删redis缓存 -> 再update数据库 -> 延迟N秒之后,再删一次redis缓存。

        之所以有第三步,是为了将在这期间其他请求存进redis中的脏数据删除,所以这个延迟时长一定要控制好,延迟必须大于向redis中执行一次写操作的耗时,以便保证在其他请求将脏数据向redis写完成之后再删,否则删了也没效果。但是这个N我们即便是控制得再好也无法完全避免redis的脏数据问题,因为有可能其他的向redis进行脏数据的写请求因为网络等原因而耗时延长,最终导致脏数据还是写进了redis。

        延迟双删策略只能在很大程度上解决redis的脏数据问题,让redis与db达到最终一致性,但不能完全避免,想要完全避免这种情况,可以使用同步锁,让整个的数据更新操作同步执行。

相关文章:

redis的缓存更新策略以及如何保证redis与数据库的数据一致性

redis的缓存更新策略有这么几种: 1、由应用直接和redis以及数据库相连接: 查询数据时,应用去redis中查询,查不到的话再由应用去数据库中查询,并将查询结果放在redis; 更新数据时&#xff…...

k8s--使用cornJob定时执行sql文件

CronJob apiVersion: batch/v1beta1 kind: CronJob metadata:name: hello spec:schedule: "0 * * * *"jobTemplate:spec:template:spec:containers:- name: postgres-alpineimage: xxxximagePullPolicy: IfNotPresentcommand:- psql- -h- 数据库服务地址- -d- 数据库…...

Qt事件过滤器

1 介绍 事件过滤器是一种机制,当某个QObject没有所需要的事件功能时,可将其委托给其它QObject,通过eventFilter成员函数来过滤实现功能。 2 主要构成 委托: ui->QObject1->installEventFilter(QObject2); eventFilter声明 …...

Java基础集合框架学习(上)

文章目录 初识基础框架为什么使用集合框架集合框架的继承关系ArrayList入门案例单元测试和增删改查单元测试的注意事项LinkedList入门案例ArrayList底层是数组LinkedList底层是链表ArrayList和LinkedList选型ArrayList存放DOG对象 初识基础框架 Java基础集合框架是Java编程语言…...

北京多铁克FPGA笔试题目

1、使用D触发器来实现二分频 2、序列检测器,检测101,输出1,其余情况输出0 module Detect_101(input clk,input rst_n,input data, //输入的序列output reg flag_101 //检测到101序列的输出标志 );parameter S0 2d0;S1 2d1;S2 2d2;S4 …...

从初学者的角度来理解指针常量和常量指针

重新理解指针常量,常量指针 应用 我先提一个问题:知道指针常量,常量指针存在的作用是什么吗? 先了解它们存在的作用再去理解它们,或许更轻松些。 比如配置文件读取:在许多工程中,配置文件用于…...

C# OpenCvSharp 去水印 图像修复

效果 项目 VS2022.net4.8OpenCvSharp4 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; usi…...

考研算法第40天:众数 【模拟,简单题】

题目 本题收获 又是一道比较简单的模拟题,就不说解题思路了,说一下中间遇到的问题吧,就是说cin输入它是碰到空格就停止输入的,详细的看下面这篇博客对于cin提取输入流遇到空格的问题_while(cin) 空格_就是那个党伟的博客-CSDN博…...

MySQL:内置函数、复合查询和内外连接

内置函数 select 函数; 日期函数 字符串函数 数学函数 其它函数 复合查询(多表查询) 实际开发中往往数据来自不同的表,所以需要多表查询。本节我们用一个简单的公司管理系统,有三张 表EMP,DEPT,SALGRADE来演示如何进行多表查询…...

【HTML】label 标签

在HTML中&#xff0c;<label> 标签用于为表单元素创建标签文本或标题。它可以与输入字段&#xff08;如文本框、单选按钮、复选框等&#xff09;和其他表单元素关联起来&#xff0c;以提高可用性和可访问性。 <label> 元素有两种常见的用法&#xff1a; 包裹方式…...

python视频流截图(按帧数)

一、安装opencv计算机视觉库 pip install opencv-python二、视频流截图 1、读取视频文件&#xff0c;获取视频帧数 import cv2 # 视频位置 video_path path_file_name # 读取视频 cap cv2.VideoCapture(video_path) # 获取视频总帧数 frame_count cap.get(cv2.CAP_PROP_F…...

MongoDB SQL

Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。C:\Users\Administrator>cd C:\MongoDB\Server\3.4\binC:\MongoDB\Server\3.4\bin> C:\MongoDB\Server\3.4\bin> C:\MongoDB\Server\3.4\bin>net start MongoDB 请求的…...

node js连接mysql数据库

首先&#xff0c;确保你已经安装了 mysql2 模块。如果没有安装&#xff0c;可以使用以下命令进行安装&#xff1a; npm install mysql2创建一个 Node.js 脚本&#xff0c;例如 connectToMysql.js&#xff0c;并使用以下代码&#xff1a; const mysql require(mysql2);// 创建…...

通过Python模拟计算附近WIFI密码,没有我蹭不到的网

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 今天来分享一下如何通过 Python 脚本实现 WIFI 密码的自动猜解 无图形界面 先来看看怎么实现没有图形界面版的自动猜解。 WIFI猜解 导入模块 import pywifi from pywifi import const import time import datetime测试连…...

ubuntu20.04 远程桌面配置记录【亲测好用】

简介 ubuntu系统下有好几种不同方式的远程桌面方式&#xff0c;本人都使用过&#xff0c;以下是一些使用总结&#xff1a; vnc4server&#xff1a;其中vnc4server对gnome桌面支持不好 vino&#xff1a;系统自带&#xff0c;但需要用户登录一次后才能远程&#xff0c;并且需要安…...

解决selenium的“can‘t access dead object”错误

目录 问题描述 原因 解决方法 示例代码 资料获取方法 问题描述 在python执行过程中&#xff0c;提示selenium.common.exceptions.WebDriverException: Message: TypeError: cant access dead object 原因 原因是代码中用到了frame,获取元素前需要切换到frame才能定位到…...

Docker Dockerfile 使用方法

目录 Dockerfile 介绍 Dockerfile 示例 Dockerfile 介绍 当使用Docker构建容器化应用程序时&#xff0c;Dockerfile是一个用于定义容器镜像的文本文件。它包含了一系列指令&#xff0c;告诉Docker如何从基础镜像&#xff08;通常是官方或自定义的操作系统镜像&#xff09;构…...

(6)(6.3) 复合连接的故障处理

文章目录 6.3 复合连接的故障处理 6.4 相关话题 6.3 复合连接的故障处理 带有 F7 或 H7 处理器并有 CAN 接口的自动驾驶仪使用的固件提供两个 USB 接口。一个用于正常的 MAVLink 连接&#xff0c;一个用于 SLCAN 串行连接到 CAN 接口进行配置和固件更新。这被称为复合型 USB…...

报考红帽认证难不,红帽认证考试容易吗?

红帽认证是由红帽Linux公司推出的&#xff0c;红帽培训和测试非常注重培养实际的动手实战能力&#xff0c;主要包括RHCSA认证、RHCE认证和RHCA认证&#xff0c;每个等级的认证都是层层递进的。 要想参加RHCA认证就必须通过RHCE认证&#xff0c;且认证证书在有效期内方可参加。 …...

如何优雅地用VS编写C#代码——快捷键的使用

F4&#xff1a;打开属性面板 F5&#xff1a;调试 CtrlF5&#xff1a;直接执行&#xff0c;不挑食 F9&#xff1a;设置、切换断点 F10&#xff1a;逐过程 F11&#xff1a;逐语句 F12&#xff1a;转到定义 AltF12&#xff1a;查看定义 CtrlF&#xff1a;查找 CtrlKCtrlK&…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...