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

redis缓存与数据库协调读写机制设计

1.读机制:

读机制没有太大的争议点,因为缓存机制的设计,就是为了更快的命中目标数据,所以读机制先天固定好了:先去读取缓存,缓存未命中再去读取数据库。

2.写机制:

写机制其实也没什么争议点,从宏观层面上来看我们设计缓存与外部数据库的协调读写的目的就是为了快速读,为了快速读所以我们需要写缓存,因为不写缓存缓存为空,那就失去了本身的意义。所以我们一切为了快速读数据服务,自然的就围绕读机制来进行写,也就是当且仅当读取缓存未命中才进行写。

3.更新机制:

为了保证当且仅当缓存未命中时才去写对应数据到缓存的原则,所以我们不会去单独的对某一个数据内容进行更新。

为了理解当且仅当读取缓存未命中才进行写的这个原理,我们可以举几个例子来说明:

案例一——写极端案例:

如果某个数据设计前并不知道(或者设计出现失误)这个数据内容只会被写,不会被读,那么此时出现一个极端情况:数据不会按照缓存设计的初衷来进行使用。

我们刚才讲了,缓存的设计初衷(大部分情况),就是为了读,而写是为读来服务的,所以我们理所应当的将设计重心放在读,刚才的极端案例也想表明一件事,我们很难在实际应用中判断一个数据到底是读多还是写多,如果这个数据写多读少,我们对该数据进行重复写就会占用大量的时间与空间,得不偿失。

所以,我们为了避免这样的情况,就设计一个当且仅当读取缓存未命中才进行写,也就是说不会主动去重复写缓存,缓存只会在空的时候被写入,而不会被新的数据覆盖。

为了配合上述原则,同时又不得不对缓存进行更新,所以选择一个更为保守的更新机制:当缓存中有数据需要更新的时候,我们不去更新缓存数据,而是直接修改数据库,并且删除所有的相关缓存。

4.先修改数据库,再删除缓存  还是  先删除缓存,再修改数据库?

先说结论,仅使用这两个方案,面对多线程情况都会出现问题,但是前者的健壮性稍强一些。但是如果使用锁,两者皆可。

4.1假设现在有两个线程分别需要进行读与写操作,初始操作数据为X=0,采用先删除缓存,再修改数据库:
A删除缓存->
B读取缓存,未命中->
B写入缓存,X=10->
A写入数据库,X=20

显然,此时数据库与缓存数据不一致,造成上述的原因为写入数据库的时间较长,未加锁,再写入数据的间隙,被其他线程卡了bug

4.2假设现在有两个线程分别需要进行读与写操作,初始操作数据为X=0,采用先修改数据库,再删除缓存

我们看一看为什么这个方法健壮性更强一些,我们按照4.1的流程来继续套:

A修改数据库->
B读取缓存,缓存命中X=0->A删除缓存

这个逻辑看上去有问题,但实际上没有太大问题,从宏观层面来看逻辑是有问题的,因为业务A(线程A对应的业务)先执行,业务B后执行,这不符合宏观逻辑。但从微观来看,是没有问题的,因为线程B是在A修改结束前(A此时正在修改数据库,B读取了缓存,此时数据库的信息还未更新,可以看作是原来的数据库,所以可以简单的看作数据库与缓存的信息是吻合的)

所以我们只能说这个情况的健壮性稍强,至少比4.1完全错误强。

那么4.2也会有完全错误的机会:

假设此时的X为空,不管别的原因,反正现在X就是空的:

A查询查询缓存,未命中->
A查询数据库 x = 0->
B修改数据库,X=20->
B删除缓存->A添加缓存X = 0 

错误的原因还是写的速度慢,在B读取数据库

显然此时缓存与数据库的结果不一致,出现一致性原则错误。

显然4.2的条件更加苛刻。

相关文章:

redis缓存与数据库协调读写机制设计

1.读机制: 读机制没有太大的争议点,因为缓存机制的设计,就是为了更快的命中目标数据,所以读机制先天固定好了:先去读取缓存,缓存未命中再去读取数据库。 2.写机制: 写机制其实也没什么争议点…...

最悉心的指导教程——阿里云创建ECS实例教程+Vue+Django前后端的服务器部署(通过宝塔面板)

各位看官老爷们,点击关注不迷路哟。你的点赞、收藏,一键三连,是我持续更新的动力哟!!! 阿里云创建ECS实例教程 注意: 阿里云有300元额度的免费适用期哟 白嫖~~~~ 注册了阿里云账户后&#x…...

【Python】os模块

目录 🌟 前言🏗️ 技术背景与价值🩹 当前技术痛点🛠️ 解决方案概述👥 目标读者说明 🧠 一、技术原理剖析📊 核心架构图解💡 核心作用讲解🔧 关键技术模块说明⚖️ 技术选…...

Syslog 全面介绍及在 C 语言中的应用

