缓存策略以及如何选择正确的策略

正确地使用缓存可以减少系统响应的时间,降低数据库负载,反之可能带来相反的效果。因此,就必须了解有哪些缓存策略,以及如何根据实际使用场景选择合适的缓存策略。

缓存策略取决于数据和数据访问模式,即,数据是如何写入和读取的。本文将讲述两种读策略(Cache-Aside、Read-Through)和 三种写策略(Write-Through 、Write-Around、Write-Back/Write-Behind)

目录

  • Cache-Aside
    • 基本原理
    • 运行方式
    • 适用场景及优缺点:
  • Read-Through
    • 基本原理
    • 运行方式:
    • 适用场景及优缺点
  • Write-Through
    • 基本原理
    • 运行方式
    • 适用场景及优缺点
  • Write-Around
    • 基本原理
    • 运行方式
    • 适用场景及优缺点
  • Write-Back or Write-Behind
    • 基本原理
    • 运行方式:
    • 适用场景及优缺点
  • 总结

Cache-Aside

基本原理

应用程序同时和缓存、数据库通信,缓存和主数据库之间没有连接,缓存和数据库的所有操作均由应用程序处理。
在这里插入图片描述

运行方式

  1. 应用程序首先检查缓存。
  2. 如果在缓存中找到数据,则命中缓存,可以直接读取数据并返回给客户端。
  3. 如果缓存中找不到数据,明缓存未命中。此时应用程序必须做额外的工作:先查询数据库以读取数据,然后将其返回给客户端,并将数据存储在缓存中,以便后续请求直接命中缓存。

适用场景及优缺点:

适合读取密集型任务,读多写少

优点:可以应对缓存故障问题,缓存故障时依然可以直接访问数据库保证服务;缓存的数据模型可以和数据库数据模型不同。

缺点:当数据更新时,缓存和数据库可能不一致。解决方法有:1、设置缓存数据的TTL,在TTL到达之前,先提供旧数据; 2、可以删除缓存,下一次查询时查数据库然后更新缓存数据; 3、可以在更新数据库时,同时更新缓存。

Read-Through

基本原理

此策略将缓存串联在服务与数据库之间。服务不与数据库直接通信,而是经过缓存获取数据库的数据。

一般这种缓存是靠数据库本身实现的,例如,mysql的缓存功能、DynamoDB Accelerator (DAX)是直读/直写缓存

在这里插入图片描述

运行方式:

  1. 应用程序请求缓存
  2. 如果命中缓存,则直接返回结果
  3. 如果未命中缓存,则需要缓存负责读取数据库,然后填充缓存,并返回给应用程序

适用场景及优缺点

适合读多写少的场景。

优点:暂时看不出来有什么优点。。。。编不出来

缺点:与cache-aside类似,第一次查询总会查不到;也同样存在缓存与数据库不一致问题;存在单点故障,当缓存不可用时,会导致整个服务不可用。

Write-Through

基本原理

数据先写入缓存,然后写入数据库。缓存与数据库串联,写入操作始终通过缓存到达数据库。

在这里插入图片描述

运行方式

  1. 应用程序直接写入缓存
  2. 缓存负责更新数据库。

适用场景及优缺点

优点:能始终保持缓存和数据库的一致性。当与read though组合时,可以避免缓存失效问题。

缺点:写入的时候需要写两次,会有一定延时

Write-Around

基本原理

应用程序与数据库直接通信,也与缓存直接通信。

在这里插入图片描述

运行方式

应用程序直接将数据写入数据库,只有当读取时,才顺带更新缓存。

适用场景及优缺点

优点:Write-around 与 read-through 结合起来,在数据只写入一次而读取频率较低或从不读取的情况下提供良好的性能。例如,实时日志或聊天室消息。同样,该模式也可以与cache-aside结合使用。

缺点:可能存在数据库和缓存不一致的情况。

Write-Back or Write-Behind

基本原理

应用程序与缓存直接通信,缓存和数据库通信。

在这里插入图片描述

运行方式:

应用程序将数据写入缓存,缓存存储数据并立即向应用程序确认。然后,缓存将数据写回数据库。即先写缓存,然后异步同步数据库。

