架构思维:分布式缓存_提升系统性能的关键手段(上)

文章目录

  • 引言
  • 一、缓存的特点
  • 二、缓存的关键指标-命中率
  • 三、缓存的使用场景
  • 四、缓存的种类与应用
  • 五、缓存存储:哈希表实现
  • 六、分布式缓存与一致性哈希
  • 七、优化缓存性能
  • 总结

在这里插入图片描述

引言

分布式架构

缓存技术作为架构设计中重要的性能优化手段,在现代互联网系统中得到了广泛的应用。通过缓存,我们可以显著提升系统的响应速度,减少数据库负载,降低 IO 访问压力。然而,缓存的使用并非没有挑战。接下来,我们将探讨缓存的基本概念、缓存的类型、如何优化缓存使用以及如何避免缓存中的常见问题,尤其是分布式缓存

在这里插入图片描述

一、缓存的特点

缓存的主要特点有以下几点:

  1. 技术简单
    缓存技术相对简单,易于实现。它通常作为现有系统的附加组件引入,不会对已有架构产生太大的冲击。通过简单的调整即可带来明显的性能提升。

  2. 性能提升显著
    缓存能够将热点数据存储在内存中,极大地加快数据访问速度。通过减少从磁盘或数据库中获取数据的次数,缓存能有效提升系统响应性能。

  3. 应用场景广泛
    缓存不仅限于 Web 应用,也广泛应用于操作系统、数据库等领域。例如,CPU 中有缓存,操作系统有文件缓存,数据库中也有查询缓存。各类应用系统的缓存层,可以帮助提高系统的整体性能。

二、缓存的关键指标-命中率

影响缓存特性的一个关键指标是缓存的命中率。缓存的主要特点是一次写入多次读出,通过这种手段减少对数据库的使用,尽快从缓存中读取数据,提高性能。所以缓存是否有效,主要就是看它一次写进去的缓存能不能够多次去读出来响应业务的请求,这个判断指标就叫作缓存的命中率。

缓存命中率怎么算呢?查询得到正确缓存结果除以总的查询次数,得到的比值就是缓存命中率,比如说十次查询九次都能够得到缓存的正确结果,命中率就是 90%。

影响缓存命中率的主要因素有三个,分别是:

  1. 缓存键集合大小

    缓存中的每个对象都有一个唯一的键(key)。合理设计缓存键的集合范围,可以减少不必要的缓存冲突,提升缓存命中率。

    比如说我们想缓存每个商品的在线商品信息,就需要使用商品 ID 作为缓存键。换句话说,缓存键空间是你的应用能够生成的所有键的数量。从统计数字上看,应用生成的唯一键越多,重用的机会越小。比如说根据 IP 地址缓存天气数据,可能需要 40 多亿个键。但是如果基于国家缓存天气数据,那么只需要几百个缓存键就够了,全世界也不过就几百个国家。

    所以要尽可能减少缓存键的数量,键的数量越少,缓存的效率越高。设计缓存的时候要关注缓存键是如何进行设计的,它的整个的集合范围,限定在一个既能够高效使用,又可以减少它的数量,这个时候缓存的性能是最好的。

  2. 缓存空间大小

    缓存存储的内存空间直接影响缓存对象的数量。空间越大,缓存命中率越高,但也需要在资源有限的情况下进行合理管理。

  3. 缓存的使用寿命(TTL)

    缓存对象的生存时间决定了缓存的有效性。缓存可以通过设置失效时间(TTL)来管理缓存数据的过期时间,超时失效的缓存可以释放空间以存储新的数据。
    在这里插入图片描述


三、缓存的使用场景

并非所有的数据都适合缓存,使用缓存时应避免以下情况:

  1. 数据频繁修改
    对于修改频繁的数据,缓存的效果往往较差。频繁更新的缓存会导致过时的数据被频繁清除,影响系统性能。

  2. 没有热点数据
    如果数据访问量均匀分布,缺乏热点数据,缓存的命中率会降低,从而影响缓存的效益。

  3. 数据一致性问题
    缓存中的数据可能与数据库中的数据不一致。如果业务对数据一致性要求较高,使用缓存时需要特别小心,避免出现数据不同步的问题。

  4. 缓存雪崩
    当缓存系统崩溃时,可能会导致整个系统负载激增,从而引发缓存雪崩问题。为了防止这种情况,缓存需要设计冗余、故障恢复机制。