Syslog 概述 Syslog 是一种工业标准的日志记录协议,用于在网络设备之间传递日志消息。它最早由 Eric Allman 在 1980 年代为 BSD Unix 开发,现在已成为系统和网络管理的重要组成部分。Syslog 协议允许设备将事件消息发送到中央服务器(称为 sy…...

windows中Redis、MySQL 和 Elasticsearch启动并正确监听指定端口

Redis:在 localhost 上启动,并监听端口 6379 MySQL:在 localhost 上启动,并监听端口 3306 Elasticsearch:在 127.0.0.1 上启动,并监听端口 9300 1. Redis 确保 Redis 在 localhost 上启动并监听端口 6379…...

Paimon远程文件系统连接机制解析

Paimon 在处理与远程文件系统的连接和使用方面,设计了一套灵活的抽象机制。下面将结合源代码分析 Paimon 是如何实现这一点的。 核心思想是定义一个通用的 FileIO 接口,然后为不同的文件系统提供具体的实现。对于常见的 HDFS、S3、OSS 等,Pa…...

学者观察 | Web3.0的技术革新与挑战——北京理工大学教授沈蒙

导语 沈蒙老师认为Web3.0正推动形成新型数据基础设施架构和数据要素流通机制,有望在数字经济时代发挥重要作用,对我国经济发展和社会进步将产生深远影响。AI在推动Web3.0发展方面具有巨大的潜力,但在隐私保护、公平性与安全性等方面也存在“…...

pycharm终端遇不显示虚拟环境的问题

大部分我们用pycharm会配合我们的anaconda来使用,但是配置好后,可能会出现pycharm终端不显示虚拟环境的问题。 首先是确定不显示环境,下图中如果没有这个方框,就是不显示虚拟环境。此时用pip或者conda的命令是会提示不是 “不是内…...

聊聊网络变压器的浪涌等级标准是怎样划分的呢?

Hqst盈盛(华强盛)电子导读:聊聊网络变压器的浪涌等级标准是怎样划分的呢? 在和做防雷产品的客户的深度沟通网络变压器产品选型中发现:客户对网络变压器的浪涌等级划分也很希望有更深的了解,今天就这个问题和…...

2025年Google I/O大会上,谷歌展示了一系列旨在提升开发效率与Web体验的全新功能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

ONLYOFFICE文档API:编辑器的品牌定制化

在当今数字化办公时代,文档编辑器已成为各类企业、组织和开发者不可或缺的工具之一。ONLYOFFICE 文档提供的功能丰富且强大的文档编辑 API,让开发者能够根据自己的产品需求和品牌特点,定制编辑器界面,实现品牌化展示,为…...

HTTP/HTTPS与SOCKS5三大代理IP协议,如何选择最佳协议?

在复杂多变的网络环境中,代理协议的选择直接影响数据安全、访问效率和业务稳定性。HTTP、HTTPS和SOCKS5作为三大主流代理协议,各自针对不同场景提供独特的解决方案。本文将从协议特性、性能对比到选型策略,为您揭示如何根据业务需求精准匹配最…...

远程调用 | OpenFeign+LoadBalanced的使用

目录 RestTemplate 注入 OpenFeign 服务 LoadBalanced 服务 LoadBalanced 注解 RestTemplate 注入 创建 配置类,这里配置后 就不用再重新new一个了,而是直接调用即可 import org.springframework.cloud.client.loadbalancer.LoadBalanced; import …...

NSSCTF [NISACTF 2022]ezheap

2058.[NISACTF 2022]ezheap(堆溢出) [NISACTF 2022]ezheap 1.准备 2.ida分析 main函数 int __cdecl main(int argc, const char **argv, const char **envp) {char *command; // [esp8h] [ebp-10h]char *s; // [espCh] [ebp-Ch]setbuf(stdin, 0);setbuf(stdout, 0);s (cha…...

ADB推送文件到指定路径解析

您执行的命令 adb push ota.zip /sdcard/Download 中,目标路径 /sdcard/Download 是您显式指定的,因此 ADB 会直接将文件推送到此位置。具体过程如下: 1. 命令结构解析 adb push:ADB 的推送指令。ota.zip:本地计算机上…...

【HarmonyOS Next之旅】DevEco Studio使用指南(二十七) -> 开发云函数

目录 1 -> 开发流程 2 -> 创建并配置函数 2.1 -> 创建函数 2.2 -> 配置函数 3 -> 开发函数 4 -> 调试函数 4.1 -> 前提条件 4.2 -> 通过本地调用方式调试函数 4.3 -> 通过远程调用方式调试函数 5 -> 部署函数 1 -> 开发流程 云函数…...

ansible中的inventory.ini 文件详解

1. 主机定义 主机是 Ansible 管理的最小单元,可以是 IP 或域名,支持直接定义或附加参数。 基础语法 # 直接定义主机(IP 或域名) 192.168.1.10 example.com# 定义主机并指定连接参数(如端口、用户等) web…...

基于AOD-Net与GAN的深度学习去雾算法开发

基于AOD-Net与GAN的深度学习去雾算法开发 1. 引言 1.1 图像去雾研究意义 大气散射现象导致的图像质量退化对计算机视觉应用产生严重影响… 2. 理论基础 2.1 大气散射物理模型 经典模型描述为: I ( x ) = J ( x ) t ( x...

Rust 学习笔记:闭包

Rust 学习笔记:闭包 Rust 学习笔记:闭包用闭包捕获环境闭包类型推断和注释捕获引用或移动所有权将捕获的值移出闭包和 Fn Traits Rust 学习笔记:闭包 Rust 的闭包是匿名函数,可以保存在变量中,也可以作为参数传递给其…...

c# 获取电脑 分辨率 及 DPI 设置

using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Runtime.InteropServices;/// <summary> /// 这个可以 /// </summary> class Program {static void Main(){//设置DPI感知try{SetProcessDpiAwareness(…...

基于频分复用导频的MMSE信道估计方法设计与仿真

基于频分复用导频的MMSE信道估计方法设计与仿真 摘要 本文详细研究了基于频分复用(FDM)导频的最小均方误差(MMSE)信道估计方法。首先介绍了无线通信系统中信道估计的基本原理和重要性,然后深入分析了频分复用导频结构的设计和MMSE估计算法的理论基础。我们使用Python实现了完…...

低代码开发模式下的应用交付效率优化:拖拽式交互机制研究

低代码开发平台凭借其可视化操作、快速构建、灵活扩展等核心特性&#xff0c;正在成为推动企业数字化转型的重要工具。 拖拽式开发&#xff0c;降低技术门槛 &#xff1a;图形化界面与模块化组件&#xff0c;用户无需编写复杂代码&#xff0c;只需通过简单的拖拽即可完成应用搭…...

STP配置

由于我们演示的是STP 但是华为交换机默认的都是MSTP所以要换到STP以下是方法 STP mode &#xff1f; 查看模式 STP mode stp 选择stp 换好了后配置交换机优先级 [SWA]stp priority 4096 Apr 15 2013 16:15:33-08:00 SWA DS/4/DATASYNC_CFGCHANGE:OID 1.3.6.1.4.1.2011.5…...

Linux操作系统 使用共享内存实现进程通信和同步

共享内存使用 //main.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <assert.h> #include <sys/shm.h> #include <string.h> int main() {int shmidshmget((key_t)1234,256,IPC_CREAT|0600);assert(shmid!-1);…...

如何优化微信小程序中渲染带有图片的列表(二进制流存储方式的图片存在本地数据库)

方法一&#xff1a;对列表的获取进行分页处理 实现方法&#xff1a; 前端请求&#xff08;需要向后端传两个参数&#xff0c;pageIndex是获取第几页是从0开始&#xff0c;pageSize是这一页需要获取多少个数据&#xff09; 后端接口实现&#xff08;因为这里是通过参数拼接请求…...

尝鲜纯血鸿蒙,华为国际版本暂时不支持升级。如mateX6 国际版?为什么不支持?什么时候支持?

一&#xff1a;mateX6 国际版支持鸿蒙吗&#xff1f; 不支持 二&#xff1a;华为国际版支持鸿蒙吗&#xff1f; 不支持 三&#xff1a;华为国际版什么时候支持&#xff1f; 2025年预期可以支持。请耐心等待。 三&#xff1a;国际版为什么不支持&#xff1f; EMUI 采用AO…...

《 PyTorch 2.3革新:torch.compile自动生成CUDA优化内核全解》

CUDA作为NVIDIA推出的并行计算平台和编程模型&#xff0c;为GPU计算提供了强大的支持&#xff0c;但手动优化CUDA代码不仅需要深厚的专业知识&#xff0c;而且过程繁琐、耗时费力&#xff0c;torch.compile的出现&#xff0c;犹如一道曙光&#xff0c;为解决这一困境带来了全新…...

OpenCV中的分水岭算法 (C/C++)

OpenCV中的分水岭算法 (C/C) &#x1f3de;️ 分水岭算法 (Watershed Algorithm) 是一种在图像处理和计算机视觉中广泛应用的图像分割方法。它特别适用于分离图像中相互接触或重叠的对象。其基本思想是将灰度图像看作一个地形景观&#xff0c;其中灰度值代表海拔高度。算法模拟…...

Kafka 客户端连接机制的一个典型陷阱

这是 Kafka 客户端连接机制的一个典型陷阱&#xff0c;你遇到的现象可以通过 Kafka bootstrap server 的连接策略和 broker 的 advertised.listeners 配置来精确解释。 &#x1f3af; 问题描述简化 ✅ 使用顺序为&#xff1a; 192.168.22.22:9092,192.168.22.23:9092,172.21.16…...

相机--RGB相机

教程 RGB--深度相机--激光雷达 RGB相机 原理&#xff1a; 仅捕获红&#xff08;R&#xff09;、绿&#xff08;G&#xff09;、蓝&#xff08;B&#xff09;三通道的彩色图像&#xff0c;输出2D像素矩阵&#xff0c;无深度信息。 核心作用&#xff1a; 2D视觉任务&#xff1…...