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

深入了解架构中常见的4种缓存模式及其实现

4种缓存模式

随着应用程序的复杂性日益增加,缓存管理变得至关重要。缓存不仅能有效减轻数据库负载,还能显著提升数据访问速度。选择合适的缓存模式能够在不同的业务场景下发挥出最佳效果。

本文将详细介绍四种常见的缓存模式:Cache-Aside (旁路缓存)Read-Through (透读缓存)Write-Through (透写缓存) 和 Write-Back / Write-Behind (写后缓存),并通过代码示例深入剖析它们的实现。

1.Cache-Aside (旁路缓存)

概述

Cache-Aside(旁路缓存)模式,又叫 Lazy-Loading(懒加载)模式,在这种模式下,缓存的读取和写入由应用程序直接管理。应用程序首先尝试从缓存中读取数据,若缓存未命中,则从数据库中加载数据并将其存储在缓存中;对于更新操作,应用程序直接更新数据库,并更新或删除缓存中的相关数据。

在这里插入图片描述

工作流程:

  • 读取数据:
    1. 应用程序查询缓存。
    2. 如果缓存命中,返回缓存数据。
    3. 如果缓存未命中,应用程序从数据库加载数据,并将其存入缓存。
  • 更新数据:
    1. 应用程序直接更新数据库。
    2. 然后,应用程序更新或删除缓存中的数据。

优缺点:

优点:

  • 灵活:开发者可以根据需求选择从缓存或数据库读取数据。
  • 减少数据库负载,提高访问速度。
  • 简单易于实现,开发者可以完全控制缓存管理。

缺点:

  • 需要手动管理缓存,增加了开发和维护的复杂度。
  • 存在缓存一致性问题,需要小心处理缓存的清除和更新。

适用场景

适用于读取频繁但更新较少的数据。例如,用户信息、商品详情、广告推荐等。

代码示例

import java.util.HashMap;
import java.util.Map;public class CacheAside {private Map<String, String> cache = new HashMap<>();private Map<String, String> database = new HashMap<>();public String getFromCacheOrDatabase(String key) {String data = cache.get(key);if (data == null) {data = database.get(key);cache.put(key, data);}return data;}
}

2. Read-Through (透读缓存)

概述

Read-Through 模式下,缓存层自动管理数据的读取。当应用程序请求数据时,缓存层会先检查缓存,如果缓存命中则直接返回数据;如果缓存未命中,则缓存层自动从数据库加载数据,并将数据存入缓存。
Read-Through

工作流程:

  1. 应用程序请求数据。
  2. 如果缓存中存在数据,直接返回数据。
  3. 如果缓存中没有数据,缓存系统会从数据库加载数据,并将数据存入缓存。

独立设计缓存层

  • 缓存层实现:需要一个独立的缓存系统(如 Redis、Memcached)。缓存系统需要能够在数据未命中时,自动从数据库加载数据,并缓存这些数据。
  • 缓存一致性:通常需要通过缓存管理器来控制数据过期、更新和一致性。

优缺点:

优点:

  • 简化了应用程序的逻辑,应用程序无需关心数据是从缓存还是数据库加载。
  • 减少了数据库的负担,提升了系统性能。

缺点:

  • 增加了对缓存层的依赖,缓存层需要具备高可用性和强大的扩展性。
  • 当缓存未命中时,可能会造成缓存层和数据库的负载增加。

适用场景

适用于需要快速访问并且能够容忍一定程度缓存一致性问题的应用场景,比如商品数据、用户会话等。

代码示例

import java.util.HashMap;
import java.util.Map;public class ReadThrough {private Map<String, String> cache = new HashMap<>();private Map<String, String> database = new HashMap<>();public String getFromCacheOrReadThroughDatabase(String key) {String data = cache.get(key);if (data == null) {data = database.get(key);cache.put(key, data);}return data;}
}

Cache-Aside(旁路缓存)和Read-Through(透读缓存)的区别

Cache-Aside (旁路缓存)

数据访问方式:

  • 在Cache-Aside模式中,应用程序首先查询缓存,如果缓存中不存在所需数据,则从数据库中获取数据,并将数据存储到缓存中。应用程序负责直接操作缓存。
    缓存更新策略:
  • 数据更新时,应用程序负责更新缓存。这意味着数据的写入和更新操作会首先更新数据库,然后再更新缓存。缓存中的数据通常在需要时才会被更新。
Read-Through (透读缓存)

