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

缓存类型以及读写策略

缓存(Cache)是一种高效的数据存储技术,旨在提高数据访问速度。

它将频繁访问或最近使用的数据临时存储在更快速但较小的存储介质(如内存)中,以减少从较慢的存储设备(如硬盘或远程服务器)读取数据的次数。以下是一些关于缓存的关键点:

缓存的分类

在系统开发中,缓存可以根据不同的维度进行分类。以下是常见的缓存分类:

根据存储介质分类

  1. 内存缓存(In-Memory Cache)

    • 示例:Redis、Memcached
    • 特点:速度快,但容量有限,适用于需要快速访问的数据。
  2. 磁盘缓存(Disk Cache)

    • 示例:本地文件系统缓存
    • 特点:速度较慢,但容量较大,适用于大数据量的缓存需求。

根据缓存层级分类

  1. 一级缓存(L1 Cache)

    • 位置:通常在CPU内部,靠近处理器核心。
    • 特点:速度最快,容量最小,用于存储最频繁访问的数据和指令。
  2. 二级缓存(L2 Cache)

    • 位置:在CPU内部或外部,介于L1缓存和内存之间。
    • 特点:速度和容量介于L1缓存和内存之间。
  3. 三级缓存(L3 Cache)

    • 位置:通常在多个CPU核心之间共享。
    • 特点:速度较慢但容量较大,适用于减少不同核心之间的数据访问延迟。

根据缓存作用范围分类

  1. 本地缓存(Local Cache)

    • 特点:缓存数据存储在本地机器上,适用于单机系统。
  2. 分布式缓存(Distributed Cache)

    • 示例:Redis Cluster、Amazon DynamoDB
    • 特点:缓存数据分布在多个机器上,适用于分布式系统,提高系统的可扩展性和容错能力。

根据数据更新策略分类

  1. 写通过缓存(Write-Through Cache)

    • 特点:数据在写入缓存的同时也写入后端存储,确保数据一致性。
  2. 写回缓存(Write-Back Cache)

    • 特点:数据首先写入缓存,只有在缓存中的数据被替换或过期时才写入后端存储,能提高写入性能,但可能导致数据一致性问题。

根据缓存淘汰策略分类

  1. LRU(Least Recently Used)

    • 特点:移除最久未使用的数据。
  2. LFU(Least Frequently Used)

    • 特点:移除访问频率最低的数据。
  3. FIFO(First In, First Out)

    • 特点:按数据进入缓存的顺序进行移除,先进入的先移除。

根据应用场景分类

  1. 浏览器缓存(Browser Cache)

    • 特点:存储网页资源(如HTML、CSS、JavaScript等),减少页面加载时间。
  2. 数据库缓存(Database Cache)

    • 示例:MySQL Query Cache、Oracle Result Cache
    • 特点:缓存数据库查询结果,提高查询性能。
  3. 应用缓存(Application Cache)

    • 示例:Spring Cache、Ehcache
    • 特点:应用程序内部实现的缓存机制,减少对后端服务的调用。

其他分类

  1. 会话缓存(Session Cache)

    • 特点:用于存储用户会话数据,如登录状态、购物车等。
  2. 对象缓存(Object Cache)

    • 特点:缓存复杂的对象或数据结构,提高对象的创建和访问速度。

常见缓存类型

在日常开发中,确实静态缓存、分布式缓存和热点本地缓存是最常见的三种缓存类型。 

常见缓存分类

静态缓存

定义:静态缓存通常用于缓存静态内容,例如HTML页面、CSS文件、JavaScript文件、图像等。它可以显著减少服务器负载和响应时间。

应用场景

  • 网页缓存:浏览器缓存网页资源,减少对服务器的请求,提高页面加载速度。
  • 内容分发网络(CDN):CDN缓存网站的静态资源,将内容分发到全球各地的边缘节点,提高用户访问速度。

实现方式

  • HTTP缓存头:使用Cache-Control、ETag、Last-Modified等HTTP头控制缓存行为。
  • 反向代理:例如Nginx、Varnish等反向代理服务器,用于缓存静态资源并响应请求。

