缓存类型以及读写策略

缓存(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

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

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

相关文章

4G模块、WIFI模块、NBIOT模块通过AT指令连接华为云物联网服务器(MQTT协议)

MQTT协议概述 MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,它被设计用来提供一对多的消息分发和应用之间的通讯,尤其适用于远程位置的设备和高延迟或低带宽的网络。MQTT协议基于客户端-服务器架构&…

iOS——方法交换Method Swizzing

什么是方法交换 Method Swizzing是发生在运行时的,主要用于在运行时将两个Method进行交换,我们可以将Method Swizzling代码写到任何地方,但是只有在这段Method Swilzzling代码执行完毕之后互换才起作用。 利用Objective-C Runtimee的动态绑定…

网络编程学习:TCP/IP协议

TCP/IP协议简介 TCP/IP协议包含了一系列的协议,也叫TCP/IP协议族(TCP/IP Protocol Suite,或TCP/IP Protocols),简称TCP/IP。 分层结构 为了能够实现不同类型的计算机和不同类型的操作系统之间进行通信,引…

Zookeeper基本原理

1.什么是Zookeeper? Zookeeper是一个开源的分布式协调服务器框架,由Apache软件基金会开发,专为分布式系统设计。它主要用于在分布式环境中管理和协调多个节点之间的配置信息、状态数据和元数据。 Zookeeper采用了观察者模式的设计理念,其核心…

在vscode中用virtual env的方法

vscode是非常常用的软件开发工具。我们也非常了解如何使用vscode开发python的基本方法。当然,vscode可以开发基本所有编程语言。真的是又大又全又好用。 那么为什么要在vscode里面使用virtual env呢?因为python开发会遇到包管理的问题。而virtual env可…

Flutter 小技巧之 Row/Column 即将支持 Flex.spacing

事实上这是一个相当久远的话题,如果对于前因后果不管兴趣,直接看最后就行。 这个需求最早提及应该是 2018 年初在 #16957 被人提起,因为在 Flutter 上 Wrap 有 runSpacing 和 spacing 用于配置垂直和水平间距,而为什么 Colum 和 …

C++ | Leetcode C++题解之第392题判断子序列

题目&#xff1a; 题解&#xff1a; class Solution { public:bool isSubsequence(string s, string t) {int n s.size(), m t.size();vector<vector<int> > f(m 1, vector<int>(26, 0));for (int i 0; i < 26; i) {f[m][i] m;}for (int i m - 1; …

C语言第一周课

目录 1.程序设计的基本概念是什么?C语言是什么?算法是什么? 2.开发环境 3.第一个C语言程序 4.搭建VC6编译环境 5.实际操作,完成第一个C语言程序 6.体验在线编译环境 1.程序设计的基本概念是什么?C语言是什么?算法是什么? C语言是一种较早的程序设计语言&#xff0c…

Linux第十一节课 - 进程

一个程序从磁盘以文件的形式加载到内存之后&#xff0c;已经变成了进程&#xff01; 引入管理者和被管理者 1、管理者和被管理者不需要见面&#xff01;&#xff08;例如学生和校长&#xff01;&#xff09; 2、管理者在不见被管理者的情况下&#xff0c;如何做好管理呢&…

Windows下Python和PyCharm的应用(二)__快捷键方式的设定

前言 程序写久了&#xff0c;难免会形成自己的编程习惯。比如对某一套快捷键的使用&#xff0c;已经形成了肌肉记忆。 为了方便快捷键的使用&#xff0c;可以在PyCharm中设置自己喜欢的快捷键。 我比较习惯于微软Visual Studio的快捷键设置。&#xff08;因为早些年VC开发用的…

计算机网络与Internet应用

一、计算机网络 1.计算机网络的定义 网络定义&#xff1a;计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享…

数据仓库技术选型方案文档

关联博客&#xff1a; 数据仓库技术选型方案文档 Flink CDC MySQL数据同步到Doris表同步配置生成工具类 新版报表系统&#xff08;明细报表、看板、数据大屏&#xff09;方案&介绍 文章目录 数据仓库技术选型背景现状现状架构目标架构业务反馈&痛点问题&#xff1a;原因…

QT定时器QObiect/QTimer

QT定时器 一、QObiect: startTimer ----------- killTimer 电子相册&#xff0c;利用定时器轮播图片 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);picID …

【C++11】类的新功能

【C11】类的新功能 文章目录 【C11】类的新功能一、移动构造和移动赋值的特点二、类成员变量初始化三、强制生成默认函数的关键字default四、禁止生成默认函数的关键字delete五、继承和多态中的fifinal与override关键字 一、移动构造和移动赋值的特点 ​ 默认成员函数&#xf…

对一个已经运行的LabVIEW VI进行控制

要对一个已经运行的LabVIEW VI进行控制&#xff0c;可以采用多种方法&#xff0c;这取决于你想要控制的内容以及具体的应用场景。以下是几种常见的实现方式&#xff1a; 1. 使用全局变量或功能全局变量&#xff08;FGV&#xff09; 方法: 你可以创建全局变量或功能全局变量&am…

枚举和联合体

1.枚举类型 1枚举类型的声明 枚举顾名思义就是一一列举。 把可能的取值一一列举。 比如我们现实生活中&#xff1a; 一周的星期一到星期日是有限的7天&#xff0c;可以一一列举 性别有&#xff1a;男、女、保密&#xff0c;也可以一一列举 月份有12个月&#xff0c;也可以一一…

浙大数据结构:02-线性结构4 Pop Sequence

这道题我们采用数组来模拟堆栈和队列。 简单说一下大致思路&#xff0c;我们用栈来存1234.....&#xff0c;队列来存输入的一组数据&#xff0c;栈与队列进行匹配&#xff0c;相同就pop 机翻 1、条件准备 stk是栈&#xff0c;que是队列。 tt指向的是栈中下标&#xff0c;fr…

自然语言处理系列六十三》神经网络算法》LSTM长短期记忆神经网络算法

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列六十三神经网络算法》LSTM长短期记忆神经网络算…

fail to install hcmon driver问题解决

对我搜集到的解决办法进行总结: 没有删除“C:\Windows\System32\drivers”&#xff09;下的 hcmon.sys 驱动文件,删除后重启后安装修改了注册表默认下载位置,使用winR输入regedit,将 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion这个路径下的都改为C…

PyTorch 卷积层详解

PyTorch 卷积层详解 卷积层&#xff08;Convolutional Layers&#xff09;是深度学习中用于提取输入数据特征的重要组件&#xff0c;特别适用于处理图像和序列数据。PyTorch 提供了多种卷积层&#xff0c;分别适用于不同维度的数据。本文将详细介绍这些卷积层&#xff0c;特别…