数据访问方式:

  • 在Read-Through模式中,应用程序直接查询缓存,如果缓存中不存在所需数据,则缓存系统会负责从数据库中获取数据,并将数据存储到缓存中。应用程序并不直接操作缓存。
    缓存更新策略:
  • 数据更新时,缓存系统会负责更新缓存。当数据发生变化时,缓存系统会自动更新缓存,确保缓存中的数据与数据库中的数据保持一致。
区别总结
  • Cache-Aside模式中,应用程序负责读取和写入缓存,而Read-Through模式中,缓存系统负责从数据库中读取数据并更新缓存。
  • 在Cache-Aside中,数据更新时需要应用程序负责更新缓存,而在Read-Through中,缓存系统会自动更新缓存以保持数据一致性。
  • Cache-Aside适用于读取频率高、写入频率低的场景,而Read-Through适用于需要保证数据一致性的场景。

3. Write-Through (透写缓存)

概述

Write-Through 模式要求数据在写入时同时更新缓存和数据库。当应用程序写入数据时,数据首先写入缓存,然后立即写入数据库。这种模式保证了缓存中的数据始终与数据库中的数据一致

Write-Through

工作流程:

  1. 应用程序写入数据。
  2. 数据首先写入缓存。
  3. 然后,数据被同步写入数据库。

独立设计缓存层:

  • 缓存层实现:需要一个缓存层,在写数据时同步更新缓存和数据库。这样可以确保缓存中的数据与数据库中的数据保持一致。

优缺点:

优点:

  • 保证了缓存和数据库中的数据一致性。
  • 每次数据更新时,都会更新缓存,避免了缓存过期问题。

缺点:

  • 写操作会增加缓存层和数据库的负担,可能影响性能。
  • 相对于其他模式,写入操作的延迟较高。

适用场景

适用于数据一致性要求较高的场景,如库存管理、金融交易等。

代码示例

import java.util.HashMap;
import java.util.Map;public class WriteThrough {private Map<String, String> cache = new HashMap<>();private Map<String, String> database = new HashMap<>();public void writeToCacheAndDatabase(String key, String value) {cache.put(key, value);database.put(key, value);}
}

4. Write-Back / Write-Behind (写后缓存)

概述

Write-Back(写后缓存)模式下,应用程序先将数据写入缓存,而不立即写入数据库。数据在缓存中更新后,定期或按需将更新后的数据异步写入数据库。这种模式的好处是减少了写操作的延迟,提高了性能,但需要处理数据同步的问题。

在这里插入图片描述

工作流程:

  1. 应用程序将数据写入缓存。
  2. 数据更新首先写入缓存,而不直接写入数据库。
  3. 缓存会定期或异步地将数据写入数据库。

独立设计缓存层:

  • 缓存层实现:需要一个独立的缓存层,该层不仅处理数据读取,还负责缓存数据的写入。为了确保数据最终一致性,通常会使用异步操作将缓存中的数据写回数据库。

优缺点:

优点:

  • 提高了写操作的性能,减少了对数据库的写入压力。
  • 写操作的延迟较低,因为数据只写入缓存。

缺点:

  • 需要处理缓存与数据库的数据同步问题,确保最终一致性。
  • 如果缓存数据未及时写入数据库,可能导致数据丢失。

适用场景

适用于不需要即时写入数据库的场景,例如日志收集、批量数据更新等。

代码示例

import java.util.HashMap;
import java.util.Map;public class WriteBack {private Map<String, String> cache = new HashMap<>();private Map<String, String> database = new HashMap<>();private Map<String, Boolean> dirtyMap = new HashMap<>();public void writeToCache(String key, String value) {cache.put(key, value);dirtyMap.put(key, true);}public void writeToDatabase(String key) {if (dirtyMap.getOrDefault(key, false)) {String data = cache.get(key);database.put(key, data);dirtyMap.put(key, false);}}
}

Read-Through(透读缓存)与 Write-Through(透写缓存)和 Write-Back(写后缓存)相比的优势和劣势

Read-Through(透读缓存)的优势:
  • 数据一致性:Read-Through模式可以确保缓存中的数据与数据库中的数据保持一致。
  • 简化应用逻辑:应用程序无需关心缓存的更新,缓存系统负责从数据库中读取数据并更新缓存,简化了应用的逻辑。
  • 减少数据库负载:通过缓存数据,可以减少对数据库的频繁访问,降低数据库负载,提高系统性能。
