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

多级缓存设计实践

缓存是什么?

缓存技术是一种用于加速数据访问的优化策略。它通过将频繁访问的数据存储在高速存储介质(如内存)中,减少对慢速存储设备(如硬盘或远程服务器)的访问次数,从而提升系统的响应速度和性能。

缓存的基本原理是:当某个数据被请求时,系统首先检查缓存中是否已存储该数据。如果缓存中存在,则直接返回缓存中的数据,称为“缓存命中”;如果缓存中没有该数据,则从源数据存储(如数据库或远程服务器)中获取数据,并将其存入缓存,以便下次请求时使用。

缓存的常见类型:

  1. 内存缓存:将数据存储在内存中,常见的缓存系统有 Redis 和 Memcached。内存的访问速度远远高于硬盘,因此可以大幅提升性能。

  2. 磁盘缓存:将数据存储在硬盘或 SSD 中,相比内存访问较慢,但可以存储更大量的数据。适用于需要较大存储空间但对速度要求不如内存严格的场景。

  3. 浏览器缓存:网页浏览器会缓存静态资源(如图片、JavaScript 文件等)以减少重复请求,从而提高用户体验和加载速度。

  4. CDN缓存:内容分发网络(CDN)将静态内容缓存到靠近用户的边缘节点,以降低延迟,提高访问速度。

  5. 服务缓存:如Go的本地缓存
  6. MySQL缓存:change buffer 机制,查询缓存机制(已废弃)

性能比较:内存类大于磁盘类,客户端类大于服务端类,近的节点大于远的节点(存储介质&距离)

常见的缓存策略:

  1. LRU(Least Recently Used):当缓存空间不足时,优先淘汰最近最少使用的数据。(冷热数据)

  2. FIFO(First In, First Out):先进先出,最早加入缓存的数据会被优先移除。(新旧数据)

  3. TTL(Time To Live):每个缓存数据都有一个有效期,到期后会被自动清除或重新加载。(定时器机制)

  4. Write-through:每次对缓存进行修改时,同时将数据写入原始数据存储。(双写,保证数据一致性)

  5. Lazy Loading(懒加载):仅当需要时才加载数据到缓存中。(节省资源)

  6. Cache Invalidation(缓存失效):当数据源发生变化时,缓存中的数据需要被标记为无效或更新,以保持数据的一致性。(驱动更新)

示例:

Redis 提供了多种淘汰策略来处理内存达到上限时的情况。以下是 Redis 常见的淘汰策略:

  1. noeviction
    当内存不足时,Redis 不会淘汰任何数据,并且会返回错误。适用于不允许丢失数据的场景。

  2. allkeys-lru
    基于最少最近使用(LRU,Least Recently Used)算法来淘汰最不常用的键。当 Redis 达到内存限制时,会从所有的键中淘汰最少使用的键。

  3. volatile-lru
    只对设置了过期时间的键进行 LRU 淘汰。如果内存不足,Redis 会选择最久未使用的、设置了过期时间的键来删除。

  4. allkeys-random
    随机删除键,适用于在内存不足时,删除任意一个键。

  5. volatile-random
    随机删除设置了过期时间的键。它只删除有过期时间的键,不会影响没有过期时间的键。

  6. volatile-ttl
    根据过期时间(TTL,Time To Live)来淘汰键,选择即将过期的键进行删除。这种策略适用于缓存场景,删除那些快过期的键。

常见的缓存问题:

1. 缓存穿透

缓存穿透是指客户端请求的数据既不在缓存中,也不在数据库中,导致每次请求都直接访问数据库,绕过了缓存。

解决方案

  • 空缓存策略:对于不存在的数据,可以将其在缓存中设置一个空值(如 null 或特殊标记),并设置一个较短的过期时间。这样下次请求相同数据时,可以直接返回空缓存,避免每次都去数据库查询。
  • 缓存过滤:在请求数据前,进行数据验证和过滤(如验证用户输入),确保请求的数据是有效的,减少无效请求。

2. 缓存雪崩

缓存雪崩指的是缓存中的大量数据在同一时间过期,导致大量请求同时访问数据库,造成数据库压力剧增,甚至崩溃。

