【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(场景问题分析+性能影响因素)

news2024/11/27 6:42:18

一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(场景问题分析+性能影响因素)

  • 常见的几个场景问题
    • 问题1:过期还是不过期缓存数据
      • 保证最终一致性
    • 问题2:维度化缓存与增量更新
      • 通过维度化缓存
        • 优点和好处
    • 问题3:缓存值大Value
      • 解决方案:缓存value进行压缩
      • 解决方案:大Value拆分
      • 解决方案:存储方案的调整
    • 问题4:热点缓存问题
    • 问题5:数据预热
    • 问题6:非预期热点数据
    • 问题6:缓存实例故障快速恢复
      • 解决方案
  • 性能影响因素
    • 基础缓存服务能力的优化要点
    • 提升缓存命中率:影响缓存命中率的几个因素
    • 其他的优化和分析方向
  • 彩蛋案例

常见的几个场景问题

在仔细分析数据更新策略后,我们发现正确地使用缓存并不是一件容易的事情。而在实际应用中,还存在许多引人入胜的情景(或称为"坑"),在此我将对它们进行总结和归纳。
在这里插入图片描述

问题1:过期还是不过期缓存数据

对于缓存数据是否需要设置过期时间,需要结合具体场景进行分析和研究

一些长尾商品或者在业务中频繁读取的数据,如果缓存空间较大,可以考虑不设置过期时间

  • Binlog同步:当缓存空间已满时,根据淘汰策略来移除缓存数据,并且数据更新时可以通过Binlog等其他方式进行异步失效缓存。

  • 消息异步更新:如果系统通过消息异步更新的成本过高,或者依赖于外部系统无法进行订阅binlog异步更新,那么就需要使用过期缓存数据来保障数据最终一致性。

  • 缓存数据设置过期时间:缓存数据的过期设置是很重要的,以确保系统的数据一致性。在过期后,系统会重新从数据源获取最新数据,并更新缓存,保证数据的准确性。

保证最终一致性

如果系统中的消息异步更新操作成本过高或者无法依赖外部系统进行订阅binlog异步更新,那么就需要使用过期缓存数据来确保数据的最终一致性。这意味着在缓存中设置一个过期时间,在数据过期后,系统会重新从数据源获取最新数据并更新缓存,保证数据的准确性。这种方式虽然增加了系统的复杂性,但可以在特定场景下确保数据一致性的同时,降低异步更新造成的成本和依赖性。


问题2:维度化缓存与增量更新

对于一个实体包含多个属性的情况,如果在实体发生变更时将所有属性都进行一次完全更新,这样的成本是很高的,尤其是当只有其中一部分属性发生变化时。因此,可以考虑将多个属性按照各个维度进行拆解,进行维度化缓存,即根据各个维度分别缓存属性的部分数据。

通过维度化缓存

通过维度化缓存,可以将实体按照不同属性的组合或单独存储,每个维度都有自己的缓存,维度化缓存是一种牺牲存储空间来换取性能提升的策略,在实际应用时需要根据具体情况进行权衡和决策。

优点和好处

  • 局部更新处理:当实体的某个属性发生变化时,只需要针对变化的那个维度进行增量更新,而不需要进行全量的更新。这样可以大大降低更新的成本,提高系统的性能和效率。

  • 局部检索处理:维度化缓存的好处是可以根据不同的查询场景,选择合适的维度进行读取,减少不必要的数据读取,提升查询性能。同时,由于只更新发生变化的维度,可以减少数据库的写入压力,提高写入性能。

注意,维度化缓存需要合理定义维度,并且在更新实体时要准确识别出变化的维度,以保证数据的一致性。同时,维度化缓存还需要维护维度之间的关系,确保数据的完整性和正确性


问题3:缓存值大Value

对于大value的问题,我们需要时刻警惕其对系统性能和资源占用的影响。当value的大小超过系统承载能力时,可能会导致缓存性能下降甚至引起系统崩溃。

解决方案:缓存value进行压缩

解决大value问题的一种方法是对value进行压缩

通过使用压缩算法(如gzip、Snappy等),可以有效减小value在缓存中所占用的空间,降低网络传输成本。在数据获取时,再解压缩并使用。

解决方案:大Value拆分

另一种策略是将大value进行拆解,将其分为多个小的value进行缓存