Read-Through(透读缓存)的劣势:
  • 读取延迟:如果数据不在缓存中,需要从数据库中获取数据并更新缓存,可能会增加读取数据的延迟。
  • 频繁读取场景下不够高效:对于频繁读取的数据,如果每次都要从数据库中获取数据,可能会降低系统性能。
  • 数据更新时的一致性延迟:数据更新后,缓存中的数据需要等到下一次读取时才会被更新,可能导致一段时间内的数据不一致。
总结:

Read-Through适合对数据一致性要求较高的场景,但可能存在读取延迟和频繁读取效率不高的问题。在选择缓存模式时,应根据具体业务需求和系统特点来权衡各种因素,选择最适合的缓存模式。

其他

下面介绍一下其他变种策略,感兴趣可以自己去搜索,这里不再详细介绍。

Write Around

Write Around策略是一种变体的写入策略,当数据被更新时,仅更新底层数据存储,而不更新缓存,缓存的数据只有在被读取时才会更新

Refresh-ahead

Refresh-ahead 是一种缓存预取策略,旨在提高系统的响应速度,尤其是在可预测的访问场景下,与其他缓存策略的被动性不同,refresh-ahead通过主动预测未来可能会被访问的数据,提前从主存储载入缓存中,从而减少未来请求时的缓存未命中率(Cache Miss)。


总结

除了 Cache-Aside (旁路缓存) 模式外,其他三种模式(Read-Through (透读缓存)Write-Through (透写缓存)Write-Back / Write-Behind (写后缓存))通常需要独立设计缓存层,或者通过专门的服务来封装缓存的读写操作。具体来说,这三种模式都需要一个完整的封装机制来处理数据的访问和缓存的一致性问题。

缓存策略是优化系统性能的重要工具,不同的缓存模式适用于不同的场景。理解这些模式的工作原理、优缺点和适用场景有助于在开发中选择最合适的缓存策略。

  • Cache-Aside:由应用程序自己管理缓存,提供灵活性,适合复杂业务逻辑。
  • Read-Through:在缓存缺失时从主存取数据并更新缓存,适合读多写少场景。
  • Write-Through:实时在缓存和主存同步写数据,保证一致性但写入稍慢。
  • Write-Back:先写缓存,后续批量写入主存,提升写性能,但最终一致性难以保证。选择应根据性能需求和一致性要求平衡。

选择合适的缓存模式,能够在提高性能的同时,确保系统的稳定性和数据一致性

相关文章:

深入了解架构中常见的4种缓存模式及其实现

4种缓存模式 随着应用程序的复杂性日益增加&#xff0c;缓存管理变得至关重要。缓存不仅能有效减轻数据库负载&#xff0c;还能显著提升数据访问速度。选择合适的缓存模式能够在不同的业务场景下发挥出最佳效果。 本文将详细介绍四种常见的缓存模式&#xff1a;Cache-Aside (…...

python pyqt5 优秀的开源项目

目录 1. Qutebrowser 2. Anki 3. Calibre 4. Spyder 5. Leo Editor 6. Trelby 7. Eric IDE 8. Fman 9. Gramps 10. OpenShot 使用 PyQt5 开发的优秀开源项目涵盖了各种应用领域,包括桌面应用、开发工具、教育软件等。以下是一些值得关注的 PyQt5 开源项目: 1. Qut…...

【C++】关系操作符的全面解析与高级应用

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;关系操作符1.关系操作符的分类与语义2.关系操作符的连用问题3.浮点数比较的精度问题问题示例解决方案 &#x1f4af;总结核心要点 &#x1f4af;小结 &#x1f4af;前言 在…...

Git进行版本控制的VS项目中特定配置

在使用Git进行版本控制的VS&#xff08;Visual Studio&#xff09;项目中&#xff0c;通常有一些文件和目录是不需要提交到仓库中的。这些文件通常是编译生成的输出、临时文件、用户特定配置等。为了告诉Git忽略这些文件&#xff0c;你应该编辑或创建一个.gitignore文件&#x…...

Linux Ubuntu 安装配置RabbitMQ,springboot使用RabbitMQ

rabbit-Ubuntu 一篇文章学会RabbitMQ 在Ubuntu上查看RabbitMQ状态可以通过多种方式进行&#xff0c;包括使用命令行工具和Web管理界面。以下是一些常用的方法&#xff1a; 1-使用systemctl命令&#xff1a; sudo systemctl start rabbitmq-server sudo systemctl status ra…...