分布式缓存

定义:分布式缓存是将缓存数据分布在多个服务器节点上,以提高系统的可扩展性和容错能力。它适用于分布式系统或高并发场景。

应用场景

  • 大规模Web应用:如社交网络、电子商务网站,需要处理大量用户请求。
  • 分布式系统:在微服务架构中,各个服务之间共享和缓存数据。

实现方式

  • Redis:高性能的分布式内存数据库,支持数据持久化和高可用集群。
  • Memcached:轻量级的分布式内存缓存系统,适用于缓存简单数据结构。

热点本地缓存

定义:热点本地缓存是指将频繁访问的数据缓存到本地内存中,以提高访问速度和减少对远程服务的依赖。通常用于单机系统或单个服务实例内。

应用场景

  • 应用程序内部缓存:如Java应用中的Ehcache、Guava Cache,用于缓存计算结果或数据库查询结果。
  • 临时数据缓存:如用户会话数据、短期有效的数据等。

实现方式

  • Ehcache:Java中常用的开源缓存框架,支持多种缓存策略和持久化。
  • Guava Cache:Google的Guava库提供的轻量级缓存实现,适用于简单缓存需求。

缓存的读写策略

选择缓存的读写策略是缓存设计中的关键步骤,它直接影响系统的性能、数据一致性和可用性。以下是几种常见的缓存读写策略及其适用场景:

1.旁路 Cache Aside

旁路策略

读旁路(Cache Read-Aside)

定义:应用程序首先从缓存读取数据,如果未命中,则从后端数据源读取,并将数据手动写入缓存。

优点

  • 简单易实现,适用于现有系统的改造。
  • 可以灵活地控制缓存更新策略。

缺点

  • 需要在应用程序中添加缓存逻辑,增加了代码复杂度。
  • 可能导致缓存与后端数据源的一致性问题。

适用场景

  • 读写操作相对均衡的场景。
  • 应用程序可以接受一定程度的数据不一致。
写旁路(Cache Write-Aside)

定义:应用程序直接将数据写入后端数据源,并删除缓存。

优点

  • 简单易实现,适用于现有系统的改造。
  • 保证后端数据源的权威性。

缺点

  • 读取操作需要额外处理缓存未命中的情况。

适用场景

  • 读操作频繁,写操作较少的场景。
  • 对数据一致性有较高要求。

2.读写穿透

读写穿透

读穿透(Cache Read-Through)

定义:当缓存未命中时,缓存系统自动从后端数据源读取数据,并将其存储在缓存中。

优点

  • 简化了应用程序的逻辑,应用只需与缓存交互。
  • 确保缓存与后端数据源的一致性。

缺点

  • 需要额外的读操作,增加了延迟。
  • 复杂性增加,可能需要定制缓存和数据源的集成。

适用场景

  • 读取频繁、写入较少的场景。
  • 需要保证数据的一致性。
写穿透(Cache Write-Through)

定义:当数据写入缓存时,缓存系统同步将数据写入后端数据源。

优点

  • 保证数据的一致性。
  • 简化应用程序的逻辑,应用只需与缓存交互。

缺点

  • 写操作需要同步到后端数据源,增加了写操作的延迟。
  • 缓存系统和后端数据源之间的同步可能会影响性能。

适用场景

  • 写操作频率较低,读取频繁的场景。
  • 需要保证数据一致性的重要数据。

3. 写回(Cache Write-Back)

写返回

定义:数据首先写入缓存,并在一定时间或条件下异步写入后端数据源。

优点

  • 提高写操作的性能,减少写入延迟。
  • 缓解后端数据源的写压力。

缺点

  • 复杂性增加,需处理缓存和后端数据源的一致性问题。
  • 可能导致数据丢失或不一致,特别是在系统崩溃或缓存失效时。

适用场景

  • 写操作频繁,需要高性能的写入场景。
  • 可以容忍一定程度的数据不一致或延迟。