四、缓存的种类与应用

缓存有多种类型,根据缓存的位置和功能,可以分为以下几种:

  1. 代理缓存
    代理缓存位于客户端,代理客户端的请求。当多个客户端访问相同的内容时,代理缓存可以减少对原始数据源的请求,从而提高系统响应速度。

    在这里插入图片描述

  2. 反向代理缓存
    反向代理缓存位于数据中心,它代理所有客户端请求。用户请求数据时,反向代理缓存首先检查是否已有缓存,如果没有再转发请求至后端应用服务器。反向代理缓存常见于大型网站中,通过分层代理提高数据访问效率。

    在这里插入图片描述

    在这里插入图片描述

  3. CDN 缓存
    CDN(内容分发网络)缓存用于将内容存储在离用户更近的节点。CDN通过分布式网络提供缓存服务,减少用户与源服务器之间的延迟。CDN 缓存通常用于静态资源的缓存,如图片、视频、网页等。

    在这里插入图片描述

  4. 对象缓存
    对象缓存如 Redis 和 Memcached 是常见的分布式缓存解决方案。它们提供高速的内存缓存,可以存储对象、字符串、哈希表等数据结构。


五、缓存存储:哈希表实现

缓存数据通常存储在内存中,哈希表是最常用的数据结构之一。通过哈希函数,将数据的键(key)映射到哈希表中的索引位置,从而实现高效的数据查找。哈希表能够确保在常数时间内进行数据存取,使得缓存的读写效率非常高。

在这里插入图片描述

首先,我们拿到 key、value 数据结构,在上图的例子中,key 是字符串 abc,value 是字符串 hello,我们先计算 key 的哈希值,比如字符串 abc 的 hashcode 算出来是 101 这样一个整型值。往下,计算哈希值 101 对应的 hash 表索引就要对 8 取模。此处 8 指什么?哈希表真正的物理存储是一个数组,我们建的哈希表长度是 8,如上图所示。101 对 8 取模余 5,这个 5 就是数组下标的索引值,我们就可以把 abc hello 这样一个 key、value 值存储在下标为 5 的数组记录中。这一步是最关键的,通常我们所谓的哈希算法也就是指这一步,即如何把一个哈希值转换成在数组中对应的位置。这个例子我们使用的是余数哈希,实践中最常用的也是余数哈希。

将来,当我们要进行数据读取的时候,只要给定 key abc,还是用这样一个算法过程,先求取它的 hash code 101,然后再对 8 取模。因为数组的长度不变,对 8 取模以后依然是余 5,那么我们到数字下标中去找 5 的这个位置,就可以找到前面存储进去的 abc 对应的 value 值。

通过哈希表可以使整个数据存储或检索效率时间复杂都是 O(1)。所以即使存储非常大的几百万上千万的数据量,通过哈希表也可以非常快地进行数据的查找和读写。通过这种手段缓存可以获得较快的读写访问特性,比数据库中的读写速度要快得多。


六、分布式缓存与一致性哈希

在分布式系统中,分布式缓存非常重要,它能够跨多个服务器存储数据并确保数据的一致性。一致性哈希是解决分布式缓存中数据分布问题的常见算法,它能将数据均匀地分配到多个节点,避免了缓存热点和缓存不均的情况。


七、优化缓存性能

优化缓存性能的关键在于以下几个方面:

  1. 缓存键的设计
    缓存键的设计直接影响缓存的效率。设计时应尽量减少缓存键的数量,避免过多不必要的缓存键,以提高缓存的命中率。

  2. 内存空间管理
    缓存的内存空间大小决定了能够存储的缓存对象数量。在有限的内存空间下,使用合适的缓存清除策略(如 LRU 算法)来管理缓存对象,确保最常用的数据保持在缓存中。

  3. 缓存失效与清理
    缓存的有效期(TTL)需要根据业务需求进行合理设置。定期清理失效的缓存对象,并使用适当的失效策略(如超时失效、清除失效等)以优化缓存性能。