MongoDB数据建模小案例

MongoDB数据建模小案例 朋友圈评论内容管理 需求 社交类的APP需求,一般都会引入“朋友圈”功能,这个产品特性有一个非常重要的功能就是评论体系。 先整理下需求: 这个APP希望点赞和评论信息都要包含头像信息: 点赞列表,点赞用户的昵称,头像;评论列表,评论用户的昵称…...

基于MATLAB野外观测站生态气象数据处理分析实践应用

1.本课程基于MATLAB语言 2.以实践案例为主&#xff0c;提供所有代码 3.原理与操作结合 4.布置作业&#xff0c;答疑与拓展 示意图&#xff1a; 以野外观测站高频时序生态气象数据为例&#xff0c;基于MATLAB开展上机操作&#xff1a; 1.不同生态气象要素文件的数据读写与批处理…...

《三角洲行动》游戏安全组件运行时发生异常1-0-0,是什么原因?以及要如何解决?

《三角洲行动》游戏安全组件异常1-0-0深度探讨 今天你们安全撤离了吗&#xff1f;在《三角洲行动》这款经典射击游戏里&#xff0c;游戏安全组件运行时发生异常1-0-0的原因及解决方案&#xff0c;并借此机会分享一些有关文件丢失、文件损坏和系统报错等问题的通用解决策略。希…...

VAS1260Q奇力LED驱动芯片DCDC降压恒流可替代Diodes8860

VAS1260Q是一款专为车规级LED照明设计的连续模式电感降压驱动器&#xff0c;能够高效地驱动单个或多个串联LED。它集成了高端输出电流检测电路&#xff0c;并通过外部电阻设置标称平均输出电流&#xff0c;具有高可靠性和宽广的应用场景。 核心技术参数 1. 输入电压范围…...

leetcode-88.合并两个有序数组(易理解)

双指针 为了合并两个已排序的数组 nums1 和 nums2&#xff0c;并将结果存储在 nums1 中&#xff0c;我们可以采用双指针的方式从后向前进行合并。这种方法的好处是可以避免在nums1中移动元素&#xff0c;从而提高效率。 算法步骤 初始化三个指针&#xff1a; p1 指向 nums1 的…...

github操作学习笔记

git开源的分布式版本控制系统&#xff1a; 每次修改文件提交后&#xff0c;都会自动创建一个项目版本 查看git版本看有没有安装成功&#xff1a;git --version 把默认编辑器设置成vim&#xff1a;git config --global core.editor "vim" 1、设置昵称和邮箱&#xff…...

基于Hadoop大数据音乐推荐系统的设计与实现

摘 要 各种主流的音乐平台都为用户提供了的大量的音乐&#xff0c;让他们时刻都能沉浸在音乐的海洋之中。然而&#xff0c;过多的音乐往往使用户眼花缭乱&#xff0c;很难发现他们真正所需要的。一套优秀的推荐系统&#xff0c;可以很好地解决这个问题&#xff0c;既能帮助用户…...

【Linux】冯诺依曼体系结构

目录 一、冯诺依曼体系结构二、冯诺依曼体系结构的基本组成三、关于冯诺依曼体系结构的一些问题结尾 一、冯诺依曼体系结构 冯诺依曼体系结构&#xff0c;也称为普林斯顿结构&#xff0c;是现代计算机设计的基础框架。这一体系结构由数学家冯诺依曼在20世纪40年代提出&#xf…...

2025计算机毕设选题推荐【小程序方向】【基础功能+创新点设计】

✅博主介绍&#xff1a;CSDN毕设辅导博主、CSDN认证 Java领域优质创作者 ✅技术范围&#xff1a;主要包括Java、Vue、Python、爬虫、小程序、安卓app、大数据、机器学习等设计与开发。 ✅主要内容&#xff1a;免费功能设计、开题报告、任务书、功能实现、代码编写、论文编写和…...

CSS系列(3)-- 定位与文档流详解

前端技术探索系列&#xff1a;CSS 定位与文档流详解 &#x1f4cd; 致读者&#xff1a;掌握页面布局的精髓 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 CSS 定位与文档流&#xff0c;这是掌握页面布局的关键所在。通过本文&#xff0c;你将全面理解各种定位…...

【书生大模型实战营】Linux 基础知识-L0G1000