解决方案

  • 随机过期时间:设置缓存的过期时间时,加上随机偏差,避免多个缓存项在同一时刻过期。
  • 分布式缓存:将缓存分布到多个服务器上,避免单个缓存服务器故障导致整个缓存系统崩溃。
  • 提前加载缓存:根据访问量和数据的热点情况,提前将关键数据加载到缓存中,避免全量加载导致的瞬时压力。

3. 缓存击穿

缓存击穿是指缓存中某个热点数据过期或被删除后,有大量请求同时访问该数据,导致直接访问数据库,从而引发数据库压力过大。

解决方案

  • 加锁或队列机制:在缓存失效时,对该数据加锁或使用队列来保证同一时间只有一个请求去数据库查询并更新缓存,其他请求等待查询结果。
  • 缓存预热:可以在缓存失效前,提前加载或更新缓存,避免缓存失效后直接访问数据库。

4. 缓存一致性问题

缓存与数据库之间的数据可能会出现不一致的情况。例如,数据在数据库中更新了,但缓存没有及时更新,导致用户看到的数据是过期的。

解决方案

  • 缓存失效策略:在数据更新后,立即删除缓存中相应的条目。可以通过应用程序逻辑主动更新缓存,或者设置合适的过期时间。
  • 双写一致性:在对数据库进行修改时,同时修改缓存中的数据,确保缓存和数据库的数据一致性。
  • 延迟一致性:如果严格一致性要求不高,可以允许一定时间内缓存与数据库不一致,稍后通过后台任务同步缓存。

5. 缓存污染

缓存污染是指缓存中存入了错误、无效或不再使用的数据,这些数据会导致缓存效率下降,甚至对应用性能造成影响。

解决方案

  • 数据校验:在将数据写入缓存之前,进行有效性检查,确保缓存的数据是正确的。
  • 定期清理:定期扫描和清理缓存中的无效或过期数据,保持缓存的健康状态。
  • 合理设置缓存过期时间:缓存过期时间应根据数据的变化频率来合理设置,避免缓存存储过多过期或不常用的数据。

6. 缓存并发问题

当多个请求同时访问缓存中的同一数据时,可能会导致缓存更新的冲突,尤其是在高并发场景下,可能会造成缓存不一致或资源竞争。

解决方案

  • 使用锁机制:可以为缓存数据增加锁(如互斥锁),保证同一时间只有一个请求可以更新缓存,避免并发更新冲突。
  • 异步更新:通过异步方式更新缓存,避免长时间的同步阻塞。

7. 缓存击穿和过期

数据缓存的生命周期管理是一个复杂的问题,如果没有合理的策略,缓存中的数据可能在一段时间后过期,导致大量请求直接访问数据库。

解决方案

  • 永不过期的缓存:对于一些不容易发生变化的数据,可以设置为永不过期,避免频繁更新缓存。
  • 使用合适的缓存策略:比如定期刷新缓存、主动更新缓存等,确保缓存始终保持有效。

8. 内存溢出

当缓存数据过多,超出了缓存系统的内存限制时,可能会导致缓存系统发生内存溢出,影响系统的稳定性。

解决方案

  • 限制缓存大小:根据应用的实际需求,设置合适的缓存大小限制,避免缓存过多的数据。
  • LRU(最少最近使用)淘汰策略:对于不常使用的数据,可以采用 LRU 或其他淘汰策略来清理缓存,避免内存溢出。

9. 缓存穿透/渗透与数据泄露

在一些恶意攻击或错误请求的情况下,缓存可能会泄露敏感数据,特别是在没有加密或限制访问控制的情况下。

解决方案

  • 数据加密:对于缓存中的敏感数据进行加密存储,防止数据泄露。
  • 访问控制:根据不同用户权限设置缓存访问策略,防止不合法请求访问敏感数据。

10. 缓存更新延迟

在某些情况下,缓存更新的延迟可能会导致系统反应迟缓,特别是在高并发环境中。

