Redis教程(二十一):Redis怎么保证缓存一致性
传送门:Redis教程汇总篇,让你从入门到精通
Redis 的缓存一致性
Redis 的缓存一致性是指在使用 Redis 作为缓存层时,保证缓存中的数据与数据库中的数据保持一致的状态。在分布式系统中,数据一致性是一个重要的问题,因为可能存在多个客户端同时读写同一数据,或者数据在不同节点间需要同步更新。
在涉及缓存的场景中,保持缓存一致性面临以下挑战:
数据更新:当数据库中的数据被修改后,相关联的缓存数据需要被相应地更新或失效,以避免返回陈旧的数据。
数据失效:当缓存的数据被认定为过时(可以是时间过期,或者因为底层数据有变更)时,必须从缓存中移除,以确保下次读取会从后端数据库加载最新数据。
数据同步:在分布式缓存环境中,相同的数据可能会存储在多个缓存节点上。这就要求所有的节点在数据变化时保持同步,从而确保数据的一致性。
为了处理这些挑战,你可以采取以下几种常见的方法保证缓存一致性:
强一致性
确保缓存和数据库的写入操作是原子的,即任何时刻,所有客户端看到的数据总是最新的。在实践中,这通常需要使用分布式锁或事务来实现,但可能会带来性能上的开销。
弱一致性
接受在短时间内缓存数据可能不同步的情况,但确保在一定时间后能够达到一致性。例如,可以通过设置缓存的过期时间来自动让旧数据失效。
缓存更新策略
比如采用“写入时更新”(Write-through)、“写入后更新”(Write-behind)等策略,这些策略定义了不同的数据同步时机和方式。
维护缓存和数据库的一致性可能会很复杂,需要在数据的实时性(一致性)和系统的性能之间做权衡。正确的缓存策略和实现细节取决于具体的应用场景和对数据一致性的需求。
缓存一致性
首先,我们首先明确什么是缓存一致性:
- 缓存中有数据,那么,缓存的数据值需要和数据库中的值相同;
- 缓存中本身没有数据,那么,数据库中的值必须是最新值。
缓存同步策略
- 先更新缓存,再更新数据库;
- 先更新数据库,再更新缓存;
- 先删除缓存,再更新数据库;
- 先更新数据库,再删除缓存;
- 先删除缓存,再更新数据库,延迟一会后,再删除缓存(延迟双删);
代码实现
用一个HashMap模拟数据库存储
package com.single.conherence;import java.util.HashMap;
import java.util.Map;/*** @program: RedisDemo* @description:* @author: fudingwei* @create: 2024-05-28 11:39**/
public class DataBaseConstant {public static final Map<String,String> DATA_MAP = new HashMap<String,String>();
}
1、先更新缓存,再更新数据库
package com.single.conherence;import org.redisson.Redisson;
import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
import org.redisson.client.codec.StringCodec;
import org.redisson.config.Config;import java.util.Date;
import java.util.concurrent.TimeUnit;import static com.single.conherence.DataBaseConstant.DATA_MAP;/*** @program: RedisDemo* @description: 先更新缓存,再更新数据库,A,B两个线程* @author: fudingwei* @create: 2024-05-28 11:12**/
public class RedisTest1 {public static void main(String[] args) throws InterruptedException {//1、A更新缓存为 apple,然后出现网络延迟,A暂停//2、B过来更新缓存 peer,更新数据库 peer//3、A继续更新数据库 apple,就会导致数据不一致问题Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");StringCodec stringCodec = new StringCodec();config.setCodec(stringCodec);RedissonClient redisson = Redisson.create(config
相关文章:
Redis教程(二十一):Redis怎么保证缓存一致性
传送门:Redis教程汇总篇,让你从入门到精通 Redis 的缓存一致性 Redis 的缓存一致性是指在使用 Redis 作为缓存层时,保证缓存中的数据与数据库中的数据保持一致的状态。在分布式系统中,数据一致性是一个重要的问题,因为可能存在多个客户端同时读写同一数据,或者数据在不同…...
android apk签名
android apk签名 命令: java -jar signapk.jar platform.x509.pem platform.pk8 **.apk ***.apk note: apk密钥为: platform.pk8和platform.x509.pem 路径: build\target\product\security apk签名工具:sign…...
flutter 解析json另类封装方式 List<bean>,哈哈哈
flutter 解析json另类封装方式,哈哈哈 日常学习,仅供参考,不喜 勿喷 http请求数据泛型解析封装,需要判断泛型数据类型再根据类型解析,本文只抽取了list演示 核心代码 import dart:convert;import package:webwsyn/h…...
哈希表(Hash table)
哈希表(Hash table),也称为散列表,是一种根据关键码值(Key value)直接进行访问的数据结构。它通过散列函数(Hash function)将关键码值映射到表中的一个位置,以此来访问记录,从而加快查找的速度。以下是关于哈希表的详细解释: 基本概念 散列函数:将关键码值映射到表…...

【c语言】自定义类型-结构体
结构体 结构体的声明与使用结构体的声明与初始化结构体的自引用 结构体的内存对齐对齐规则为什么存在内存对齐修改默认对齐数 结构体的传参结构体实现位段什么是位段位段的内存分配位段的跨平台问题位段使用的注意事项 结构体:是一个自定义的类型,成员可…...
2-链表-71-环形链表 II-LeetCode142
2-链表-71-环形链表 II-LeetCode142 参考:代码随想录 LeetCode: 题目序号142 更多内容欢迎关注我(持续更新中,欢迎Star✨) Github:CodeZeng1998/Java-Developer-Work-Note 技术公众号:CodeZeng1998&#…...

【UnityShader入门精要学习笔记】第十七章 表面着色器
本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更,有始无终 我的GitHub仓库 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 表面着色器…...
Python社会经济 | 怀特的异方差一致估计量
🎯要点 🎯算法和模型底层数学及代码:🖊线性代数应用(主成分分析):降维、投影(用于求解线性系统)和二次形式(用于优化)| 🖊奇值分解…...
《被讨厌的勇气》笔记
自由就是被别人讨厌。对人而言,最大的不幸就是不喜欢自己。活在“如果怎样怎样”之类的假设之中,就根本无法改变。活在害怕关系破裂的恐惧之中,那是为他人而活的一种不自由的生活方式。人生是连续刹那,我们只能活在“此时此刻”。…...

Python爬虫协程批量下载图片
import aiofiles import aiohttp import asyncio import requests from lxml import etree from aiohttp import TCPConnectorclass Spider:def __init__(self, value):# 起始urlself.start_url value# 下载单个图片staticmethodasync def download_one(url):name url[0].spl…...
Flask Web开发基础:数据库与ORM实战
Flask Web开发基础:数据库与ORM实战 该文介绍了如何使用 Flask、SQLAlchemy 和 SQLite 实现数据库操作。首先,通过创建虚拟环境和安装 flask-sqlalchemy(版本2.5.1)及 sqlalchemy(版本1.4.47)来设置环境。接…...

pidstat -d 1分析磁盘吞吐量
iostat -dx 1 查看磁盘IO吞吐量 pidstat -d 1看是哪个进程写的...

期望20K,2年golang深圳某互联网小公司一面
后续约了二面(CTO面),需要到现场,基本没问啥具体的技术知识,都是聊规划和个人职业目标 一面 1、假设访问百度网站,从在浏览器输入网址,到最终页面展示出来,中间会发生哪些事情&…...

#02 安装指南:如何配置Stable Diffusion环境
文章目录 前言前置条件第1步:安装Python和PIP第2步:创建虚拟环境第3步:安装PyTorch和CUDA第4步:安装Stable Diffusion相关库第5步:测试环境结论 前言 在之前的文章中,我们介绍了Stable Diffusion基础入门和…...
拼多多笔试
拼多多2022数据分析笔试(0822) 一、选择题 1.已知样本量n,样本均值及方差求置信区间 2.决策树 3.峰度系数 4.协方差 5.第一、第二熵变 6.充分统计量 7.xgboost 8.方差分析中的多重比较 二、编程题 1. 一张用户点击路径的表&#x…...

Golang | Leetcode Golang题解之第119题杨辉三角II
题目: 题解: func getRow(rowIndex int) []int {row : make([]int, rowIndex1)row[0] 1for i : 1; i < rowIndex; i {row[i] row[i-1] * (rowIndex - i 1) / i}return row }...
Flutter 中的 SliverIgnorePointer 小部件:全面指南
Flutter 中的 SliverIgnorePointer 小部件:全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架,它提供了一系列的组件来帮助开发者构建高性能、美观的移动、Web 和桌面应用。在 Flutter 的滚动组件中,SliverIgnorePointer 是一个用来包…...
比较两台计算机上的LabVIEW、工具包及驱动程序的一致性
比较两台计算机上的LabVIEW、工具包及驱动程序是否相同,可以通过以下步骤实现: 1. 检查LabVIEW版本 方法一:在LabVIEW中查看版本信息 步骤: 打开LabVIEW。点击菜单栏的 Help > About LabVIEW。记录显示的LabVIEW版本号和许可…...
参考——温湿度传感器DHT11驱动_STM32
设备:stm32f407ZGT6 环境:FreeRTOS HAL 到网上找DHT11的驱动,但是都无法使用。原因是RTOS环境中,由于多线程,使用循环计数阻塞式的delay_us延时函数就没那么准,且不同设备中delay_us的计数值不一样…...
架构每日一学 14:架构师如何进行可行性探索?
架构活动中,如果不进行可行性探索可能会导致重大失误,为企业发展带来风险。 可行性探索是架构活动的最后一个节点,在这之后的架构活动就像是离弦之箭,即便发现重大风险也很难再回头了。 互联网公司之间的竞争非常激烈࿰…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...