前言&#xff1a;书生大模型实战营是上海人工智能实验室开展的大模型系列实践活动&#xff0c;提供免费算力平台&#xff0c;学员通过闯关式任务&#xff0c;可获得免费算力和存储&#xff0c;助力项目实践。本期是第4期&#xff0c;时间从十一月份开始&#xff0c;持续到十二月…...

小程序IOS安全区域优化:safe-area-inset-bottom

ios下边有一个小黑线&#xff0c;位于底部的元素会被黑线阻挡 safe-area-inset-bottom 一 用法及作用&#xff1a; IOS全面屏底部有小黑线&#xff0c;位于底部的元素会被黑线阻挡&#xff0c;可以使用以下样式&#xff1a; .model{padding-bottom: constant(safe-area-ins…...

STM32-C语言基础知识

C语言基础知识 stdint.h简介 给寄存器某个位赋值 给位6赋值为1流程&#xff1a;先清0&#xff0c;再赋值 带参数的宏定义 建议使用do {…}while(0)来构造宏定义 条件编译 条件编译后面必须跟宏语句&#xff0c;如#if _LED_H 指针使用常见的2大问题 1、未初始化 2、越界使…...

深度和法线纹理

屏幕后期处理效果的基本原理就是当游戏画面渲染完毕后通过获取到该画面的信息进行额外的效果处理 之前的边缘检测、高斯模糊、Bloom、运动模糊等效果都是基于获取当前屏幕图像中的像素信息进行后期处理的 如果仅仅根据像素信息来进行一些效果处理&#xff0c;存在以下问题&…...

21天掌握javaweb-->第11天:前端性能优化与响应式设计

前端性能优化与响应式设计 1. 前端性能优化技巧 1.1 代码分割&#xff08;Code Splitting&#xff09; 代码分割是一种将代码拆分成多个较小的包&#xff0c;并在需要时按需加载的技术&#xff0c;这有助于减少初始加载时间&#xff0c;并提高应用程序的响应速度。 实现方法…...

java+ssm+mysql校园物品租赁网

项目介绍&#xff1a; 使用javassmmysql开发的校园物品租赁网&#xff0c;系统包含管理员、用户角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;用户管理&#xff1b;物品管理&#xff08;物品种类、物品信息、评论信息&#xff09;&#xff1b;订单管理&#xff1…...

C#常见错误—空对象错误

System.NullReferenceException&#xff1a;未将对象引用设置到对象的实例 在C#编程中&#xff0c;System.NullReferenceException是一个常见的运行时异常&#xff0c;其错误信息“未将对象引用设置到对象的实例”意味着代码试图访问一个未被初始化或已被设置为null的对象的成…...

GPT系列模型简要概述

GPT-1&#xff1a;&#xff08;0.117B参数量&#xff0c;0.8B words预训练数据) 动机&#xff1a; 在RNN和Transformer之间&#xff0c;选择了后者。 和《All your need is Attention》翻译模型的Encoder-Decoder架构相比&#xff0c;只保留Decoder&#xff0c;因此去掉了Cross…...

关于睡懒觉

我们经常听到一个词&#xff1a;睡懒觉。 我认为&#xff0c;睡懒觉这个词&#xff0c;是错误的。 人&#xff0c;是需要睡眠的&#xff0c;睡不够&#xff0c;就不会醒。睡够了&#xff0c;自然会醒&#xff0c;也不想继续睡。不信你试试&#xff0c;睡够了&#xff0c;你…...

Spring Data JPA 入门

文章目录 前言、Spring Data JPA 是什么&#xff1f;1、背景2、优势3、Spring Data JPA 和 MyBatis-Plus 对比4、Spring Data JPA 与 JPA 的关系是什么&#xff1f; 一、准备1、依赖引入Spring Boot 框架依赖引入&#xff1a;非 Spring Boot 框架依赖引入&#xff1a; 2、定义实…...

操作系统用户界面

实验目的&#xff1a; LINUX操作系统提供了图形用户界面和命令行界面&#xff0c;本实验主要熟悉命令行界面&#xff0c;为后续的实验编程做准备。 二、实验内容&#xff1a; 写出每个命令的功能及格式 1、有关目录和文件操作的命令 1.1cat 功能&#xff1a; 1.一次显示整…...

区块链dapp 开发详解(VUE3.0)