在实际业务服务中,针对需要使用大value的场景,可以进行数据聚合操作。即在获取数据时,从多个小的value中聚合出所需数据。这样既能减少大value带来的缓存存储和传输压力,又能保证业务服务中使用的数据完整和准确。

解决方案:存储方案的调整

对于大value问题,还可以考虑存储方案的调整,例如,将大value存储到专门的文件存储系统或对象存储系统中,并将其路径或标识存储在缓存中。这样可以避免大value直接占用缓存的存储空间,提高缓存的效率和性能。

注意,在进行拆解和聚合时,需要合理划分拆解的粒度和聚合的方式,以及确保拆解和聚合操作的正确性和一致性


问题4:热点缓存问题

针对热点缓存问题,如果每次都从远程缓存中获取数据,会给缓存系统带来较大的负载压力,并可能导致获取缓存数据的响应时间变慢。为了解决这个问题,可以考虑以下策略:
在这里插入图片描述

  • 使用缓存集群:将多个缓存节点组成集群,每个节点都可以处理缓存请求。这样可以分散负载,提高缓存系统的承载能力。请求可以通过负载均衡算法分发到不同的节点,减轻单个节点的负载压力。

  • 主从读写分离:在缓存集群中,可以增加更多的从缓存节点。从缓存节点负责处理读取热点数据的请求,而主缓存节点则负责处理写入数据的请求。这样能够更好地分离读写操作,降低主缓存节点的负载,提高读取数据的效率。

  • 使用应用本地缓存:对于热点数据,可以在应用程序本地使用缓存来减少对远程缓存的请求负载。应用本地缓存可以是内存缓存或本地文件系统缓存,可以使用第三方缓存框架或自行实现。在读取热点数据时,先检查本地缓存是否存在,如果存在则直接使用,避免远程缓存的调用,减轻远程缓存的压力,提高读取数据的响应速度。

注意,使用缓存集群和应用本地缓存都需要进行缓存一致性的考虑。确保数据的一致性和准确性是非常重要的。可以使用缓存失效策略、缓存更新策略等方式来保证数据的一致性


问题5:数据预热

数据预热是一种常见的优化策略,它的目的是提前将数据加载到缓存中,以减少对数据库的请求次数,提高系统的性能和响应速度。

数据预热的方式可以分为两种情况:

  • 容量较高:在容量较高的情况下,可以选择进行全量预热,即将所有的数据都加载到缓存中。这样可以保证所有的数据都在缓存中可用,避免大量的请求回源到数据库。但是需要考虑到数据量大时会对缓存和系统资源造成一定压力。

  • 容量有限:在容量有限的情况下,只能选择预热一部分高频热点数据。对于高频热点数据的预热可以有效减少对数据库的请求,提高数据访问的速度。但是需要注意选择哪些数据进行预热,以保证预热的效果最大化。

在进行数据预热时,还需要考虑以下几点:

  • 批量操作:如果数据的预热是需要进行批量操作的,需要注意批量操作可能带来的性能问题。可以选择分批次进行预热,或者采用异步加载的方式来提高预热的效率。

  • 慢SQL带来的性能问题:如果在进行数据预热时,遇到了慢SQL操作,可能会影响预热的效率和整个系统的性能。需要通过优化SQL查询语句、建立合适的索引等手段来减少慢SQL的影响。

  • 监控机制:在整个数据预热过程中,需要建立可靠的监控机制,以保障预热的进度和结果。监控机制可以包括监控预热的数据量、耗时等指标,并及时发现和处理可能出现的问题。


问题6:非预期热点数据

非预期热点数据是指在业务预估中没有考虑到的数据,但在实际运行中却成为热点数据。针对这种情况,可以采取以下策略来处理:

  • 热点发现系统:建立热点发现系统可以通过监控和统计业务中的数据访问情况,实时发现热点key。这可以帮助系统动态地捕捉非预期的热点数据,并为后续的缓存策略做出相应的调整。

  • 实时监控:通过实时监控非预期的热点数据,可以迅速了解热点数据的情况,并做出相应的处理措施。例如,可以将这些热点key推送到本地缓存中,以减少对远程缓存的请求,防止预估不足的热点key影响远程缓存服务的性能。

  • 缓存优化:针对非预期的热点数据,可以优化缓存策略。考虑将这些热点key推送到本地缓存中,以减少对远程缓存的请求。这样可以提高数据的访问速度和系统的性能。

  • 动态调整:根据热点发现系统的反馈,动态地调整缓存策略。当发现新的非预期热点数据时,可以即时将其加入到本地缓存中,以避免再次拖垮远程缓存服务。

