当前位置: 首页 > news >正文

设计艺术~缓存结构设计

背景

面对高QPS场景的业务,不得不考虑对一些数据做缓存设计,常见的缓存设计有这些:DB Proxy缓存、分布式缓存、Localcache缓存。
在考虑加缓存的背景下不考虑数据的一致性,都是瞎扯,所以我们再定义一下数据的一致性场景:强制一致性、最终一致性。本质上只要加了缓存就会破坏数据的一致性,最起码破坏了数据的强一致性。但在不同的缓存选择下,最终一致性的延迟效果是完全不同的。
在这里插入图片描述

DB Proxy缓存

DB proxy 缓存是比较简单的一种缓存,它的拓展性和策略手段也偏少,基本上只能做某 key 某 SQL 超过一定 QPS 之后,做一些结果缓存。缓存时间可以设置个1秒、2秒、3秒,按照你的业务需求去做决定。但本质上它的策略手段因为太单一,你也没有办法去做一些强制的删除或强制的更新。所以优势就在于简单,纯配置就可以。劣势就在于策略手段太过单一,维护热 key 缓存的 key 的手段太过单一。而且 DB proxy 缓存一般也不能承担太多的缓存任务,只有一些非常非常高的 key 比如说一些 key 的 QPS 超过了20K 30K 才会考虑对着一个 k 去开启。而且是得手动针对某一个 key 去开启,最好不要全局去开启,避免一些不必要的问题。

分布式缓存

分布式缓存应该是最常用的,最熟悉的应该就是 Redis 它可以把 DB 的一些查询结果做一些缓存。效果策略手段也是最好的。我们可以做一些策略化的过期时间,可以针对某一个 key 或者批量针对某一批 key 去做缓存,由业务代码去设定,灵活性更好。缺点的话就在于它对于超高的 QPS 的 key 这个超高怎么定义呢?就从 Redis 的单 key 的承载能力去做定义。一个 key 如果超过了5000QPS 也就是5K 多流量,可以认为是热 key 那超过10K 也就是1万的 QPS 那基本上就靠 Redis 去缓存,也是不可靠的,会引起单分片的 CPU 问题。靠分布式缓存就不太好解决了。

Localcache缓存

对于前面提到的,如果某一个 key 超过了10K 的 QPS 就需要考虑去做 local cache 本地缓存。本地缓存优势就在于它可以本地区直接返回结果,对吞吐量、响应的效率、速度都有非常好的支持。但它的缺陷就在于维护成本太高。因为它会消耗机器的实际内存,我们内存资源是非常宝贵的,所以一般 local CACHE 会有一个内存上限,也会有很多的淘汰算法。再一个就是使用分布式缓存的话,因为它是分布式的,你可以去做一些强制更新,缓存更新。我们常见的延迟双删这些技术点,都是为了保证一致性。但 local CACHE 的话,它就不太好去做这些事情了。也就是说,local CACHE 缓存的 key 它没有办法去全量的删除,在它过期时间之前。这也是它的一个缺点。

选型

所以选型的话,如果一个数据是超高 QPS 超过了10K 甚至以上,并且你认为它的一致性还好,就比如是一些点赞的数值啊。直播间人数啊这些完全可以考虑去通过 local cache 去做承载,但要设置好缓存这个 key 的条件和过期时间以及淘汰策略。避免因为 local CACHE 导致整个机器的内存使用消耗太高。最常用的,最实用的应该就是分布式缓存。它可以做一些像延迟双删这样的一些技术手段,去保证一致性,也可以使用一些很多的算法去策略手段去做缓存,比如把时间打散,比如说某一个 key 去设置5秒还是3秒过期,由业务代码去决定,灵活性是最好的。DB proxy 缓存的话就比较的简单,可以为了在发现某一个 key 对机器产生影响了之后,主动的为这个 key 开启缓存来,算是一个运维能力去保护 DB也就是说,得你主动的去发现某 key 特别超高。然后去开启。


文章转载自:

http://5YQuayvs.ymwny.cn
http://t3R2rkPr.ymwny.cn
http://Il9Ri8Fr.ymwny.cn
http://2O9hMOnV.ymwny.cn
http://YVCXbbqv.ymwny.cn
http://zDlYYCq4.ymwny.cn
http://KobLSAma.ymwny.cn
http://Y1XmqrwV.ymwny.cn
http://icQF698z.ymwny.cn
http://CXl8eZXc.ymwny.cn
http://TwEP5fxY.ymwny.cn
http://6nv6G6cI.ymwny.cn
http://EA0h870g.ymwny.cn
http://E3N7DKuX.ymwny.cn
http://Sia0vdn9.ymwny.cn
http://M7wlkRi4.ymwny.cn
http://RAnpbuek.ymwny.cn
http://C84VJTeA.ymwny.cn
http://Arm12Ouc.ymwny.cn
http://6aAxz3e8.ymwny.cn
http://BGxGOp5x.ymwny.cn
http://ZMVyjZOH.ymwny.cn
http://2pVA69KR.ymwny.cn
http://tYf70fFl.ymwny.cn
http://IlESv2Ta.ymwny.cn
http://n7gKTVaW.ymwny.cn
http://9JOZdsm0.ymwny.cn
http://kN7WJCGw.ymwny.cn
http://FdWqmqM5.ymwny.cn
http://8Gp1mlq6.ymwny.cn
http://www.dtcms.com/a/370440.html

相关文章:

  • 腾讯混元游戏视觉生成平台正式发布2.0版本
  • MySQL整理【01】
  • MQTT 与 Java 框架集成:Spring Boot 实战(三)
  • docker 推送仓库(含搭建、代理等)
  • 了解Python
  • LeetCode //C - 848. Shifting Letters
  • 数学判官为中医续命
  • 华为OmniPlacement技术深度解析:突破超大规模MoE模型推理瓶颈的创新设计
  • Web Worker 从原理到实战 —— 把耗时工作搬到后台线程,避免页面卡顿
  • [网络入侵AI检测] docs | 任务二分类与多分类
  • Browser Use:打造你的浏览器自动化助手
  • 全维度质量保障:捷多邦厚铜板控制方法详解
  • PDF文件基础-计算机字体
  • Python 制作的一个小说在线阅读工具
  • 携程社招前端面经
  • 基于扰动观察法(PO)的光伏最大跟踪策略Simulink
  • 提示语规则引擎:spring-ai整合liteflow
  • 少儿舞蹈小程序(9)校区信息展示
  • EG2103 SOP-8 内置600V功率MOS管 栅极驱动芯片
  • 【目录-判断】鸿蒙HarmonyOS开发者基础
  • 实体商业创新观察:AI 驱动的本地生活服务新模式解析
  • ThinkPHP 6框架常见错误:htmlentities()函数参数类型问题解决
  • 【Big Data】Apache Kafka 分布式流处理平台的实时处理实践与洞察
  • 大模型服务之下的新旧政务智能系统比较
  • 贪心算法应用:流行病干预策略问题详解
  • 雪球科技Java开发工程师笔试题
  • 【pyhton】函数
  • 进阶向:密码生成与管理工具
  • SWEET:大语言模型的选择性水印
  • 基于Transformer的交通流预测和拥堵识别模型