1、安装metamask 插件。 2、使用封装的工具包: wagmi . 3、 wagmi 操作手册地址:connect | Wagmi 4、注意事项&#xff1a; 因为最初是react 版本&#xff0c;所以在VUE版的官方文档有很多地方在 import 用的是 wagmi,需要改为 wagmi/vue 。 连接成功后打印的内容如下&…...

BTC密码学原理

文章目录 比特币的密码学基础哈希函数&#xff08;Hash Function&#xff09;非对称加密&#xff08;Asymmetric Cryptography&#xff09;数字签名&#xff08;Digital Signature&#xff09; 工作量证明&#xff08;Proof of Work&#xff09;区块链技术的密码学保障区块链的…...

【NLP 9、实践 ① 五维随机向量交叉熵多分类】

目录 五维向量交叉熵多分类 规律&#xff1a; 实现&#xff1a; 1.设计模型 2.生成数据集 3.模型测试 4.模型训练 5.对训练的模型进行验证 调用模型 你的平静&#xff0c;是你最强的力量 —— 24.12.6 五维向量交叉熵多分类 规律&#xff1a; x是一个五维(索引)向量&#xff…...

Linux -文件系统的备份

本文为Ubuntu Linux操作系统- 第九弹~~ 今天接着上文的内容&#xff0c;讲Linux磁盘存储管理最后一部分内容~ 上期回顾&#xff1a;Linux 图形界面工具管理磁盘分区和文件系统 &#x1f60e;黑犀铠甲合体&#xff0c;流星枪之狂瀑扎帖&#xff0c;碎魔伏暴&#xff0c;灭于狂瀑…...

【Linux基础五】Linux开发工具—上(apt和vim)

【Linux基础五】Linux开发工具—上&#xff08;apt和vim&#xff09; 1.apt包管理工具2.Linux中的编辑器vim2.1命令模式2.2插入模式2.3底行模式2.4替换模式2.5视图模式2.6多线程操作2.7配置vim 1.apt包管理工具 在 Linux 系统中&#xff0c;软件包管理工具是用户安装、更新和管…...

力扣--LCR 134.Pow(x,n)

题目 实现 pow(x, n) &#xff0c;即计算 x 的 n 次幂函数&#xff08;即&#xff0c;xn&#xff09;。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&#xff1a;1024.00000 示例 2&#xff1a; 输入&#xff1a;x 2.10000, n 3 输出&#xff1a;9.2610…...

java抽奖系统(一)2.0

1. 项⽬介绍 1.1 背景 随着数字营销的兴起&#xff0c;企业越来越重视通过在线活动来吸引和留住客⼾。抽奖活动作为⼀种有效的营 销⼿段&#xff0c;能够显著提升⽤⼾参与度和品牌曝光率。于是我们就开发了以抽奖活动作为背景的Spring Boot项⽬&#xff0c;通过这个项⽬提供⼀…...

读取电视剧MP4视频的每一帧,检测出现的每一个人脸并保存

检测效果还不错,就是追踪有点难做 import cv2 import mediapipe as mp import os from collections import defaultdict# pip install msvc-runtime# 初始化OpenCV的MultiTracker # multi_tracker = cv2.MultiTracker_create() # multi_tracker = cv2.legacy.MultiTracker_cre…...

【MySQL 进阶之路】事务并发情况分析

MySQL事务并发控制分析笔记 在数据库系统中&#xff0c;事务并发控制至关重要&#xff0c;能够确保多个事务并发执行时的数据一致性、隔离性和正确性。MySQL通过不同的锁机制控制并发操作&#xff0c;以确保事务的隔离性。以下是对事务A和事务B并发行为的详细分析&#xff0c;…...

基于SSM的线上考试系统的设计与实现(计算机毕业设计)+万字说明文档

系统合集跳转 源码获取链接 一、系统环境 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以 tomcat环境&#xff1a; Tomcat 7.x,8.x,9.x版本均可 操作系统…...

redis击穿,穿透,雪崩以及解决方案

目录 击穿 解决方案一 解决方案二 穿透 解决方案 雪崩 解决方案 击穿 指的是单个key在缓存中查不到&#xff0c;去数据库查询&#xff0c;这样如果并发不大或者数据库数据量不大的话是没有什么问题的。 如果数据库数据量大并且是高并发的情况下那么就可能会造成数据库压…...

Flask返回中文Unicode编码(乱码)解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

EasyExcel改名为FastExce做了那些改变呢

