系统设计-缓存介绍

该图说明了我们在典型架构中缓存数据的位置。

沿着流程有多个层次。

  1. 客户端应用程序:HTTP 响应可以由浏览器缓存。我们第一次通过 HTTP 请求数据,返回时在 HTTP 标头中包含过期策略;我们再次请求数据,客户端应用程序首先尝试从浏览器缓存中检索数据。
  2. CDN:CDN缓存静态网页资源。客户端可以从附近的CDN节点检索数据。
  3. 负载均衡器:负载均衡器也可以缓存资源。
  4. 消息传递基础设施:消息代理首先将消息存储在磁盘上,然后消费者按照自己的节奏检索消息。根据保留策略,数据会在Kafka集群中缓存一段时间。
  5. 服务:服务中有多层缓存。如果数据没有缓存在CPU缓存中,服务将尝试从内存中检索数据。有时服务有二级缓存来将数据存储在磁盘上。
  6. 分布式缓存:像Redis这样的分布式缓存在内存中保存多个服务的键值对。它提供比数据库更好的读/写性能。
  7. 全文搜索:我们有时需要使用全文搜索,例如Elastic Search来进行文档搜索或日志搜索。数据副本也会在搜索引擎中建立索引。
  8. 数据库:即使在数据库中,我们也有不同级别的缓存:
  • WAL(Write-ahead Log):在构建B树索引之前,先将数据写入WAL
  • Bufferpool:分配用于缓存查询结果的内存区域
  • 物化视图:预先计算查询结果并将其存储在数据库表中以获得更好的查询性能
  • 事务日志:记录所有事务和数据库更新
  • 复制日志:用于记录数据库集群中的复制状态

 为什么Redis这么快?

  1. Redis 是一个基于 RAM 的数据存储。RAM 访问至少比随机磁盘访问快 1000 倍。
  2. Redis 利用 IO 多路复用和单线程执行循环来提高执行效率。
  3. Redis 利用多种高效的低级数据结构。

 如何使用Redis

Redis 使用场景

Redis 可用于多种场景,如图所示。

  • 会话

    我们可以使用Redis在不同服务之间共享用户会话数据。

  • 缓存

    我们可以使用Redis来缓存对象或页面,尤其是热点数据。

  • 分布式锁

    我们可以使用Redis字符串来获取分布式服务之间的锁。

  • 统计

    我们可以统计文章的点赞数或阅读量。

  • 速率限制器

    我们可以对某些用户 IP 应用速率限制器。

  • 全局 ID 生成器

    我们可以使用 Redis Int 作为全局 ID。

  • 购物车

    我们可以使用 Redis Hash 来表示购物车中的键值对。

  • 计算用户保留率

    我们可以使用Bitmap来表示每天的用户登录情况并计算用户留存情况。

  • 消息队列

    我们可以使用 List 作为消息队列。

  • 排行

    我们可以使用ZSet对文章进行排序。

顶级缓存策略

设计大型系统通常需要仔细考虑缓存。以下是五种常用的缓存策略。

 

1. Cache Aside (Lazy-Load):

  • 工作原理: 应用程序负责直接读写缓存。数据在被读取时,首先尝试从缓存获取;在写入时,直接更新缓存,并且可能在后续异步或同步地更新数据源。

  • 适用场景:

    • 读密集型工作负载。
    • 数据变更不频繁的情况。
    • 实时性要求不高的应用。

2. Read Through:

  • 工作原理: 缓存系统管理缓存,并在数据未命中时从数据源(通常是数据库)读取数据。应用程序直接访问缓存,而缓存负责从数据源读取数据。

  • 适用场景:

    • 读操作频繁,对实时性要求较高。
    • 数据源对应用程序相对透明。

3. Write-Around:

  • 工作原理: 写操作直接更新数据源,而不是直接更新缓存。只有被读取的数据才会放入缓存。

  • 适用场景:

    • 写操作频繁,但读操作相对较少。
    • 数据变更频繁,但不是立即被读取的情况。

4. Write-Back (Write-Behind):

  • 工作原理: 写操作首先更新缓存,然后异步地或在特定条件下将缓存中的数据批量写回到数据源。

  • 适用场景:

    • 写操作频繁,对实时性要求相对较低。
    • 提高写操作性能,通过批量写回减少对数据源的频繁写入。

5. Write Through:

  • 工作原理: 写操作直接更新缓存,并且同步更新到数据源,确保数据一致性。

  • 适用场景:

    • 需要强一致性的场景,对实时性要求较高。
    • 适用于事务性应用,要求写入后立即生效。

比较与选择:

  • 不同的缓存模式适用于不同的应用场景,选择应根据应用程序的读写模式、数据变更频率以及对实时性和一致性的需求进行权衡。

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

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

相关文章

前端实现检索文本高亮实现

文章目录 一、前言二、实现三、最后 一、前言 使用搜索引擎时的搜索结果高亮,搜索文本在查询出来的结果内高亮显示,这种在全文检索应该很常见 二、实现 看了下百度检索的实现,是给内容加上了em标签,然后给em标签设置颜色&#x…

机器的深度强化学习算法可以被诱导

设计一个好的奖励函数是机器深度强化学习算法的关键之一。奖励函数用于给予智能体(机器)在环境中采取不同行动时的反馈信号,以指导其学习过程。一个好的奖励函数应该能够引导智能体朝着期望的行为方向学习,并尽量避免潜在的问题&a…

区块链密码学:基础知识、应用与未来发展

一、引言 区块链技术,作为一种分布式、去中心化的数据管理方式,密码学在其安全性和可靠性方面发挥着至关重要的作用。本文将详细介绍区块链密码学的基础知识、应用以及未来发展趋势。 二、区块链密码学基础知识 区块链密码学是区块链技术的核心组成部分…

