缓存归纳总结1

1. 何时需要考虑缓存一致性

缓存一致性主要在以下情况需要特别考虑:

  • 读多写少场景:当数据读取操作远多于写入时,为了提高系统性能,通常会将数据缓存起来。但一旦数据源(如数据库)中的数据发生变化,就需要确保缓存中的数据也能得到相应的更新,以保持数据的一致性。

例子:

电商平台的商品详情页: 商品信息如价格、库存量通常读取频次远高于修改频次。当库存数量因订单生成而减少时,需要确保这一变更能快速反映到缓存中,否则用户看到的可能是过时的库存信息,导致超卖问题。此时,可以通过监听数据库的更新事件,触发缓存的更新机制来维持一致。

  • 缓存击穿:大量并发请求访问刚好过期的缓存数据,如果没有合适的处理机制,可能会导致所有请求穿透到数据库,增加数据库压力。此时,通过预先加载或使用锁机制来避免击穿问题,保证缓存与数据库的一致性。

例子:

新闻网站的热点文章: 假设某篇文章突然成为热点,其缓存过期后,短时间内有大量请求涌入,若无适当处理,会导致所有请求直接查询数据库。为避免这种情况,可以采用提前刷新策略,即在缓存即将到期前,后台任务自动重新加载数据到缓存;或者使用“逻辑过期”策略,即使缓存过期,也先返回旧数据,并异步更新缓存

  • 缓存雪崩:大量缓存同时失效,可能导致所有请求直接打到数据库上,造成数据库负载过高。设置合理的缓存过期策略(如添加随机过期时间)可以减轻雪崩效应。

例子:

社交应用的动态列表: 如果所有用户的动态数据缓存都设置了相同的过期时间,当这个时间点到达,所有请求都会直接打到数据库。为减轻这种雪崩效应,可以为不同的缓存项设置随机的过期时间范围,分散缓存失效时间点,从而避免集中失效造成的压力。

2. 何时需要用分布式锁,何时本地锁就足够了

  • 分布式锁:在分布式系统中,当多个服务实例可能同时尝试修改共享资源(如数据库记录或缓存数据)时,需要使用分布式锁。例如,在高并发场景下,为了防止缓存击穿,确保只有一个线程能执行数据库查询并更新缓存,这时候分布式锁就显得尤为重要。@Cacheable注解中的sync=true就是一个简单的基于Spring Cache的同步控制,它利用了AOP代理实现类似锁的效果,以防止并发下的数据不一致,但其粒度相对粗且依赖于框架实现。

分布式锁具体例子:

  • 秒杀系统: 在电商的秒杀活动中,成千上万的用户可能同时尝试购买同一件商品,这时需要确保库存的正确扣减。通过Redis分布式锁,可以确保同一时刻只有一个请求能够执行扣减库存的操作,其他请求则等待锁释放或失败,从而维护库存的准确性和交易的公平性。
  • 本地锁:如果应用程序运行在单个JVM中,或者操作的数据仅对当前进程可见,那么使用本地锁(如Java的synchronized关键字或ReentrantLock)就足够了。本地锁可以提供更细粒度的控制,减少锁竞争带来的性能开销。但在微服务架构中,由于服务间的独立性,本地锁无法跨越服务边界,因此对于跨服务的资源访问控制,分布式锁是必要的选择。

本地锁具体例子:

  • 单体应用的数据处理: 假设有一个单体应用负责处理报表生成任务,其中包含一个方法用于统计每日销售数据。因为这个方法可能被多个线程同时调用,使用Java的synchronized关键字或ReentrantLock可以确保在任何给定时间只有一个线程能够执行该统计逻辑,防止数据错乱。

总结来说,是否采用分布式锁取决于系统的部署架构(是否为分布式系统)、并发访问的程度以及对数据一致性的严格要求。在分布式环境下,特别是在处理全局共享资源时,分布式锁是确保数据一致性和防止并发问题的有效手段。而在单机环境或服务内部操作时,本地锁即可满足需求,实现简单且效率更高。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于YOLOv8+PySide6的快递分类管理系统

1、背景 随着电子商务的飞速发展,快递行业所承受的数据处理需求愈发庞大。在这样的背景下,传统的手工分类方法已经显得力不从心,因其不仅耗时耗力,还存在着易出错的隐患。因此,迫切需要研发出一套高效而准确的自动化系…

多线程案例(线程池)

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f649; 内容推荐:<计算坤是如何工作的>&#x1f649; &#x1f439;今日诗词:百年兴衰皆由人, 不由天&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主&…

路径规划搜路算法有哪些?

路径规划搜索算法是帮助移动机器人或自动化系统在环境中从起点导航至终点的计算方法。以下是一些常见的路径规划搜索算法&#xff1a; Dijkstra算法&#xff1a;一种经典的最短路径搜索算法&#xff0c;适用于没有负权边的图。 A*算法&#xff1a;一种启发式搜索算法&#xff…

go 微服务框架kratos使用中间件的方法

一、中间件的概念 在go语言中&#xff0c;中间件是一种用于处理http请求的开发模式&#xff0c;允许开发人员在请求到达处理程序之前或之后执行特定的操作&#xff0c;如日志记录、身份验证、错误处理等。 中间件通常是一个函数&#xff0c;它接收一个 http.Handler 作为参数…

Ardupilot开源代码之Rover上路 - 后续4

Ardupilot开源代码之Rover上路 - 后续4 1. 源由2. 深度配置2.1 设置倒车按钮2.1.1 前进2.1.2 倒退 2.2 MP无法连接ESP82662.3 最小油门校准 3. 遗留&后续3.1 高精度编码器问题3.2 OV5647 720P30FPS 马赛克问题 4. 参考资料 1. 源由 开源项目最主要的问题就是所有配置是开放…