回到&#xff1a;github原作者地址&#xff1a;https://github.com/CodePhiliaX/fastexcel 中文 |English | 什么是 FastExcel FastExcel 是由原 EasyExcel 作者创建的新项目。2023 年我已从阿里离职&#xff0c;近期阿里宣布停止更新 EasyExcel&#xff0c;作者他本人决定继…...

数据结构之初始二叉树(1)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 目录 树型结构 树的概念 与树的有关概念 树的表示形式 树的应用 二叉树 概念 两种特殊的…...

利用Python爬虫按图搜索淘宝商品(拍立淘)

在当今数字化时代&#xff0c;能够通过图片搜索商品的功能&#xff08;如淘宝的“拍立淘”&#xff09;为用户提供了极大的便利。本文将详细介绍如何利用Python爬虫技术实现按图搜索淘宝商品&#xff0c;并提供相应的代码示例。 1. 拍立淘功能简介 “拍立淘”是淘宝提供的一项…...

微信小程序中使用miniprogram-sm-crypto实现SM4加密攻略

在微信小程序开发过程中&#xff0c;数据安全至关重要。本文将为大家介绍如何在微信小程序中使用miniprogram-sm-crypto插件进行SM4加密&#xff0c;确保数据传输的安全性。 一、SM4加密简介 SM4是一种对称加密算法&#xff0c;由国家密码管理局发布&#xff0c;适用于商密领…...

基于注解的方式实现分布式锁的AOP功能

使用场景&#xff1a; 在分布式项目中&#xff0c;涉及到事务&#xff0c;且会操作多张表&#xff0c;那么涉及到并发场景&#xff0c;应当避免同一时间有多个用户并发操作同一份数据&#xff0c;例如&#xff1a;商品秒杀。 解决方案&#xff1a; 使用Around注解实现在方法…...

22. 五子棋小游戏

文章目录 概要整体架构流程技术名词解释技术细节小结 1. 概要 &#x1f50a; JackQiao 对 米粒 说&#xff1a;“今天咱们玩个五子棋小游戏&#xff0c;电脑与你轮流在一个 nn 的网格上放置棋子&#xff08;X 或 O&#xff09;&#xff0c;网格由你输入的正整数n决定&#xff0…...

import是如何“占领满屏“

import是如何“占领满屏“的&#xff1f; 《拒绝使用模块重导&#xff08;Re-export&#xff09;》 模块重导是一种通用的技术。在腾讯、字节、阿里等各大厂的组件库中都有大量使用。 如&#xff1a;字节的arco-design组件库中的组件&#xff1a;github.com/arco-design… …...

传奇996_53——后端ui窗口局部刷新

描述&#xff1a;一个大窗口&#xff0c;点击某个键&#xff0c;弹出小窗口。 小窗口中将msg存进变量中 大窗口中判断一个参数是否为null&#xff0c;如果不为null&#xff0c;说明界面不是第一次打开&#xff0c;而是被刷新了。就加上小窗口的那个变量 有时小窗口中还有其他…...

云原生API网关:2024年的性能与智能化突破

API网关已经成为现代应用世界的流量控制器&#xff0c;并正在成为现代应用架构的重要组成部分。然而&#xff0c;自成立以来&#xff0c;他们的角色发生了巨大变化。它们正在减轻重量&#xff0c;变得更加可编程&#xff0c;并与云原生环境携手合作。 让我们来探索这一激动人心…...

专题二十五_动态规划_两个数组的 dp (含字符串数组)_算法专题详细总结

目录 动态规划_两个数组的 dp &#xff08;含字符串数组&#xff09; 1. 最⻓公共⼦序列&#xff08;medium&#xff09; 解析&#xff1a; 1. 状态表⽰&#xff1a; 2. 状态转移⽅程&#xff1a; 3. 初始化&#xff1a;​编辑 4. 填表顺序&#xff1a;​编辑 5. 返回值…...

day09 接口测试(5)——使用postman 完成项目实战

【没有所谓的运气&#x1f36c;&#xff0c;只有绝对的努力✊】 目录 1、项目简介 2、技术栈 2.1 技术栈 2.2 技术架构图 3、初始化项目环境&#xff01;&#xff01;&#xff01; 3.1 新建用例集 3.2 创建环境变量 3.3 登录模块 3.3.1 从测试用例文档提取数据 3.3.2…...

【Solidity】变量详解:类型、作用域与最佳实践

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Solidity变量详解&#xff1a;类型、作用域与最佳实践引言1. 变量的类型与声明1…...