如何选择合适的策略?

  1. 读写频率:分析读写操作的频率,如果读多写少,读穿透和读旁路较为适用;如果写多读少,写穿透和写回较为适用。
  2. 数据一致性要求:如果数据一致性要求高,优先考虑读穿透和写穿透策略;如果可以接受一定的一致性延迟,可以选择写回策略。
  3. 性能要求:如果对写入性能要求高,写回策略可以提高写操作的性能;如果对读取性能要求高,读穿透和读旁路可以提高读取速度。
  4. 复杂性和实现成本:考虑实现的复杂性和维护成本,选择合适的策略平衡性能和开发复杂性。

关于ArchManual

https://archmanual.com

https://github.com/yingqiangh/ArchManual

相关文章:

缓存类型以及读写策略

缓存(Cache)是一种高效的数据存储技术,旨在提高数据访问速度。 它将频繁访问或最近使用的数据临时存储在更快速但较小的存储介质(如内存)中,以减少从较慢的存储设备(如硬盘或远程服务器&#x…...

自动驾驶---Motion Planning之轨迹拼接

1 背景 笔者在之前的专栏中已经详细讲解了自动驾驶Planning模块的内容:包括行车的Behavior Planning和Motion Planning,以及低速记忆泊车的Planning。 本篇博客主要聊一聊Motion Planning中轨迹拼接的相关内容。从网络上各大品牌的车主拍摄的智驾视频来看…...

没资料的屏幕怎么点亮?思路分享

这次尝试调通一个没资料的屏幕,型号是HYT13264,这个是淘宝上面的老王2.9元屏,成色很好但是长期库存没有资料和代码能点亮,仅仅只有一个引脚定义。这里我使用Arduino Nano作为控制器尝试点亮这个模块。 首先,已知别人找…...

通信工程学习:什么是FEC前向纠错

FEC:前向纠错 FEC(Forward Error Correction,前向纠错)是一种增加数据通信可信度的技术,广泛应用于计算机网络、无线通信、卫星通信等多种数据传输场景中。其基本原理和特点可以归纳如下: 一、FEC前向纠错…...

【机器人工具箱Robotics Toolbox开发笔记(二十)】机器人工具箱SerialLink I类函数参数说明

机器人工具箱中的SerialLink表示串联机器人型机器人的具体类。该类使用D-H参数描述,每个关节一组。SerialLink I类包含的参数如表1所示。 表1 SerialLink I类参数 参 数 意 义 参 数 意 义 plot 显示机器人的图形表示 jacobn 工具坐标系中的雅可比矩阵 plot3D 显示机…...

单调栈的实现

这是C算法基础-数据结构专栏的第二十四篇文章,专栏详情请见此处。 引入 单调栈就是满足单调性的栈结构,它最经典的应用就是给定一个序列,找出每个数左边离它最近的比它大/小的数。 下面我们就来讲单调栈的实现。 定义 单调栈就是满足单调性…...

ffmpeg的安装和使用教程

在Linux上安装和使用FFmpeg可以方便地完成音视频的编码、解码、转码等操作。以下是详细的安装和使用教程。 安装FFmpeg FFmpeg的安装方法会因为不同的Linux发行版有所不同。下面是几种常见的安装方法: Ubuntu/Debian 打开终端,更新包列表并安装FFmpe…...

从计组中从重温C中浮点数表示及C程序翻译过程

目录 移码​编辑 传统浮点表示格式 浮点数的存储(ieee 754)->修炼内功 例子: ​编辑 浮点数取的过程 C程序翻译过程 移码 传统浮点表示格式 浮点数的存储(ieee 754)->修炼内功 根据国际标准IEEE&#xff0…...

MySQL常用函数(总结)详细版

1. 字符串函数 CONCAT(str1, str2, ...):将多个字符串连接成一个字符串。 SELECT CONCAT(Hello, , World); LENGTH(str):返回字符串的长度(字节数)。 SELECT LENGTH(Hello); SUBSTRING(str, pos, len):从字符串 …...

学习记录——day41 C++ 类的静态成员 static

静态成员,是类中不依赖于类对象而独立存在的成员变量,但仍然属于类,是成员的一种 静态成员的空间分配发生在出现编译阶段,不占用类的空间 静态成员分为,静态成员变量和静态成员函数 静态成员变量 1、相关概念 1&…...

JVM - Java内存区域

文章目录 目录 文章目录 运行时数据区域 程序计数器 栈 Java虚拟机栈 本地方法栈 栈帧的组成 局部变量表 操作数栈 帧数据 堆 方法区 直接内存 总结 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存区域划分为若干个不同的数据区域。这些区…...

本地电脑交叉编译ffmpeg 到 windows on arm64

本地电脑交叉编译ffmpeg 到 windows on arm64 我这里有编译好的win on arm 的 ffmpeg : https://github.com/wmx-github/ffmpeg-wos-arm64-build 使用 llvm-mingw 工具链 https://github.com/mstorsjo/llvm-mingw/releases 前缀 aarch64-w64-mingw32- 这个库是ubuntu 交叉编译…...

使用 @NotEmpty、@NotBlank、@NotNull 注解进行参数校验

使用 NotEmpty、NotBlank、NotNull 注解进行参数校验 一、前言二、依赖三、使用 NotEmpty、NotBlank、NotNull 注解进行参数校验1. NotNull2. NotEmpty3. NotBlank4. 区别与适用场景 四、实践中的应用五、总结 一、前言 在 Java 开发中,参数校验是确保数据一致性和…...

关于Qt在子线程中使用通讯时发生无法接收数据的情况

在多线程应用中,串口通讯或TCP通讯的场景常常涉及到持续的读写操作,如果子线程处理不当,可能会导致信号阻塞问题。本文将通过串口通讯或TCP通讯为例,详细解释如何在多线程环境中避免信号阻塞,并提供代码示例。 1. 问题…...

HTML:从历史演进到未来创新的网页基石

该论文为AI生成,请勿运用到正式的论文上,以下仅供参考 一、引言 1.1 研究背景 HTML(Hypertext Markup Language)作为网页构建的基础语言,在互联网的发展历程中占据着至关重要的地位。自 1993 年诞生以来&#xff0c…...

向量的叉积、点积、外积

向量的叉积、点积和外积是向量代数中非常重要的操作,用于描述向量间的关系。它们广泛应用于物理、计算机图形学、几何以及蛋白质结构分析等领域。下面对每个运算进行详细介绍,并通过 PyTorch 示例代码展示其实现。 1. 点积 (Dot Product) 点积是两个向量之间的数量积,结果…...

UNI-APP 溢出隐藏显示省略号

✍经常在项目里面使用到,又没有记住懒得找了,故此写一篇记录一下! CSS单行显示省略号 /* CSS样式 */ .ellipsis {overflow: hidden; /* 隐藏超出的内容 */text-overflow: ellipsis; /* 显示省略号 */white-space: nowrap; /* 不换行 */ } CS…...

SAP学习笔记 - 开发03 - CDSView开发环境搭建,Eclipse中连接SAP,CDSView创建

上一章讲了BTP的账号创建,环境搭建等内容。 SAP学习笔记 - 开发02 - BTP实操流程(账号注册,BTP控制台,BTP集成开发环境搭建)-CSDN博客 本章继续讲SAP开发。 - CDSView 的开发环境(Eclipse)搭建…...

uniapp写的一个年月日时分秒时间选择功能

代码: <template><view><picker mode"multiSelector" :value"multiIndex" :range"multiRange" change"onMultiChange"><view class"picker">当前选择&#xff1a;{{ formattedDateTime }}</vie…...

golang hertz框架入门

两种模式新建项目 1、手动新建项目 2、使用hz工具新建项目 一、手动创建项目&#xff0c;并拉取框架 1、新建项目目录 hertz_demo_w 2、在项目跟目录新建main.go 文件 package mainimport ("context""github.com/cloudwego/hertz/pkg/app""github.…...

G-Helper:重塑华硕硬件控制体验的轻量级开源解决方案

G-Helper&#xff1a;重塑华硕硬件控制体验的轻量级开源解决方案 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Sca…...

深入Linuxptp:ptp4l与E2E模式下的状态机与报文处理流程剖析

1. Linuxptp与ptp4l基础认知 第一次接触PTP协议时&#xff0c;我被那些专业术语搞得晕头转向。直到在实验室里用示波器抓到实际报文&#xff0c;才真正理解这个时间同步协议的精妙之处。Linuxptp作为开源实现&#xff0c;其中的ptp4l守护进程就像个尽职的交通警察&#xff0c;协…...

Kandinsky-5.0-I2V-Lite-5s从零开始:非技术用户也能3分钟生成首个5秒动态视频

Kandinsky-5.0-I2V-Lite-5s从零开始&#xff1a;非技术用户也能3分钟生成首个5秒动态视频 1. 认识Kandinsky-5.0-I2V-Lite-5s Kandinsky-5.0-I2V-Lite-5s是一款专为普通用户设计的轻量级图生视频工具。它的最大特点是简单易用——你只需要准备一张图片和一句话&#xff0c;就…...

ConvNeXt 改进 | 自研模块:LLM 的 AttnRes残差自注意力模块 + GAM 通道注意机制(Kimi 团队 2026),自研AttnRes-GAM注意力残差块 ,实现高效涨点,独家首发

本文教的是方法,也给出几种改进方法,二次创新结构,百变不离其宗,一文带你改进自己模型,科研路上少走弯路。 前言 本文解析的是由 Kimi (月之暗面) 团队发布的最新技术报告 《Attention Residuals》。在传统 Transformer 架构中,注意力模块产生的输出直接与残差流(Resid…...

ESP8266 EEPROM实战:手把手教你存WiFi密码,断电重启也不怕

ESP8266 EEPROM实战&#xff1a;构建可靠的WiFi凭证存储系统 每次重启ESP8266设备都要重新输入WiFi密码&#xff1f;这种重复劳动早就该被技术淘汰了。想象一下&#xff0c;你的智能家居设备在断电恢复后能自动重新连接网络&#xff0c;工业传感器在意外重启后依然保持通信——…...

OpenClaw技能扩展:安装Qwen3-4B专用插件实现代码生成

OpenClaw技能扩展&#xff1a;安装Qwen3-4B专用插件实现代码生成 1. 为什么需要Qwen3-4B专用技能 作为一个长期与代码打交道的开发者&#xff0c;我一直在寻找能够提升编码效率的工具。当我第一次接触OpenClaw时&#xff0c;最吸引我的不是它的基础自动化能力&#xff0c;而是…...

多功能 PEG 衍生物 Ergosterol-PEG-MAL,Ergosterol-PEG-Maleimide详解

试剂基本信息中文名称&#xff1a;麦角固醇-聚乙二醇-马来酰亚胺英文名称&#xff1a;Ergosterol-PEG-MAL&#xff0c;Ergosterol-PEG-Maleimide分子量&#xff1a;0.4k&#xff0c;0.6k&#xff0c;1k&#xff0c;2k&#xff0c;3.4k&#xff0c;5k&#xff0c;10k&#xff0c…...

LoRaFi库详解:面向SX1272/SX1273的Arduino LoRa通信开发指南

1. 项目概述LoRaFi 是一款面向 Arduino 平台的 LoRa 无线通信库&#xff0c;专为基于 Semtech SX1272/SX1273 射频芯片的硬件平台设计&#xff0c;核心适配对象为 LoRaFi 开发板&#xff08;含配套扩展板/模块&#xff09;。该库并非通用 LoRa 协议栈&#xff0c;而是聚焦于物理…...

别再手动另存为了!用Python脚本5分钟搞定上百个Excel文件的格式转换(附完整代码)

别再手动另存为了&#xff01;用Python脚本5分钟搞定上百个Excel文件的格式转换&#xff08;附完整代码&#xff09; 你是否曾经面对过这样的场景&#xff1a;电脑里堆积着上百个老旧的.xls格式Excel文件&#xff0c;每次需要使用时都得手动一个个"另存为"xlsx格式&a…...

Winhance-zh_CN:如何免费让你的Windows系统焕然一新

Winhance-zh_CN&#xff1a;如何免费让你的Windows系统焕然一新 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhance-zh_C…...