为了应对非预期的热点数据,需要建立热点发现系统来监控实际运行中的数据访问情况,并做出相应的缓存优化策略。这样可以有效地防止预估不足的热点key对系统性能的影响


问题6:缓存实例故障快速恢复

缓存故障:当某一个缓存实例发生故障时,会导致流量迅速到达数据库层,造成系统性能下降。

解决方案

  • 分片实例存储:为了解决缓存故障问题,常采用分片实例存储来进行缓存数据的分布。如果采用取模机制的缓存key路由策略,故障实例会导致流量集中到其他实例,可能导致性能问题。

  • 主从机制:通过采用主从机制可以实现缓存的高可用性。当一个实例故障时,其他实例可以继续提供服务。但是这种方式的问题在于水平扩展有限,增加新节点会导致缓存命中率下降。

  • 一致性哈希策略:采用一致性哈希的缓存key路由策略,故障实例只会导致哈希环上的部分缓存不命中,不会影响大量的请求到达数据库。但是对于热点数据而言,可能导致负载过高,成为系统瓶颈。

  • 实例故障恢复方式:针对实例故障,可以采取多种方式恢复,包括主从机制的数据备份、新增缓存实例并异步线程预热数据,以及从一致性哈希路由策略降级为取模策略的方式。

总的来说,针对缓存实例故障,可以采用分片实例存储、主从机制和一致性哈希策略等方式来提高系统的可用性和性能。在实例故障恢复时,可以根据具体情况选择不同的方式进行处理

性能影响因素

缓存整体性能受到许多不同大小的影响因素的影响。其中包括语言本身的特性,如Java需要考虑垃圾回收(GC)的影响。此外,还需要尽可能提高缓存命中率等方面。

基础缓存服务能力的优化要点

总结而言,以下是几个核心的影响因素:
在这里插入图片描述

  1. 语言特性:选择的编程语言对缓存性能有着重要影响。例如,在Java中,需要考虑垃圾回收对缓存性能的潜在影响。

  2. 缓存命中率:缓存命中率是衡量缓存性能的重要指标。提高缓存命中率可以减少对底层数据存储系统的访问,从而提高整体性能。

  3. 缓存算法:选择合适的缓存算法也是优化缓存性能的关键因素。常见的算法包括LRU(最近最少使用)、LFU(最近最少使用)和ARC(自适应替换缓存)等。

  4. 缓存容量:缓存容量的大小直接影响缓存性能。过小的缓存容量可能导致频繁的缓存失效,而过大的缓存容量可能浪费资源。

  5. 缓存策略:选择合适的缓存策略也能提高性能。例如,采用预热策略可以在应用启动之前将热点数据加载到缓存中,从而降低缓存冷启动的影响。

综上所述,这些是影响缓存整体性能的核心因素,需要综合考虑并进行优化来提升系统性能。

提升缓存命中率:影响缓存命中率的几个因素

在这里插入图片描述

  • 业务时效性要求:缓存适用于"读多写少"的业务场景,并且根据业务性质确定时效性要求。不同的时效性要求决定了缓存的更新策略和过期时间。对于时效性要求较低的业务,使用缓存可以提高缓存命中率。

  • 缓存粒度设计:一般来说,缓存对象的粒度越小,越适合使用缓存,因为这样不会频繁更新导致缓存命中率下降。

  • 缓存淘汰策略:如果缓存空间有限,采用不同的缓存淘汰策略会影响缓存命中率。如果淘汰的缓存数据后续被大量使用,将会降低缓存命中率。

  • 缓存部署方式:在使用分布式缓存时,需要进行容量规划和容灾策略的设计,以防缓存实例故障导致大规模缓存失效。

  • Key路由策略:不同的路由策略会在节点实例故障后产生不同的影响。如果采用取模的方式进行水平扩展,可能会降低缓存命中率。综合以上分析,提高缓存命中率没有一种统一的准则,需要综合考虑这些因素,并在高频访问且时效性要求不高的业务数据上使用缓存。