Python模块方法总结

一 模块简介 模块&#xff08;module&#xff09;和C语言中的头文件以及Java中的包很类似&#xff0c;在Python中用关键字import来引入某个模块&#xff0c;比如要引用模块math&#xff0c;就可以在文件最开始的地方用import math来引入。 import math#这样会报错 print sqrt…

信息安全从运维到运营:CISAW安全运维方向

随着数据中心规模扩大&#xff0c;安全运维内生需要逐渐向安全运营进化&#xff0c;统一安全理念&#xff0c;提高服务意识&#xff0c;提升专业能力。安全运营是对安全运维的继承式发展&#xff0c;而不是颠覆&#xff0c;意味着以业务发展为基础&#xff0c;以事件核查为线索…

【gradle】MAC下用gradle构建部署springboot项目

MAC下用gradle构建部署springboot项目 前言下载安装配置gradle下载安装下载可能出现的问题 &#xff08;zsh: command not found: brew&#xff09; 配置环境变量配置国内下载源全局配置单个项目配置 通过idea构建项目构建后的项目结构 小结延伸 前言 好久以前就听说gradle了&…

RAG概述(一):RAG架构的演进

目录 概述 RAG核心步骤 Indexing索引 Retrieval检索 Generation生成​​​​​​​ Native RAG Advanced RAG Modular RAG 参考 概述 RAG&#xff1a;Retrieval-Augmented Generation 检索增强生成。 RAG通过结合LLMs的内在知识和外部数据库的非参数化数据&#xff…

vue实现图片懒加载

在src中创建一个directives文件夹在里面创建一个lazy.js文件 在main.js中引入 import lazy from ./directives/lazy app.directive(lazy, lazy) 在app.vue中 <script setup lang"ts"> import { RouterLink, RouterView } from vue-router import HelloWorl…

与MySQL的初相遇

&#x1f30e;初识MySQL 注&#xff1a;本文SQL语句只为了验证猜想&#xff0c;不会也不要紧。 文章目录&#xff1a; MySql开端 认识数据库       什么是数据库       主流数据库       MySQL的本质 MySQL基础使用       连接mysql服务器     …

Linux内存管理--系列文章肆

一、引子 上篇文章介绍了目标文件&#xff0c;也就是讲到编译过程中的汇编这个阶段。本篇要讲目标文件怎么变成一个可执行文件的&#xff0c;介绍编译过程中的链接。 链接主要分为两种&#xff0c;静态链接和动态链接。它们本质上的区别&#xff0c;是在程序的编译和运行过程中…

自动化您的任务——crewAI 初学者教程

今天&#xff0c;我写这篇文章是为了分享您开始使用一个非常流行的多智能体框架所需了解的所有信息&#xff1a;crewAI。 我将在这里或那里跳过一些内容&#xff0c;使本教程成为一个精炼的教程&#xff0c;概述帮助您入门的关键概念和要点 今天&#xff0c;我写这篇文章是为了…

【代码随想录训练营】【Day 31】【回溯-5】| Leetcode 491, 46, 47

【代码随想录训练营】【Day 31】【回溯-5】| Leetcode 491, 46, 47 需强化知识点 排列问题和组合分割子集问题的区别&#xff1a; 排列是讲究顺序的&#xff0c;不同顺序的组合是不同的&#xff0c;因此不能使用startIndex来限制选择顺序&#xff0c;需要used来判断是否已被选…

easy-rule规则引擎使用

简介 轻量级的规则引擎&#xff0c;易于学习的api 简单来说&#xff0c;规则引擎就是一个函数&#xff1a;yf(x1,x2,…,xn) 将业务代码和业务规则分离&#xff0c;解耦业务决策和业务代码的绑定关系 入门示例 依赖引入 <dependency><groupId>org.jeasy</grou…

页面<html>上多了一个滚动条,定位发现是<body>里面多了一个id为trans-tooltip的div

现象分析&#xff1a; 页面根标签html多了一个滚动条&#xff0c;发现body里面多了一个id为trans-tooltip的div&#xff0c;虽然width为0&#xff0c;height为0&#xff0c;但是其子元素还是有高度&#xff0c;占据了空间&#xff0c;最终导致了滚动条&#xff1b; 根本原因&…

C++ 并查集模板

搬运jiangly鸽鸽的板子 #include <iostream> #include <string> #include <vector> #include <numeric>struct DSU {std::vector<int> f, siz;DSU() {}DSU(int n) {init(n);}void init(int n) {f.resize(n);std::iota(f.begin(), f.end(), 0);s…

专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(十三)

本系列课程&#xff0c;将重点讲解Phpsploit-Framework框架软件的基础使用&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 接上一篇文章内容&#xff0c;讲述如何进行Phpsploit-Framework软件的基础使用和二次开发。 我们&#xff0c;继续讲一…

Java面试题--JVM大厂篇(1-10)

引言&#xff1a; 在这个信息时代&#xff0c;对于准备进入大厂工作的朋友们来说&#xff0c;对于JVM&#xff08;Java虚拟机&#xff09;的掌握是面试中的一项重要内容。下面是一些精选的JVM面试题&#xff0c;希望对大家能有所帮助。 正文&#xff1a; 1. JVM有哪几种垃圾收…

[CISCN2024]-PWN:gostack解析(go语言程序,syscall)

查看保护 ida比较复杂&#xff0c;建议动调配合静态分析程序运行 这里函数返回不用leave和ret&#xff0c;而是利用add rsp和ret&#xff0c;所以要动调查看到底要覆盖哪里。 完整exp&#xff1a; from pwn import* pprocess(./gostack) syscall0x4616c9 pop_rax0x40f984 po…