解决方案

  • 异步更新缓存:对于非实时性要求非常高的场景,可以通过异步任务更新缓存,避免阻塞主流程。
  • 批量更新缓存:在数据有大批量变化时,可以采用批量更新策略,而不是频繁更新单条缓存数据。

缓存的优点:

  • 提高性能:通过减少对慢速存储的访问,缓存可以显著加快数据的读取速度。
  • 减轻服务器负担:减少对数据库或其他后端系统的请求,降低它们的负载。
  • 节省带宽:通过缓存远程内容(如网站资源或API响应),减少带宽消耗。

缓存的挑战:

  • 一致性问题:缓存中的数据可能与原始数据不同步,导致数据不一致。通常需要通过策略(如缓存失效、刷新机制)来解决这一问题。
  • 内存占用:缓存使用内存或磁盘存储,会占用一定的资源,需要合理规划和管理。
  • 缓存穿透:恶意用户可能直接绕过缓存,频繁访问源数据,从而导致源系统的压力增加。

为什么要设计多级缓存?什么是CPU的多级缓存?

CPU 多级缓存(Multi-level Cache,简称 L1/L2/L3 Cache)是为了提高 CPU 访问内存的速度而设计的一种缓存层次结构。由于直接从主内存读取数据的速度相对较慢,因此,现代 CPU 采用了多级缓存来加速数据访问,减少访问内存的延迟。CPU 多级缓存通常包括以下几层:

1. L1 缓存(一级缓存)

  • 位置:L1 缓存在 CPU 核心内,距离处理器最接近。
  • 速度:L1 缓存是所有缓存层中速度最快的,通常在几纳秒(ns)级别。
  • 容量:L1 缓存的容量较小,一般在 16KB 到 128KB 之间。
  • 用途:L1 缓存通常分为两个部分:
    • L1 数据缓存:存储数据。
    • L1 指令缓存:存储即将执行的指令。
  • 特点:L1 缓存是最小的,但也最快,主要存储当前正在处理的数据和指令。由于其速度快,L1 缓存的命中率对整体性能影响较大。

2. L2 缓存(二级缓存)

  • 位置:L2 缓存位于 CPU 核心内或与多个核心共享(这取决于 CPU 架构)。
  • 速度:L2 缓存的速度比 L1 缓存稍慢,但仍比主内存快,通常在 10 纳秒左右。
  • 容量:L2 缓存的容量比 L1 大,通常在 128KB 到几 MB 之间。
  • 用途:L2 缓存用于存储从 L1 缓存中淘汰的数据,或者那些 L1 缓存没有命中的数据。它在 L1 缓存和 L3 缓存之间起到了桥梁作用,缓解了 CPU 核心访问主内存时的瓶颈。
  • 特点:L2 缓存要比 L1 大,速度稍慢,但通常每个核心都拥有独立的 L2 缓存。

3. L3 缓存(三级缓存)

  • 位置:L3 缓存通常是多个 CPU 核心共享的缓存层级,它位于 L2 缓存之上,甚至可能在多核处理器中共享给所有核心。
  • 速度:L3 缓存的速度比 L1 和 L2 缓存慢,但仍比访问主内存快,通常在几十纳秒(ns)级别。
  • 容量:L3 缓存的容量最大,一般从几 MB 到几十 MB 不等,具体取决于处理器架构。
  • 用途:L3 缓存用于存储那些在 L1 和 L2 缓存中都未命中的数据,它起到了对多个核心的共享存储作用,帮助缓解访问主内存的压力。
  • 特点:L3 缓存是多个核心共享的,容量大但速度较慢。其设计目的是减少多个 CPU 核心之间的访问冲突和数据不一致。

4. 主内存(RAM)

当缓存(L1、L2、L3)都没有命中时,CPU 会访问主内存(RAM)。虽然主内存的存取速度比缓存慢得多(通常在几十到几百纳秒之间),但它的容量较大,能够存储更多的数据。

5. 缓存命中率和访问延迟

  • 缓存命中率:缓存命中率指的是 CPU 请求的数据在缓存中找到的概率。缓存命中率越高,CPU 能更快地从缓存中获取数据,性能表现越好。
  • 访问延迟:访问延迟是指从 CPU 发出请求到数据返回的时间。L1 缓存的访问延迟最短,而主内存的访问延迟最长。