其他的优化和分析方向

  • 序列化方式:使用远程缓存服务时,必须对数据进行序列化后在网络中进行传输。选择不同的序列化方式会对缓存性能产生影响。在选择序列化方式时,需要考虑序列化的耗时、序列化后在网络传输中的包大小以及序列化的计算开销。

  • GC影响:使用多级缓存或大对象时,会采用应用本地缓存。针对Java应用程序,需要考虑大对象对垃圾回收(GC)的影响。

  • 缓存协议:了解不同的缓存协议的优缺点,例如Redis和Memcached协议,并根据业务场景进行选择。

  • 缓存连接池:为了提升访问性能,需要合理地设置缓存连接池。

  • 完善的监控平台:考虑是否有一套完善的缓存监控平台,能够追踪缓存的使用情况、缓存服务的整体性能,并发现一些意外的热点数据。只有如此才能综合保障缓存服务的可用性和性能。

彩蛋案例

在这里,我向大家推荐一本关于JVM优化和调优的实战系列书籍,《深入浅出Java虚拟机 — JVM原理与实战》。这本书是最新出版的,内容涵盖了与我们当前工作和开发实例密切相关的技术和实战案例。通过学习这本书,我们可以深入了解Java虚拟机的原理,并通过实践掌握优化和调优的技巧。我诚挚地推荐这本书给大家,相信它将为我们的工作和技术发展带来巨大的收益。希望大家能够抽出时间多多学习一下这本宝贵的资料
在这里插入图片描述
【当当-点击链接】【京东-点击链接】

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

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

相关文章

总在谈流程,却又做不好,问题出在哪?

时至今日,流程这个概念无论是在理论层面还是实践层面,都已为大家所熟知。 特别是随着华为的崛起,流程的吸引力与日俱增,为数不少的企业都在服用流程这剂灵丹妙药。 可是,真正搞明白流程概念的企业还不算多&#xff0…

win10开启远程桌面,win10开启3389端口

文章目录 前言一、不能远程桌面的原因1.1、系统设置未开启远程桌面功能1.2、开启防火墙3389端口1.3、开启3389端口 二、开启3389端口2.1、查看是否开启端口2.2、启动远程桌面服务2.3、远程连接administrator账号提示由于账户限制无法登录 三、其他 前言 最近重装了一下小主机系…

Unity 非父子物体保持相对静止

