数据库缓存策略

数据库缓存策略

以下是数据库与缓存的五种常见策略。

1缓存旁路

  • 缓存旁路(Cache-Aside)
    • 在缓存旁路策略中,数据库缓存位于数据库旁边。
    • 当应用程序请求数据时,它会首先检查缓存
      • 如果缓存中存在数据(缓存命中),则会直接返回数据
      • 如果缓存中没有数据(缓存未命中),则应用程序将查询数据库,然后将数据存储在缓存中,并将其返回给应用程序,以供后续的查询使用。
    • 缓存旁路设计是一种优秀的通用缓存策略
      • 这种策略特别适用于读取密集的工作负载的应用程序
      • 它将经常读取的数据保持在附近,以满足众多的读取请求
    • 将缓存和数据库分开还带来了两个额外的好处
      • 在缓存出现故障的情况下,仍然可以从数据库中读取数据,从而增加了一定的弹性
      • 由于缓存与数据库分离,因此可以独立扩展缓存和数据库,从而提高了整个系统的可伸缩性
    • 注意
      • 缓存旁路策略主要缺点是数据库中的不一致性问题
        • 当应用程序更新数据库中的数据时,缓存中的数据将过时
        • 为了解决这个问题,我们可以使用缓存失效策略
      • 对于任何数据的写入操作,应用程序仍然会直接访问数据库

2读取穿透

  • 读取穿透(Read-Through)
    • 在读取穿透缓存的策略中,缓存位于应用程序和数据库之间
    • 在这种策略下,应用程序总是与缓存进行读取交互
      • 当缓存命中时,数据会立即返回
      • 当缓存未命中时,缓存会从数据库中获取缺失的数据,然后将其返回给应用程序
    • 对于任何数据的写入操作,应用程序仍然会直接访问数据库

3写入穿透

  • 写入穿透(Write-Through)
    • 写入穿透缓存策略不是直接将数据写入数据库,而是首先将数据写入缓存,然后缓存立即将数据写入数据库
  • 写入穿透策略的好处在于,确保缓存中具有所有写入的数据,并且任何新的读取请求不会因为缓存从主数据库请求数据而遇到延迟。如果仅采用这种安排,缺点是会产生额外的写入延迟,因为操作必须经过缓存然后再写入数据库。尽管这应该是立即发生的,但仍然存在两次连续写入的情况。
  • 真正的好处来自于将写入穿透与读取穿透缓存配对使用的策略。这种策略将采用读取穿透缓存策略的所有优点,并增加了消除数据不一致的潜在优势。通过使用这种组合策略,可以实现写入数据的高效缓存和读取数据的快速访问,同时保持数据的一致性。

4写入回写

  • 写入回写(Write-Back)
    • 与写入穿透策略几乎完全相同,只有一个关键细节不同。在写回策略中,应用程序再次直接将数据写入缓存。然而,缓存不会立即将数据写入数据库,而是会延迟一段时间后再进行写入。
    • 通过在写入数据库时延迟而不是立即进行,可以减轻写入密集工作负载对缓存的压力。这使得写回和读取穿透的组合对于混合工作负载非常适用。这种组合确保最近写入的数据和访问的数据始终存在,并可通过缓存进行访问
    • 缓存到数据库写入的延迟可以改善整体写入性能,并且如果支持批处理,则可以减少总体写入量。这为一些成本节约和整体工作负载减轻带来了潜在的机会。然而,在缓存发生故障的情况下,这种延迟可能会导致可能数据丢失的风险,特别是如果批处理或延迟写入数据库尚未发生。
    • 写回策略的另一个缺点是,如果缓存发生故障,那么缓存中的数据可能会丢失。这种情况下,数据库中的数据将是最新的,但是缓存中的数据将是过时的。这种情况下,应用程序将无法从缓存中读取数据,直到缓存恢复正常为止。

5写入旁路

  • 写入旁路(Write-Around)
    • 写入旁路缓存策略将与缓存旁路或读取穿透缓存策略相结合
    • 在这种情况下,数据总是被写入数据库,而读取的数据会被放入缓存
    • 如果发生缓存未命中,则应用程序会从数据库读取数据,然后更新缓存以备下次使用
  • 这种特定的策略在数据仅被写入一次且不进行更新的情况下表现最佳。数据很少被读取或根本不被读取。

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

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

相关文章