【海思SS528 | VO】MPP媒体处理软件V5.0 | VO模块编程总结

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

mysql5.7安装详细教程

文章目录 1 引言1.1 现有的数据存储方式有哪些?1.2 以上存储方式存在哪些缺点? 2 数据库2.1 概念2.2 数据库的分类 3 数据库管理系统3.1 概念3.2 常见数据库管理系统 4 MySQL4.1 简介4.2 访问与下载4.3 安装4.3.1 解压缩到非中文目录4.3.2 编写配置文件4…

一张图理解接口测试框架

测试框架先向测试数据库中插入测试数据(如:name”Tom“) 调用被测系统提供的接口(传参:name”Tom“) 从测试数据库中查到符合参数的数据 将查询到的数据组成Json格式,并返回给测试框架 提供…

【MySQL】:数据库基本认识

数据库基础 一.什么是数据库1.mysql是什么2.为什么要有数据库3.服务器,数据库,表关系4.Mysql架构5.SQL语句分类 二.存储引擎 一.什么是数据库 1.mysql是什么 1.mysql是数据库服务的客户端。 2.mysqld是数据库服务的服务器端。 3.mysql本质:基…

docker安装及配置mysql

docker 安装mysql 下载镜像文件 下载mysql5.7版本 sudo docker pull mysql:5.7检查是否下载成功 sudo docker images2.创建实例并启动 切换到root下避免每次使用sudo 密码:vagrant docker run -p 3306:3306 --name mysql \ -v /mydata/mysql/log:/var/log/my…

解决Error:You‘re using an RSA key with SHA-1, which is no longer allowed

一、问题 在微信开发者工具中,推送代码时发生错误Error:You‘re using an RSA key with SHA-1, which is no longer allowed...... 奇怪的是命令行可以正常push: 原因:因为生成密钥的RSA算法,由于安全性原因,现在已经不允许使用…

STM32F1定时器TIM

目录 1. TIM(Timer)定时器 2. 定时器类型 2.1 基本定时器框图 2.2 通用定时器框图 2.3 高级定时器框图 3. 定时器代码 3.1 恢复缺省配置 3.2 时基单元初始化 3.3 结构体变量附一个默认值 3.4 使能计数器 3.5 使能中断输出信号 3.…

MySQL Server 层和引擎层是如何交互的

Server 层、引擎层、BufferPool、磁盘间的关系 大体来说, MySQL可以分为Server层和存储引擎层两部分。 1)Server 层:Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所…

git 克隆无权限-重新输入账号密码

克隆项目代码时提示没有权限,有可能是没有登录账号,也可能是账号密码改了,运行下面指令,然后重新克隆项目,下载的时候会让你重新输入账号密码,则克隆成功 git config --global credential.helper cache 参考…

2023 金砖国家职业技能大赛网络安全省赛理论题样题(金砖国家未来技能挑战赛)

2023 金砖国家职业技能大赛网络安全省赛理论题样题(金砖国家未来技能挑战赛) 一、参加比赛的形式 团队参与,每队2名选手(设队长1名)。 二、项目项目阶段简介 项目由四个阶段组成,将按顺序完成。向参与者…

STM32——震动传感器点亮LED灯

震动传感器简单介绍 若产品不震动,模块上的 DO 口输出高电平; 若产品震动,模块上的 DO 口输出低电平,D0-LED绿色指示灯亮。 震动传感器与STM32的接线 编程实现 需求:当震动传感器接收到震动信号时,使用中断…

分布式数据库HBase

文章目录 前言 一、HBase概述 1.1.1 什么是HBase HBase是一个分布式的、面向列的开源数据库HBase是Google BigTable的开源实现HBase不同于一般的关系数据库, 适合非结构化数据存储HBase是一种分布式、可扩展、支持海量数据存储的 NoSQL数据库。HBase是依赖Hadoop的。为什么HBa…

Linux中的输入输出重定向

目录 1.输出重定向 > 2.追加重定向 >> 3.标准 正确/错误 输出重定向 4.输入重定向 < 5.标准输入 0 1.输出重定向 > 将命令执行之后的结果不打印出来&#xff0c;可以输入在另外一个文件当中。 如&#xff0c;我查看文件a.txt 的前3行&#xff0c;然后不显…

如何从eureka-server上进行服务发现,负载均衡远程调用服务

在spring cloud的maven的pom文件中添加eureka-client的依赖坐标 <!--eureka-client依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependen…

gitLab 和Idea分支合并

以下二选1即可完成分支合并建议第一种简单有效 Idea合并方式 切换到被合并的分支&#xff0c;如我想把0701的内容合并到dev&#xff0c;切换到dev分支&#xff0c;然后再点击merge然后选择要合并的分支&#xff0c;即可,此时git上的代码没有更新只是把代码合到本地需要pull才…

盲盒小程序搭建:实现盲盒消费新体验

近几年来&#xff0c;潮玩市场中的盲盒逐渐席卷了年轻一代人的生活&#xff0c;吸引了不少消费者。盲盒的不确定性给消费者带来了惊喜和快乐&#xff0c;盲盒的商业价值也是逐渐增加&#xff0c;预计2024年盲盒市场规模将突破300亿元。 但在当下互联网快速发展的时代下&#x…

python/matlab图像去雾/去雨综述

图像去雾和去雨是计算机视觉领域的两个重要任务&#xff0c;旨在提高图像质量和可视化效果。本文将综述图像去雾和去雨的算法、理论以及相关项目代码示例。 一、图像去雾算法 基于暗通道先验的方法&#xff1a; 这是广泛应用于图像去雾的经典算法之一。该方法基于一个观察&…