多级缓存的设计目的

  1. 提高性能:通过层级化缓存,尽量减少 CPU 访问较慢的主内存的次数,从而提高整体计算性能。
  2. 平衡速度和容量:L1 缓存速度最快,但容量小;L3 缓存容量大,但速度较慢。通过层级缓存的设计,可以在速度和容量之间找到平衡。
  3. 减少内存带宽压力:多个级别的缓存减少了 CPU 对主内存的访问,降低了内存带宽的压力,提高了 CPU 处理能力。

多级缓存的业务实现

L1 :客户端缓存(SDK实现-Redis/服务缓存)

L2 :  服务端缓存(本地缓存)

L3:  第三方缓存(Redis)

1、在管理功能进行埋点,持久化DB数据到Redis,保证数据一致性

  • 数据双写 ,先写Redis,再写数据库,数据库失败,则回滚缓存数据(单条记录要加锁)
  • 数据检测脚本,监控redis 数据和数据库的一致性,晚上跑,自动更新修复数据

2、服务缓存- Go使用本地缓存,作为临时缓存挡住一部分请求

  • 缓存时间设置为 1 min ,配置到 Apollo,主要挡住突发流量以及热点数据流量
  • 降级处理,本地缓存失效,走Redis获取,再存储到本地缓存

3、SDK 获取时,在当前服务写缓存,缓存时间5秒

好处:

1、多级缓存机制,保证服务高可用

坏处:

1、增加维护成本

2、数据实时性变差(要看业务能否接受)

相关文章:

多级缓存设计实践

缓存是什么? 缓存技术是一种用于加速数据访问的优化策略。它通过将频繁访问的数据存储在高速存储介质(如内存)中,减少对慢速存储设备(如硬盘或远程服务器)的访问次数,从而提升系统的响应速度和…...

ElasticSearch学习笔记一

目录 1.ElasticSearch-Head如何启动 2.ElasticSearch-Head创建索引 2.1创建索引时的“分片数”和“副本数”是什么意思? 类比 1:图书馆的书架与备份 类比 2:快递分拣中心与包裹副本 总结 ​编辑 2.2如何查看现有索引的分片数和备份数 …...

A058-基于Spring Boot的餐饮管理系统的设计与实现

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看项目链接获取⬇️,记得注明来意哦~🌹 赠送计算机毕业设计600个选题ex…...

代码设计:设计模式:应对变化

文章目录 概述1.拆分代码2.解耦3.扩展总结概述 代码的设计模式主要为了应对变化 三种代码设计中应对变化的方式 1.拆分代码 2.解耦 3.扩展 1.拆分代码 减小变化对代码的影响 需要拆分代码的几种情况 1.类或方法的代码量巨大,导致代码可读性降低 2.存在复杂的代码,如…...

《Vue 路由导航:打造流畅的单页应用一》

一、Vue Router 简介 Vue Router 是什么? Vue Router 是 Vue.js 官方提供的路由管理器,用于构建单页面应用并实现页面间导航。它基于 Vue 的组件系统构建,通过配置路由将浏览器的 URL 和用户看到的内容绑定起来。当用户在应用中浏览不同页面…...

【xshell连接失败】

xshell用pem连接失败 Warning: Identity file ”open_api_test.ssh not accessible: No such file or directory. Warning: Identity file open_api_test2.pem not accessible: No such file or directory. Permission denied (publickey,gssapi-keyex,gssapi-with-mic). 搞了半…...

说说Elasticsearch拼写纠错是如何实现的?

大家好,我是锋哥。今天分享关于【说说Elasticsearch拼写纠错是如何实现的?】面试题。希望对大家有帮助; 说说Elasticsearch拼写纠错是如何实现的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Elasticsearch 中&…...

实例讲解MATLAB绘图坐标轴标签旋转

在进行绘图时需要在图片上添加上做标轴的标签,但是当数据量比较多时,例如一天24小时的数据,这时把每个小时显示在左边轴的标签上,文字内容放不下,因此需要将坐标轴标签旋转一定的角度,这样可以更好在图形上…...

