每日一博 - 图解5种Cache策略

2023-12-11 00:29

本文主要是介绍每日一博 - 图解5种Cache策略,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 概述
  • 读策略
    • Cache Aside
    • Read Through
  • 写策略
    • Write Through
    • Write Around
    • Write Back
  • 使用场景举例

在这里插入图片描述


概述

缓存是在系统中存储数据的临时存储器,用于提高访问速度。缓存策略定义了如何在缓存和主存之间管理数据


读策略

Read data from the system:
🔹 Cache aside
🔹 Read through
在这里插入图片描述


Cache Aside

概念: 应用程序负责将数据写入和从缓存读取,缓存不主动参与。
作用: 简化实现,但可能导致缓存脏数据。

应用程序自己管理缓存。当需要数据时,应用程序会先在缓存中查找,如果不存在,才到数据库中加载。加载到数据库后,同时保存到缓存中。这种策略简单直接,应用程序有完全控制权。但问题是代码复杂,需要自己处理缓存失效、预热、异步加载等问题。

在这里插入图片描述


Read Through

概念: 数据访问时,缓存负责检查是否有所需数据。如果不存在,缓存负责从主存中获取。
作用: 自动化数据加载,减少了应用程序的负担,但可能导致读取性能损失。

应用程序只查询缓存,不直接访问数据库。如果缓存不存在,则自动从数据库加载,然后返回给应用程序,同时更新缓存。这简化了应用程序代码,但也限制了应用程序直接访问数据库

在这里插入图片描述


写策略

Write data to the system:
🔹 Write around
🔹 Write back
🔹 Write through

在这里插入图片描述

Write Through

概念: 写入时同时到缓存和主存,确保主存和缓存中的数据一致。
作用: 数据一致性,但可能导致写入性能较低。

数据修改请求直接写入数据库,同时也保存到缓存中(不是所有实现都这么做)。所以,缓存能保证和数据库一致性。但每次写操作都会比较慢

在这里插入图片描述


Write Around

概念: 写入时直接到主存,而不是到缓存。缓存只在读取时更新。
作用: 避免缓存污染,适用于大量写入但很少读取的情况。

直接写入数据库,但不写入缓存。这可以减轻缓存的压力,但是读取数据时缓存在没有命中,需要从数据库中加载数据然后放入缓存,性能比较差。

在这里插入图片描述


Write Back

概念: 写入时只到缓存,延迟写回主存。缓存跟踪哪些数据被修改。
作用: 提高写入性能,但可能导致数据不一致。

在这里插入图片描述


使用场景举例

  1. Cache Aside:

    • 案例: 在一个电子商务网站中,商品信息被频繁读取,但更新并不频繁。采用 Cache Aside 策略,应用程序在需要时直接从数据库读取商品信息,然后将其缓存在内存中。如果有更新,应用程序负责同时更新数据库和缓存。
  2. Read Through:

    • 案例: 在一个社交媒体应用中,用户的个人资料信息经常被访问。使用 Read Through 策略,当用户请求个人资料时,缓存会检查是否存在,如果不存在,它将从数据库中读取用户的个人资料并将其存储在缓存中,以便下一次访问。
  3. Write Around:

    • 案例: 在一个日志记录系统中,日志条目的写入频率很高,但很少读取。采用 Write Around 策略,应用程序直接将日志写入主存储,而不将其写入缓存。缓存仅用于读取请求,以避免缓存污染。
  4. Write Back:

    • 案例: 在一个文件系统中,用户频繁编辑文档。使用 Write Back 策略,文件系统将用户编辑的文档暂时保存在缓存中,而不是立即写回主存储。只有当缓存满或文档不再被频繁访问时,才将更改写回主存储。
  5. Write Through:

    • 案例: 在一个金融交易系统中,每笔交易都需要确保立即写入主存储并更新缓存。采用 Write Through 策略,系统在执行每笔交易时同时将数据写入缓存和主存储,以确保数据的一致性。

在这里插入图片描述

这篇关于每日一博 - 图解5种Cache策略的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/478825

相关文章

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

每日一练7:简写单词(含链接)

1.链接 简写单词_牛客题霸_牛客网 2.题目 3.代码1(错误经验) #include <iostream>#include <string>using namespace std;int main() {string s;string ret;int count = 0;while(cin >> s)for(auto a : s){if(count == 0){if( a <=

图解TCP三次握手|深度解析|为什么是三次

写在前面 这篇文章我们来讲解析 TCP三次握手。 TCP 报文段 传输控制块TCB:存储了每一个连接中的一些重要信息。比如TCP连接表,指向发送和接收缓冲的指针,指向重传队列的指针,当前的发送和接收序列等等。 我们再来看一下TCP报文段的组成结构 TCP 三次握手 过程 假设有一台客户端,B有一台服务器。最初两端的TCP进程都是处于CLOSED关闭状态,客户端A打开链接,服务器端

【每日刷题】Day113

【每日刷题】Day113 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 91. 解码方法 - 力扣(LeetCode) 2. LCR 098. 不同路径 - 力扣(LeetCode) 3. 63. 不同路径 II - 力扣(LeetCode) 1. 91. 解码方法 - 力扣(LeetCode) //思路:动态规划。 cl

缓存策略使用总结

缓存是提高系统性能的最简单方法之一。相对而言,数据库(or NoSQL数据库)的速度比较慢,而速度却又是致胜的关键。 如果使用得当,缓存可以减少相应时间、减少数据库负载以及节省成本。本文罗列了几种缓存策略,选择正确的一种会有很大的不同。缓存策略取决于数据和数据访问模式。换句话说,数据是如何写和读的。例如: 系统是写多读少的吗?(例如基于时间的日志)数据是否是只写入一次并被读取多次?(例如用户配

图解可观测Metrics, tracing, and logging

最近在看Gophercon大会PPT的时候无意中看到了关于Metrics,Tracing和Logging相关的一篇文章,凑巧这些我基本都接触过,也是去年后半年到现在一直在做和研究的东西。从去年的关于Metrics的goappmonitor,到今年在排查问题时脑洞的基于log全链路(Tracing)追踪系统的设计,正好是对这三个话题的实践。这不禁让我对它们的关系进行思考:Metrics和Loggi

Flink任务重启策略

概述 Flink支持不同的重启策略,以在故障发生时控制作业如何重启集群在启动时会伴随一个默认的重启策略,在没有定义具体重启策略时会使用该默认策略。如果在工作提交时指定了一个重启策略,该策略会覆盖集群的默认策略默认的重启策略可以通过 Flink 的配置文件 flink-conf.yaml 指定。配置参数 restart-strategy 定义了哪个策略被使用。常用的重启策略: 固定间隔 (Fixe

Java后端微服务架构下的API限流策略:Guava RateLimiter

Java后端微服务架构下的API限流策略:Guava RateLimiter 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在微服务架构中,API限流是保护服务不受过度使用和拒绝服务攻击的重要手段。Guava RateLimiter是Google开源的Java库中的一个组件,提供了简单易用的限流功能。 API限流概述 API限流通过控制请求的速率来防止