【Linux】常见指令(一)

前言: Linux有许多的指令,通过学习这些指令,可以对目录及文件进行操作。 文章目录 一、基础指令1. ls—列出目录内容2. pwd—显示当前目录3. cd—切换目录重新认识指令4. touch—创建文件等5. mkdir—创建目录6. rmdir指令 && rm 指令7. man—显…

MySQL InnoDB 底层数据存储

InnoDB 页记录Page Directory记录迁移 页 是内存与磁盘交互的基本单位,16kb。 比如,查询的时候,并不是只从磁盘读取某条记录,而是记录所在的页 记录 记录的物理插入是随机的,就是在磁盘上的位置是无序的。但是在页中…

MNIST 数据集详析:使用残差网络RESNET识别手写数字(文末送书)

MNIST 数据集已经是一个几乎每个初学者都会接触的数据集, 很多实验、很多模型都会以MNIST 数据集作为训练对象, 不过有些人可能对它还不是很了解, 那么今天我们一起来学习一下MNIST 数据集,同时构建残差网络来识别手写数字。 1.MNIST 介绍 MNIST手写数字数据库具有…

【数据结构和算法】--- 二叉树(3)--二叉树链式结构的实现(1)

目录 一、二叉树的创建(伪)二、二叉树的遍历2.1 前序遍历2.2 中序遍历2.3 后序遍历 三、二叉树节点个数及高度3.1 二叉树节点个数3.2 二叉树叶子节点个数3.3二叉树第k层节点个数3.4 二叉树查找值为x的节点 四、二叉树的创建(真) 一、二叉树的创建(伪) 在学习二叉树的基本操作前…

开发实战角度:distinct实现原理及具体优化总结

1.背景 Distinct是一种常用的操作,在所有数据库的SQl语言中都是一个非常重要的操作,在Hive中,Distinct去重原理是通过MapReduce来实现的,Distinct操作可以应用于单个列,亦可以应用于多个列。基本原理是将输入的数据集…

(十四)Head first design patterns建造者模式(c++)

建造者模式 建造者把产品细节的实现过程单独封装成类,完成产品本身和创建产品之间的解耦。每一个建造者都相对独立,因此在建造细节实现方面实现了灵活性和可扩展性。 建造者模式和工厂模式的区别:工厂模式关心把这个产品创建出来&#xff0…

32、WEB攻防——通用漏洞文件上传二次渲染.htaccess变异免杀

文章目录 一、点过滤二、文件删除三、二次渲染四、.htaccess五、过滤php关键函数 一、点过滤 不能写带文件后缀的文件名;IP转数字 二、文件删除 文件依据规则进行删除,删除有两种删除的类型: 什么文件都删除,条件竞争进行绕过…

03 SpringBoot实战 -微头条之首页门户模块(跳转某页面自动展示所有信息+根据hid查询文章全文并用乐观锁修改阅读量)

1.1 自动展示所有信息 需求描述: 进入新闻首页portal/findAllType, 自动返回所有栏目名称和id 接口描述 url地址:portal/findAllTypes 请求方式:get 请求参数:无 响应数据: 成功 {"code":"200","mes…

redis高可用之Sentinel模式

文章目录 前言1. 创建联想主服务器的网络连接2. 创建连向其他Sentinel的命令连接 (也就是调度中心的高可用)3.选举领头Sentinel 调度中心高可用4.故障转移 选出新的主服务器 redis服务器高可用如何挑选新的主服务器? 总结 前言 Sentinel(哨岗…

2017年认证杯SPSSPRO杯数学建模A题(第二阶段)安全的后视镜全过程文档及程序

2017年认证杯SPSSPRO杯数学建模 A题 安全的后视镜 原题再现: 汽车后视镜的视野对行车安全非常重要。一般来说,汽车的后视镜需要有良好的视野范围,以便驾驶员能够全面地了解车后方的道路情况。同时,后视镜也要使图像的畸变尽可能…

【每日一题】2.LeetCode——删除有序数组中的重复项

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点&…

如何在Linux上部署Nexus私服

如何在Linux上部署Nexus私服 Nexus 是一个强大的仓库管理解决方案,由Sonatype公司开发。它主要用于软件开发中各种依赖包和构件的存储、管理和分发。 1、为什么要部署nexus? 统一管理依赖:在软件开发过程中,项目通常会依赖大量的…