Win10+Ubuntu20.04双系统重装Ubuntu22.04单系统

从去年 8 月美化 Ubuntu 系统后一直存在内核错误问题,但因为大部分功能还能正常使用,只是在 apt 时报错,所以一直逃避不想重装,直到最近 12 月新的开始,恰好设置的界面打不开得重装 gnome ,所以下定决心重装…...

eBPF:现代Linux的强大内核扩展技术

eBPF:现代Linux的强大内核扩展技术 eBPF(Extended Berkeley Packet Filter)是一项变革性的技术,它为Linux内核提供了一个灵活的、可编程的方式来处理数据包过滤、网络监控、安全性和系统性能分析等多种任务。 1. eBPF简介 1.1 …...

深度学习-52-AI应用实战之基于Yolo8的目标检测自动标注

文章目录 1 YOLOv81.1 YOLOV8的不同版本1.2 可检测类别1.3 数据说明1.4 网络结构1.5 算法核心步骤2 目标检测的基本原理2.1 安装yolov8(cpu版本)2.2 图片检测2.3 视频检测2.4 自动标注2.5 保存标注结果3 参考附录1 YOLOv8 YOLOv8是一种前沿的计算机视觉技术,它基于先前YOLO版…...

人工智能工作流程概述:从数据到智能决策

目录 一、引言 二、人工智能工作流程概述 (一)数据收集 (二)数据预处理 (三)模型选择与设计 (四)模型训练 (五)模型评估 (六)模…...

Jenkins升级到最新版本后无法启动

1. 场景还原 最近在web界面将jenkins升级到最新版本后,后台无法启动jenkins服务,服务状态如下: 运行jenkins命令提示invalid Java version jenkins --version jenkins: invalid Java version: java version "1.8.0_202" Java(TM)…...

.net core MVC入门(三)——Product页面添加

文章目录 项目地址一、Product数据库准备 项目地址 教程作者&#xff1a;教程地址&#xff1a; 代码仓库地址&#xff1a; 所用到的框架和插件&#xff1a; dbt airflow一、Product数据库准备 添加Product的EF上下文 public DbSet<Category> Categories { get; set; …...

【Java基础】笔记