非父子物体保持相对静止 🍔效果🥪食用 🍔效果 保持两个非父子关系的物体坐标、旋转相对静止 🥪食用 插件下载 using System.Collections; using System.Collections.Generic; using UnityEngine;namespace ZYF {public class…

IntelliJ IDEA路径里面的反斜杠变成了其他符号解决办法

IntelliJ IDEA里面配置任何路径的时候路径里面的反斜杠分隔符变成了其他符号解决办法。 问题如图: 路径都变成了W加删除线。 原因: 字体设置问题,字体把斜杠转义了。 解决: 别用Gothic的相关字体,换成其他字体即…

如何在可视化页面中保证数据安全?Sugar BI通过URL参数标识用户,灵活实现用户权限

公开分享之后的大屏/报表页面中,由于不需要用户登录账号,因此页面中 数据模型的行级别权限、SQL 建模中嵌入用户邮箱、API 后端获取当前登录用户 这些需要用户登录账号才能进行的权限限制功能都不可用。 但是在一些场景下,是期望这些权限功能…

滴水逆向三期笔记与作业——02C语言——04 IF语句逆向分析上

OneNote防丢失。 海哥牛逼。 IF语句逆向分析上 一、内存图二、如何判断函数的参数2.1 一般情况 三、if的汇编案例根据汇编还原if 四、作业 一、内存图 二、如何判断函数的参数 2.1 一般情况 三、if的汇编 案例 根据汇编还原if 四、作业 海哥牛逼。

macbook安装chatglm2-6b

1、前言 chatglm安装环境还是比较简单的,比起Stable diffusion安装轻松不少。   安装分两部分,一是github的源码,二是Hugging Face上的模型代码;安装过程跟着官方的readme文档就能顺利安装。以下安装内容,绝大部分是…

自然语言处理:多层感知机MLP和Word2vec

文章目录 多层感知机MLP1.神经网络2.反向传播算法3.激活函数4.损失函数5.神经网络的使用场景 Word2vec参考 多层感知机MLP 1.神经网络 神经网络是一种计算模型,它受到人脑神经元之间连接和信息处理方式的启发。它由许多简单的处理单元(称为神经元或节点…

初始Liunx线程

文章目录 前言1.初始Liunx下线程2.关于虚拟地址的补充知识3.线程的相关特点1.线程的优点2.线程的缺点3.线程异常4.线程和进程的比较 4.线程相关操作接口线程控制相关接口 5.关于线程id的理解 前言 本文主要是对Liunx之下线程的前置知识铺垫,同时也是对之前进程的相…

Spring Boot 中的认证是什么,如何使用

Spring Boot 中的认证是什么,如何使用 在 Web 应用程序中,认证是一项重要的安全措施。Spring Boot 提供了丰富的认证机制,可以帮助我们轻松地实现各种认证需求。本文将介绍 Spring Boot 中的认证是什么,以及如何使用 Spring Boot…

2023上半年软考系统分析师科目一整理-16

2023上半年软考系统分析师科目一整理-16 信息系统的性能评价指标是客观评价信息系统性能的依据,其中,( )是指系统在单位时间内处理请求的数量。 A.系统响应时间 B.吞吐量 C.资源利用率 D.并发用户数 运用互联网技术,在…

软件工程——第7章实现知识点整理

本专栏是博主个人笔记,主要目的是利用碎片化的时间来记忆软工知识点,特此声明! 文章目录 1.实现由哪两个部分组成? 2.编码是什么?所选用的程序设计语言对程序的哪些特性有着深远影响? 3.软件测试在软件生…

旅游卡系统招募城市合伙人

旅游业的不断发展,旅游卡系统作为一种新型的旅游消费模式也逐渐被越来越多的人所认可。现在,许多旅游卡系统开始招募城市合伙人,以进一步拓展其市场。 旅游卡系统是一种可以将不同景区、景点门票进行整合,并提供折扣优惠的旅游…

谈谈mysql——Binlog的复制方式和解析技巧

mysql 我们先来看一下MySQL的基本架构,从大的方面来讲,一个server层,一个引擎层。server层就像一个接口,可以对接任何符合规定的引擎。具体的细节可以参考我之前写过的文章mysql的这些坑你踩过吗?快来看看怎么优化mys…

vue3+pinia用户信息持久缓存(token)的问题

vue3pinia用户信息持久缓存(token)的问题 对博主来说,这是个相当复杂的问题。 当初在使用vue2vuex进行用户信息持久登录时,写了不下3篇博客,确实是解决了问题,博客链接如下 vue存储和使用后端传递过来的tokenvue中对…

动态规划之 509斐波那契数(第1道)

目录 题目:斐波那契数 (通常用 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。 解法: 动态规划法: 题目:斐波那契数 (通常用…

大象机器人人工智能套装2023版深度学习协作机器人、先进机器视觉与应用场景

引言: 介绍当前的版本 今天我们要介绍的是aikit2023,aikit2023是aikit的全新升级版。 AIkit 2023 是一套集视觉,定位抓取、自动分拣模块为一体的入门级人工智能套装。 该套装基于python平台,可通过开发软件实现机械臂的控制&am…

gitee提交项目失败记录:remote:error:hook declined to update refs/heads/master

问题描述; 今天修改了项目里面一些文件内容,结果提交的时候报错了,可以提交到本地仓库,但提交到中央仓库报如下异常,因此记录下,防止后面再遇到…… 解决办法: 登录gitee账号,在设置…

自定义MVC的进阶使用

文章目录 前言一、环境配置1.1 将框架打包成jar包1.2 将Jar包导入新项目1.3 将分页标签相关文件、及相关助手类导入1.4 配置文件 二、前后台编写2.1 实体类2.2 dao2.3 Servlet2.4 配置mvc.xml2.5 JSP2.6 运行结果 前言 通用增删改查、通用分页、XML解析反射建模,包…

【网络安全带你练爬虫-100练】第6练:内嵌发包提取数据

目录 一、分析目标: 二、代码实现 目标1:对于捕获的URL内嵌发包 目标2:找到电话和邮箱的位置 目标3:提取电话和邮箱 三、完整代码 四、网络安全小圈子 (注:需要带上登录成功后的cookie发包&#xff…