总结

缓存作为一种优化手段,能够显著提高系统的性能,减少数据库负载,降低 IO 压力。然而,缓存的使用也面临一定的挑战,如数据一致性问题、缓存雪崩等。理解不同类型的缓存及其应用场景、合理设计缓存系统的架构和管理缓存数据的生命周期,是提升系统性能的关键。

在分布式系统中,分布式缓存和一致性哈希算法为大规模数据提供了高效存储和访问方案,使得缓存技术可以在复杂的环境中有效运行。通过合理优化缓存,开发人员可以大幅度提升系统的响应速度和吞吐量,为用户提供更快、更稳定的服务。

在这里插入图片描述

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

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

相关文章

C# 打印Word文档 – 4种打印方法

Word文档是日常办公和学习中不可或缺的一部分。比如在商务往来中,经常需要打印 Word 文档用于撰写和传递正式的商务信函、合作协议、项目提案等。打印出来的文档便于双方签字盖章,具有法律效力和正式性。本文将提供以下4种通过C# 打印Word文档的方法&…

数据结构(陈越,何钦铭) 第四讲 树(中)

4.1 二叉搜索树 4.1.1 二叉搜索树及查找 Position Find(ElementTyoe X,BinTree BST){if(!BST){return NULL;}if(X>BST->Data){return Find(X,BST->Right)}else if(X<BST->Data){return Find(X,BST->Left)}else{return BST;} } Position IterFind(ElementTyp…

网络空间安全(1)web应用程序的发展历程

前言 Web应用程序的发展历程是一部技术创新与社会变革交织的长卷&#xff0c;从简单的文档共享系统到如今复杂、交互式、数据驱动的平台&#xff0c;经历了多个重要阶段。 一、起源与初期发展&#xff08;1989-1995年&#xff09; Web的诞生&#xff1a; 1989年&#xff0c;欧洲…

【Matlab仿真】Matlab Function中如何使用静态变量?

背景 根据Simulink的运行机制&#xff0c;每个采样点会调用一次MATLAB Function的函数&#xff0c;两次调用之间&#xff0c;同一个变量的前次计算的终值如何传递到当前计算周期来&#xff1f;其实可以使用persistent变量实现函数退出和进入时内部变量值的保持。 persistent变…

网络安全 linux学习计划 linux网络安全精要

2.使用命令行 文件系统层次标准&#xff08;FHS&#xff09;是一个文件和目录在Unix和Linux操作系统上面应该如何存储的定义。 /bin 重要的二进制可执行程序/boot 与系统启动有关的文件/etc 系统配置文件/home 普通用户家目录/lib 重要的系统库/media 可移动介质的挂载路径/m…

基于SSM的《计算机网络》题库管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘 要 《计算机网络》题库管理系统是一种新颖的考试管理模式&#xff0c;因为系统是用Java技术进行开发。系统分为三个用户进行登录并操作&#xff0c;分别是管理员、教师和学生。教师在系统后台新增试题和试卷&#xff0c;学生进行在线考试&#xff0c;还能对考生记录、错题…

Pretraining Language Models with Text-Attributed Heterogeneous Graphs

Pretraining Language Models with Text-Attributed Heterogeneous Graphs EMNLP 推荐指数&#xff1a;#paper/⭐⭐#​ 贡献&#xff1a; 我们研究了在更复杂的数据结构上预训练LM的问题&#xff0c;即&#xff0c;TAHG。与大多数只能从每个节点的文本描述中学习的PLM不同&…

DeepSeek 提示词:基础结构

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

2025-02-25 学习记录--C/C++-用C语言实现删除字符串中的子串

用C语言实现删除字符串中的子串 在C语言中&#xff0c;你可以使用strstr函数来查找子串&#xff0c;然后用memmove或strcpy来覆盖或删除找到的子串。 一、举例 &#x1f430; #include <stdio.h> // 包含标准输入输出库&#xff0c;用于使用 printf 函数 #include <s…

Python入门12:面向对象的三大特征与高级特性详解

面向对象编程&#xff08;OOP&#xff09;是Python编程中非常重要的一部分&#xff0c;它通过封装、继承和多态这三大特征&#xff0c;帮助我们更好地组织和管理代码。除此之外&#xff0c;Python还提供了一些其他特性&#xff0c;如类属性、类方法和静态方法&#xff0c;进一步…

对计算机中缓存的理解和使用Redis作为缓存

使用Redis作为缓存缓存例子缓存的引入 Redis缓存的实现 使用Redis作为缓存 缓存 ​什么是缓存&#xff0c;第一次接触这个东西是在考研学习408的时候&#xff0c;计算机组成原理里面学习到Cache缓存&#xff0c;用于降低由于内存和CPU的速度的差异带来的延迟。它是在CPU和内存…

音视频入门基础:RTP专题(12)——RTP中的NAL Unit Type简介

一、引言 RTP封装H.264时&#xff0c;RTP对NALU Header的nal_unit_type附加了扩展含义。 由《音视频入门基础&#xff1a;H.264专题&#xff08;4&#xff09;——NALU Header&#xff1a;forbidden_zero_bit、nal_ref_idc、nal_unit_type简介》可以知道&#xff0c;nal_unit…

Linux 驱动入门(6)—— IRDA(红外遥控模块)驱动

文章目录 一、编译替换内核和设备树二、IRDA&#xff08;红外遥控模块&#xff09;1. 红外遥控简介2. 红外遥控器协议3. 编程思路 三、驱动代码1. GPIO 实现1.1 驱动层代码1.2 应用层代码 2. 设备树实现2.1 修改设备树2.2 驱动层代码2.3 应用层代码 3. 上机测试 一、编译替换内…

QSNCTF-WEB做题记录(2)

[第一章 web入门]常见的搜集 来自 <天狩CTF竞赛平台> 1&#xff0c;首先就是对网站进行目录枚举爆破 dirsearch -u http://challenge.qsnctf.com:31616 -x 404,403 得到如下的目录&#xff0c;分别查看一下内容 /.DS_Store /inde…

「软件设计模式」责任链模式(Chain of Responsibility)

深入解析责任链模式&#xff1a;用C打造灵活的请求处理链 引言&#xff1a;当审批流程遇上设计模式 在软件系统中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个请求需要经过多个处理节点的判断&#xff0c;每个节点都有权决定是否处理或传递请求。就像企业的请假审批…

Ocelot 请求聚合

请求聚合 当下游服务是返回404状态码&#xff0c;在返回结果中&#xff0c;其对应的值则为空值&#xff0c; 即使聚合路由中所有的下游服务都返回404状态码&#xff0c;聚合路由的返回结果也不会是404状态码。 Ocelot允许你声明聚合路由&#xff0c;这样你可以把多个正常的Ro…

MongoDB安装与配置 导入导出

1、MongoDB的安装 首先cd到目录 cd /usr/local/ 执行下载 wget -c https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-7.0.7.tgz 解压文件 tar -xvf mongodb-linux-x86_64-rhel80-7.0.7.tgz 将解压后的“mongodb-linux-x86_64-rhel80-7.0.7”文件夹重命名…

Kotlin 知识点二 延迟初始化和密封类

对变量延迟初始化 Kotlin 语言的许多特性&#xff0c;包括变量不可变&#xff0c;变量不可为空&#xff0c;等等。这些特性 都是为了尽可能地保证程序安全而设计的&#xff0c;但是有些时候这些特性也会在编码时给我们带来不 少的麻烦。 比如&#xff0c;如果你的类中存在很多…

简单介绍 SSL 证书类型: DV、OV、EV 的区别

SSL证书类型DV、OV、EV 区别&#xff1a; DV(域名验证型)SSL证书 OV(组织验证型)SSL证书 EV(扩展验证型)SSL证书

深度解析SmartGBD助力Android音视频数据接入GB28181平台

在当今数字化时代&#xff0c;视频监控与音视频通信技术在各行各业的应用愈发广泛。GB28181协议作为中国国家标准&#xff0c;为视频监控设备的互联互通提供了规范&#xff0c;但在实际应用中&#xff0c;许多Android终端设备并不具备国标音视频能力&#xff0c;这限制了其在相…