List和ArrayList区别 public class Arrays_BugDemo {public static void main(String[] args){/** List 是一个固定大小的列表&#xff0c;虽然可以进行查询操作&#xff0c;但不支持添加、删除或修改元素。* 如果需要一个可以动态修改的列表&#xff0c;可以使用 ArrayList 进…...

Docker 进阶指南:常用命令、最佳实践与资源管理

Docker 进阶指南&#xff1a;常用命令、最佳实践与资源管理 Docker 作为一种轻量级的容器化技术&#xff0c;已经成为现代软件开发和部署不可或缺的工具。本文将为您深入介绍 Docker 的常用命令、最佳实践以及如何有效管理容器资源&#xff0c;帮助您更好地在 Ubuntu 22.04 或…...

C++编写静态库

1、新建项目创建静态库staticLib1. demoStaticLib.h #pragma once class ArrayTool { public:int Max(const int* lpHead, const int nLength);int Sum(const int* lpHead, const int nLength); }; demoStaticLib.cpp #include "pch.h" #include "demoStati…...

oracle数据库日常操作

1、执行SQL语句后不显示PL/SQL procedure successfully completed set feedback off; 2、显示实例名称 echo "set sqlprompt \"_user_connect_identifier> \"" >> $ORACLE_HOME/sqlplus/admin/glogin.sql 3、客户端尝试连接到服务器时发生超时 …...

行驶证 OCR 识别API接口的影响因素

一、影响因素 (一)证件质量与图像质量 行驶证的质量对OCR 识别 API 界面的效果有重要影响。清晰的文件可以使识别系统准确地捕获文本信息&#xff0c;而模糊的文本可能会导致识别错误。而且不同地区、不同年份的行驶证在字体、排版、格式等方面可能存在差异&#xff0c;甚至可…...

什么是TCP/IP和UDP

TCP/IP和UDP都是网络协议&#xff0c;用于不同计算机或设备之间的通信。它们的作用是定义数据如何在网络上传输&#xff0c;但它们在传输方式、可靠性和效率上有显著的区别。 1. TCP/IP TCP/IP&#xff08;传输控制协议/互联网协议&#xff0c;Transmission Control Protocol…...

1074 Reversing Linked List (25)

Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K3, then you must output 3→2→1→6→5→4; if K4, you must output 4→3→2→1→5→6. Input Specif…...

layui table 纵向滚动条导致单元格表头表体错位问题

我用的时layui2.6.8版本 历史项目维护&#xff0c;bug给我让我做了&#xff0c;本来利用前端手段强解决&#xff0c;后来发现很多table 找了解决办法 打开layui-v2.6.8/lay/modules/table.js 如果打开后时压缩的代码 直接搜索 e.find(".layui-table-patch") …...

算法基础 - 求解非线性方程(牛顿法)

文章目录 1. 前言2. 牛顿迭代算法2.1. 基本思想2.2. 如何求解 x12.3. 如何求解 x22.4. 收敛性2.5. 编码实现2.5.1. 递归实现2.5.2. 非递归实现 1. 前言 前文介绍了如何使用“高斯消元法”求解线性方程组。本文秉承有始有终的态度&#xff0c;继续介绍“非线性方程”的求解算法。…...

[C#]C#实现数字到人民币大写金额的转换

在软件开发中&#xff0c;将数字转换成人民币大写形式的需求通常出现在需要生成财务报表、发票、收据、账单等正式文档的场景中。这些文档往往需要遵循一定的格式和规范&#xff0c;以确保信息的准确性和可读性&#xff0c;特别是在处理与金钱相关的数据时。 比如&#xff1a; …...

Base64.cv:高效安全的在线Base64转换工具详解

在日常开发中&#xff0c;Base64编解码是一个非常常见的需求。本文将介绍一款优秀的在线Base64转换工具&#xff1a;Base64.cv。 工具特点 1. 性能优势 采用浏览器原生API&#xff0c;转换速度快本地运算&#xff0c;无服务器延迟支持大容量文本处理 2. 安全性 纯客户端处…...

前端面试热门题(二)[html\css\js\node\vue)

Vue 性能优化的方法 Vue 性能优化的方法多种多样&#xff0c;以下是一些常用的策略&#xff1a; 使用v-show替换v-if&#xff1a;v-show是通过CSS控制元素的显示与隐藏&#xff0c;而v-if是通过操作DOM来控制元素的显示与隐藏&#xff0c;频繁操作DOM会导致性能下降。因此&am…...

施耐德电气:多维解构AI挑战,引领产业创新变革

CSDN 看到&#xff0c;大模型正在掀起一场智能化革命&#xff0c;带来计算、开发、交互三大范式全面升级和转换&#xff0c;其中 AI 计算范式正在从图灵、冯诺伊曼计算范式转为神经网络计算范式。AI 技术仍在快速发展&#xff0c;AI 算力基础设施的数据中心如果仍走“堆资源、堆…...

Unity的GPU Instancing技术

首先新建一个场景&#xff0c;添加一个相机&#xff0c;并创建一个Render Texture给相机。 然后在相机上挂载以下脚本TestBatches &#xff0c;同时脚本的Inspector面板的Mesh中选择Cube&#xff0c;另外创建一个新的材质拖动给mat&#xff1a; public class TestBatches : M…...

JVM指令集概览:基础与应用

写在文章开头 在现代软件开发中,Java 语言凭借其“一次编写,到处运行”的理念成为了企业级应用的首选之一。这一理念的背后支撑技术正是 Java 虚拟机(JVM)。JVM 是一个抽象的计算机,它实现了 Java 编程语言的各种特性,并且能够执行编译后的字节码文件。了解 JVM 的工作原…...

使用 Redis Stream 结合 Redission DelayedQueue 实现延迟消息队列(已上线生产)

一、Redis Stream 介绍 Redis Stream 是 Redis 5.0 版本新增加的数据结构&#xff0c;作为一种轻量级的消息队列&#xff0c;Redis Stream 作为一种轻量级的消息队列&#xff0c;适合资源有限或对性能要求较高的场景。 Redis Stream 主要用于消息队列&#xff08;MQ&#xff…...

时频转换 | Matlab基于递归图Reccurence Plots一维数据转二维图像方法

目录 基本介绍程序设计参考资料获取方式 基本介绍 时频转换 | Matlab基于递归图Reccurence Plots一维数据转二维图像方法 程序设计 clear clc close allfs 6400 ; % 数据采样频率 N 5120; % 信号的点数% 生成时间向量 t (0:N-1) / fs; % 生成正弦信号 x sin(2 * pi * 15…...

《手写Spring渐进式源码实践》实践笔记 (第二十一章 将ORM框架整合到Spring容器中)

文章目录 第二十一章 ORM框架整合Spring背景目标设计实现代码结构类图实现步骤 测试事先准备属性配置文件测试用例测试结果&#xff1a; 总结 第二十一章 ORM框架整合Spring 背景 MyBatis-Spring 能够实现 MyBatis 与 Spring 框架的无缝集成。它使得 MyBatis 能够参与 Spring…...

数据库管理-第267期 23ai:Oracle Data Redaction演示(20241128)

数据库管理267期 2024-11-286 数据库管理-第267期 23ai&#xff1a;Oracle Data Redaction演示&#xff08;20241128&#xff09;1 示例表及数据2 创建编校策略2.1 名字全编校2.2 电话部分编校 3 DML演示3.1 场景13.2 场景2 总结 数据库管理-第267期 23ai&#xff1a;Oracle Da…...

NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测,含优化前后对比

NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测&#xff0c;含优化前后对比 目录 NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测&#xff0c;含优化前后对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介…...

第六届国际科技创新学术交流会暨管理科学信息化与经济创新发展(MSIEID 2024)

重要信息 大会官网&#xff1a;msieid2024.iaecst.org &#xff08;点击了解大会&#xff0c;参会等内容&#xff09; 大会时间&#xff1a;2024年12月6-8日 大会地点&#xff1a;中国-广州 大会简介 随着全球化和信息化的不断深入&#xff0c;管理科学、信息化和经济发展…...

【计算机视觉算法与应用】模板匹配、图像配准

目录 1. 基于灰度值的模板匹配 2. 基于相关性的模板匹配 3. 基于形状的模板匹配 4. 基于组件的模板识别 5. 基于形变的模板匹配 6. 基于描述符的模板匹配 7. 基于点的模板匹配 性能比较 模板匹配的算法实现需要结合具体需求和应用场景来选择方法。以下是基于 OpenCV 的…...

HHO-CNN-BiGRU-Attention哈里斯鹰优化算法卷积神经网络结合双向门控循环单元时间序列预测,含优化前后对比

HHO-CNN-BiGRU-Attention哈里斯鹰优化算法卷积神经网络结合双向门控循环单元时间序列预测&#xff0c;含优化前后对比 目录 HHO-CNN-BiGRU-Attention哈里斯鹰优化算法卷积神经网络结合双向门控循环单元时间序列预测&#xff0c;含优化前后对比预测效果基本介绍模型描述程序设计…...

数据并行、模型并行与张量并行:深度学习中的并行计算策略(中英双语)

中文版 数据并行、模型并行与张量并行&#xff1a;深度学习中的并行计算策略 随着深度学习模型的不断增大&#xff0c;单个计算节点&#xff08;例如单个 GPU&#xff09;的计算和内存能力逐渐成为了限制训练效率和模型规模的瓶颈。为了应对这些挑战&#xff0c;深度学习社区…...

大数据-239 离线数仓 - 广告业务 测试 FlumeAgent 加载ODS、DWD层

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…...

Python中的数据结构深入解析:从列表到字典的优化技巧

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! Python是一门以易用性和可读性著称的高级编程语言,其内置的数据结构为开发者提供了强大的工具,但了解其底层实现及性能优化策略却常被忽略。本文深入探讨Python中的核心数据结构,包括列表(list)、元组…...

【JS】JS判断数据类型

typeof // typeof 后面括号有没有都可以 console.log(typeof(a)) // string console.log(typeof(123)) // number console.log(typeof(undefined)) // undefined console.log(typeof(true)) // boolean console.log(typeof(Symbol(123))) // symbolconsole.log(typeof(null)) /…...

基于jmeter+perfmon的稳定性测试记录

软件测试资料领取&#xff1a;[内部资源] 想拿年薪40W的软件测试人员&#xff0c;这份资料必须领取~ 软件测试面试刷题工具领取&#xff1a;软件测试面试刷题【800道面试题答案免费刷】 1. 引子 最近承接了项目中一些性能测试的任务&#xff0c;因此决定记录一下&#xff0c…...

【0351】Postgres内核 Open WAL segment(包含 WAL 位置 ‘RecPtr’)(2 - 4)

上一篇: 文章目录 1. 打开 WAL Segment2. Standby mode 由一个 状态机(state machine)实现2.1 何处获取 WAL 文件?2.1.1 XLogSource2.1.2 从所选源(XLogSource )读取 XLOG2.1.2.1 walreceiver 运行状态 ?2.1.3 readFile(XLOG 文件句柄)1. 打开 WAL Segment 在经过前…...

Mysql基础

什么是关系型数据库&#xff1f; 顾名思义&#xff0c;关系型数据库&#xff08;RDB&#xff0c;Relational Database&#xff09;就是一种建立在关系模型的基础上的数据库。关系模型表明了数据库中所存储的数据之间的联系&#xff08;一对一、一对多、多对多&#xff09;。 …...

Altium Designer学习笔记 24 PCB初始布局2

基于Altium Designer 23学习版&#xff0c;四层板智能小车PCB 更多AD学习笔记&#xff1a;Altium Designer学习笔记 1-5 工程创建_元件库创建Altium Designer学习笔记 6-10 异性元件库创建_原理图绘制Altium Designer学习笔记 11-15 原理图的封装 编译 检查 _PCB封装库的创建Al…...

【从0学英语】形容词性/名词性物主代词是什么?

在英语中&#xff0c;物主代词是非常重要的语法概念之一&#xff0c;特别是对于初学者来说。理解形容词性物主代词和名词性物主代词的不同&#xff0c;能够帮助我们在日常对话中准确地表达拥有关系。在这篇文章中&#xff0c;我们将深入探讨这两个概念&#xff0c;并通过详细的…...

hhdb数据库介绍(10-29)

管理 数据备份 从存储节点或灾备机房数据备份 选择灾备机房类型、从库&#xff08;双主备库&#xff09;存储节点类型进行备份&#xff0c;页面根据选择类型&#xff0c;对应给出提示信息。发起备份时&#xff0c;检测从存储节点状态是否符合备份条件。 主从数据一致性检测…...

springboot(20)(删除文章分类。获取、更新、删除文章详细)(Validation分组校验)

目录 一、删除文章分类功能。 &#xff08;1&#xff09;接口文档。 1、请求路径、请求参数。 2、请求参数。 3、响应数据。 &#xff08;2&#xff09;实现思路与代码书写。 1、controller层。 2、service接口业务层。 3、serviceImpl实现类。 4、mapper层。 5、后端接口测试。…...

实战指南:理解 ThreadLocal 原理并用于Java 多线程上下文管理

目录 一、ThreadLocal基本知识回顾分析 &#xff08;一&#xff09;ThreadLocal原理 &#xff08;二&#xff09;既然ThreadLocalMap的key是弱引用&#xff0c;GC之后key是否为null&#xff1f; &#xff08;三&#xff09;ThreadLocal中的内存泄漏问题及JDK处理方法 &…...

Spark 内存管理机制

Spark 内存管理 堆内内存和堆外内存 作为一个 JVM 进程&#xff0c;Executor 的内存管理建立在 JVM(最小为六十四分之一&#xff0c;最大为四分之一)的内存管理之上&#xff0c;此外spark还引入了堆外内存&#xff08;不在JVM中的内存&#xff09;&#xff0c;在spark中是指不…...