适用场景及优缺点

适用场景:适合写入密集型的业务

优点:高性能;与read-though 结合使用,可以保证最近更新和最近访问的数据 一直可用。 可以容忍数据库故障

缺点:如果缓存故障,可能数据永久丢失。

总结

在实际使用中,应当结合实际业务场景,选择合适缓存读、写策略或组合。

参考资料:

https://codeahoy.com/2017/08/11/caching-strategies-and-how-to-choose-the-right-one/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu配置网关-虚拟服务器修改配置文件修改IP

ubuntu配置网关-修改ip - jason47 - 博客园 (cnblogs.com) 修改netplan的文件 sudo vim /etc/netplan/01-network-manager-all.ymal 20.04版本 1. 查询当前使用的网卡 使用的是ens160 2. 修改配置,进入/etc/netplan 找到ens160的配置是在99-netcfg-vmware.yaml文…

设计模式系列:简单工厂模式

作者持续关注 WPS二次开发专题系列,持续为大家带来更多有价值的WPS二次开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我(QQ:250325397) 目录 定义 特点 使用场景 优缺点 (1) 优点…

使用Pandas解决问题:对比两列数据取最大值的五种方法

目录 一、使用max方法 二、使用apply方法结合lambda函数 三、使用np.maximum函数 四、使用clip方法 五、使用where方法结合条件赋值 总结: 在数据处理和分析中,经常需要比较两个或多个列的值,并取其中的最大值。Pandas库作为Python…

Pixel-GS:用于3D高斯溅射的具有像素感知梯度的密度控制

Pixel-GS: Density Control with Pixel-aware Gradient for 3D Gaussian Splatting Pixel-GS:用于3D高斯溅射的具有像素感知梯度的密度控制 Zheng Zhang  Wenbo Hu†  Yixing Lao   老宜兴市郑张文博胡 † Tong He  Hengshuang Zhao† 赵同和恒双 †1122113311 …

车机手机互联不同屏幕尺寸大小解决方案成果展示

背景 hi,粉丝朋友们: 大家好!上一篇文章分享了一个云手机车机互联实现的简单demo,文章链接如下: https://mp.weixin.qq.com/s/lihQHSd-zBIPeVa0WiP1pg 这个主要实现是同一个屏幕大小尺寸的投屏情况,即和车…

Three.js在3D可视化领域大展拳脚,不接受反驳。

three.js在3D可视化领域中起到了重要的作用。它是一个基于JavaScript的轻量级、跨平台的3D图形库,提供了丰富的功能和工具,用于创建和展示各种3D场景、动画和效果。 以下是three.js在3D可视化领域的主要作用: 创建交互式的3D场景&#xff1a…

项目从 Mysql切换 PostgreSQL 改造及踩坑记录

0、前言 原项目框架 SpringBoot MybatisPlus Mysql 1、切换流程 1.1、项目引入postgresql驱动包 由于我们要连接新的数据库&#xff0c;理所当然的要引入该数据库的驱动包&#xff0c;这与mysql驱动包类似 <dependency><groupId>org.postgresql</groupId…

Ubuntu Desktop:创建桌面启动图标

Ubuntu Desktop&#xff1a;创建桌面启动图标 在Ubuntu Desktop上创建桌面启动图标是一个相对简单的过程&#xff0c;可以帮助用户快速访问他们最常用的应用程序。本文旨在指导你完成创建一个桌面启动图标的步骤&#xff0c;从而使你能够轻松启动你的应用程序。 为什么创建桌…

String类(1)

❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&a…

Java-接口—知识(基础)

承接上一节&#xff0c;我们讨论了抽象类和抽象方法。 那我们尝试在抽象的道路上走的更远一点&#xff0c;先来总结一下抽象&#xff1b; 抽象类&#xff1a;类中的属性规范了子类必须有什么样的特征&#xff0c;有什么状态。类中的方法规范了子类必须有什么行为&#xff0c;…

【Linux】进程间通信——匿名管道|命名管道

目录 什么是进程间通信 管道 匿名管道 什么是进程间通信 进程间通信&#xff0c;顾名思义就是两个进程互相通信。 可是进程是独立的&#xff0c;该如何通信呢&#xff1f; 类比你和你的朋友在网上聊天&#xff0c;你们两个人也是独立的&#xff0c;是如何通信的呢&#xf…

C#学习笔记10:winform上位机与西门子PLC网口通信_中篇_winform的窗口操作设计、日志的添加使用

今日继续我的C#winform上位机学习之路 这系列笔记的目标是尝试编写一个能够与西门子PLC进行以太网口通信的上位机软件。 文章提供完整代码解释、设计点解释、测试效果图、完整工程下载 本章主要学习&#xff1a;Winform多个窗体的一些操作 、无边框窗体的创建、Combox组件插…

Linux:文本编辑器 - vim

Linux&#xff1a;文本编辑器 - vim vim基本操作普通模式模式切换移动光标复制粘贴删除替换撤销 底行模式行号查找 vim基本操作 Vim(Vi Improved)是一款功能强大的文本编辑器&#xff0c;是Unix/Linux系统中广泛使用的编辑器之一。它源于上世纪70年代开发的Vi编辑器&#xff0…

Understanding Diffusion Models: A Unified Perspective翻译和公式补充解读

“Understanding Diffusion Models: A Unified Perspective”是一篇写的非常好的扩散模型DDPM数学原理解读文章&#xff0c;这里翻译了一遍&#xff0c;对于一些细节补充记录一下&#xff0c;方便对照原文更好的理解。 这篇文章作者是Calvin Luo&#xff0c;来自Google Resear…

激活黑科技

下载/如何使用它&#xff1f; 方法 1 - PowerShell&#xff08;推荐&#xff09;Method 1 - PowerShell &#xff08;Recommended&#xff09; 右键单击 Windows 开始菜单&#xff0c;然后选择“PowerShell”或“终端&#xff08;非 CMD&#xff09;”。复制粘贴以下代码&…

ChatGLM3-6B大语言模型离线执行

ChatGLM3-6B大语言模型离线执行 模型准备 一般而言&#xff0c;模型和模型参数可以通过如下三个模型源进行相应的下载&#xff1a; HuggingFace | ModelScope | WiseModel 本实例中&#xff0c;使用的是HuggingFace的源下载&#xff0c;相应的地址如下&#xff1a; HuggingFa…

在线视频下载工具lux(原annie)安装及使用教程

安装教程 下载ffmpeg&#xff0c;参考这篇文章&#xff1a;Python——Windows下载ffmpeg由于博主的系统为windows&#xff0c;所以选择不安装lux&#xff0c;直接下载.exe文件&#xff0c;进入lux的github网站后&#xff0c;选择右侧的Releases&#xff0c;下载下图的windows …

求职要做在线人才测评,如果找人代做会被发现吗?

理论上都有办法能避开&#xff0c;这种在线测评的一定都有这个弊端&#xff0c;什么录音&#xff0c;录屏&#xff0c;录像&#xff0c;只要你愿意琢磨下&#xff0c;就一定有办法避开&#xff0c;除非是现场有人看着你。 但是我的观点是没必要作弊&#xff0c;使这个巧&…

起诉状与反诉状有什么不同,二者在写法上有何区别?李秘书讲写作教教你!

起诉状与反诉状有什么不同&#xff0c;二者在写法上有何区别&#xff1f;李秘书讲写作教教你&#xff01; 起诉状和反诉状在民事诉讼中各自扮演着不同的角色&#xff0c;因此它们在内容和写法上有一些不同。#李秘书讲写作#这节就讲这个话题。 起诉状是原告向人民法院提起诉讼…

从 0 搭建公司Jenkins服务 Centos7

从 0 搭建公司Jenkins服务 Centos7 安装 (运维人员) 安装环境 配置DNS安装JDK17安装Jenkins安装Docker安装GIT安装Ansible启动Jenkins安装插件配置凭据配置共享库配置 (开发经理)使用 (开发、测试人员) 安装 (运维人员) 安装环境 配置DNS 新安装系统的服务器无法解析域名&a…