多级缓存建设方案

news2024/11/28 10:36:29

项目背景

   xx系统中对容量和耗时有较高要求,以支付优惠立减为例,每个用户咨询可用立减时,都会过一遍全量生效活动。目前日常活动数3000+,目标2w+;日常秒级咨询量1w+,大促22w+。所以如何支撑日常和大促的业务非常具有挑战性。

   对此我们做了很多优化,其中缓存是整个优化的基石。我们对优惠模型、优惠活动预算和优惠周期预算等数据都做了缓存,但在日常开发中存在以下问题:

  1. 没有标准的缓存设计方案,需要翻其他系统的代码去理解怎么做;
  2. 开发成本高,搭建一套缓存要创建多个类,其中较多代码可复用;
  3. 容易踩坑,比如数据一致性问题、缓存击穿、热点key问题等。

   本次缓存设计参考自yy系统,其代码经过了长时间的验证,所以我们希望输出一套缓存标准化方法,尽量满足当前已有业务场景,经过验证后能推广至其他系统,帮助大家夯实缓存系统,为业务发展保驾护航。

多级缓存整体设计

为什么需要多级缓存?

   通过建设 可选的分级缓存结构、各层级缓存数据的不同scope、各层级不同的更新策略 的多级缓存,减少网络IO,极大的提高各个应用节点获取数据的速度。

适用场景

  1. 针对数据变更较少。如大促期间的优惠配置、商户支付规则配置等。
  2. 访问量非常大的。这个概念需要case by case去看,一般是某个接口会对某批数据高频查询使用的场景,数据QPS > 10w or 接口TPS > 10w
  3. 接受较短时间的数据同步延迟的场景。
  4. 不接受 既要 非常满足CAP能力,又要 保证数据吞吐量,还要 多级缓存结构的业务通用性,这是非常不合理的述求,异常情况兼容处理的 ROI 太低,建议由提出这个想法的人来做。分布式多级缓存的 Consistency 和 Availability,只能是尽量满足,如果业务能接受一些技术层面的规则,我们的架构就能在 Consistency 和 Availability 上做的更好。

分级缓存结构

参照已有的系统,有较为常用的三级缓存结构:

  1. 常驻缓存:存放静态数据或热点数据,一般没有超时时间也不会被剔除。为解决变更数据的一致性问题,需要数据推送更新一定成功,定时任务只校验数据一致性问题;
  2. LRU缓存:存放懒加载的热点数据,使用LRU淘汰机制打散的过期时间维护缓存数据;
  3. 远端缓存:存放近期的全量数据,会设置较长的过期时间,尽量不被击穿,保护数据源;
  4. 数据源:存放全量数据,通常是数据库或者外部查询接口。

各级缓存形成一个数据正金字塔,流量访问倒金字塔,越上层存放着越经常访问的数据,承担着更多的流量。

在这里插入图片描述
说明:

  1. 为什么要常驻缓存和LRU缓存?
    a. 如果只有一个LRU缓存,那么在预热时存在预读失效的问题,导致真正需要缓存的数据不在LRU中。
    b. 如果只有一个常驻缓存,那么其数据容量是有限的,需要选择性的缓存数据,会导致该模块业务通用性不够强。
    c. 常驻缓存和LRU缓存设计参考的是InnoDB中的LRU实现思路。
  2. 常驻缓存、LRU缓存的数据有什么差异?
    a. 长期来看,常驻缓存和LRU缓存中的数据会呈现互补的关系。

缓存更新机制(Consistency保障)

多级缓存更新设计时,应考虑的问题

   先抛出业务问题,再看解决的方案。

  1. DB 数据变更后,如何尽快的让业务使用到最新的数据?
    • 需要主动更新的方式,尽快变更缓存中的数据
  2. 在1更新数据时,由于一些未知因素导致缓存数据更新失败,该如何处理?
    • 为避免部分数据更新成功,部分数据更新失败,需要保证更新操作的原子性,既有更新的操作,有更新失败的回滚操作即可。(不建议对小概率的异常场景,进行过多的设计)
  3. 如何及时发现各级缓存的数据不一致问题和使用情况
    • 主动增量变更数据时,保证操作的原子性
    • 定时任务定时扫描
  4. 为什么不要延时双删?怎么解决在更新数据的同时,把历史数据加载到了缓存中,导致脏数据长时间在Cache中。延时双删方案
    • 本业务方案中,不使用删除的方式,在完成DB的数据变更后,使用更新DB的数据更新到各级缓存,可以解决延时双删方案中,读取并使用老的数据更新缓存的问题。
    • 同步更新DB和Cache 或 延时双删的策略,需按业务场景自行决策。
  5. 如何解决热点key的大批量请求影响系统的运行问题?
    • 热点key一般都会被放在一级常驻缓存中,正常来讲,不影响单台node的运行
    • 若疏忽上面的步骤,且一级LRU缓存中,没有对应的数据,那么将请求到远端缓存中,此时应当可以得到数据,也可以解决热点key问题对应用的影响
    • 若上面两级缓存中都不存在,我们在远端缓存查询DB时,使用分布式排他锁,避免大量请求到DB端,也可以解决绝大部分场景下的热点key问题对应用的影响。

   Consistency 由推拉结合的方式来保障,但不同层级的缓存操作流程不一样,整体架构图如下:
在这里插入图片描述

通过业务平台被动的数据变更流程

在这里插入图片描述
备注:

  1. 蓝色为业务管理系统,绿色为应用服务

多级缓存主动增量更新机制

请添加图片描述

备注:

  1. 缓存穿透问题的解决:
    • 查询前校验key的合法性
    • 设置守护值,设置一个较短的过期时间
    • 在查询DB的前一级缓存中添加锁(分布式或单机锁),控制缓存击穿。只解决DB层的缓存击穿,其他缓存层级间不处理该问题
  2. 缓存雪崩问题的解决:
    • 设置过期时间时,添加了随机值

定时器缓存核对任务

  1. 通过指定的策略(loop:30min),扫描缓存中的所有Key,并和DB的数据源进行对比;若数据有差异,则抛出告警,不更新缓存;
  2. 记录各个缓存层级基础信息,如命中率、内存使用情况、key情况等

缓存预热加载机制

… …

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

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

相关文章

Unity利用UGUI RawImage组件制作转场动画

Unity利用UGUI RawImage组件制作转场动画 最近接到了一个unity全景图的小项目,由于在不同的场景之间转场时直接转会太过生硬,因此要求有个Alpha转场的动画。于是想到两种可行的方案: 一、UGUI方案 用UGUI显示当前屏幕纹理,然后…

python处理图像的各种技术镜像、旋转、遮挡、叠加、条带化

2.6 图像镜面对称 1、将图像水平镜面转换。 2、将图像垂直镜面转换。 import random #导入模块 import numpy as np import matplotlib.pyplot as plt a plt.imread("1.jpg") # 将图像沿着水平方向重复三次。 ba.copy() da.copy() # 将图像水平镜面转换。&…

【笔记】cuda大师班1-4

一.基本概念 进程(process)一个正在被执行的计算机程序的实例 上下文(context):待处理数据的集合,允许处理器暂停,保持处理的执行和恢复处理 并发:上下文切换,主要应用于…

AIGC - 生产力新工具 Copilot

文章目录 介绍能干啥IDEA 安装 介绍 https://github.com/features/copilot 能干啥 Copilot的主要功能包括: 代码补全和提示:Copilot会根据上下文,智能提示您可能需要的变量,函数,参数等。快速生成代码:Copilot可以快速生成if语句,for循环,类定义,函数定义等代码模板。代码优…

Unity之OpenXR+XR Interaction Toolkit实现 传送

前言 VR中由于走动比较容易头晕,所以基本上玩家移动都是靠传送,这样用户更加直观,传送过去也不会感觉头晕。 好了,那么我们一起来说实现一下OpenXR的传送功能。 准备 我们新建一个3D(URL)项目&#xff0…

git 撤销add/commit,以及更换源命令

前言:主要是为了自己方便记录,省的每次都查找一下这些命令 1、当我们只是想撤回commit,保留add .的时候,可以用下方代码 git reset --soft HEAD^ 2、当我们想撤回commit以及add .的时候,可以用下方代码 git reset…

Mesh形变算法

前言: 作者正好因为动画、模拟仿真等等的重大需求需要预先研发离散形的模型Mesh的形变算法,并且要验证、研究适用的范围、特别是性能等等,摸着石头过河别喷,毕竟我主要是渲染、动画、引擎的对于计算几何、三维重建不是很熟悉&…

Python小姿势 - Python使用Jupyter Notebook

Python使用Jupyter Notebook Jupyter Notebook是一个开源的Web应用程序,可以用来创建和共享包含 live code,公式,可视化和解释性文本的文档。 安装Jupyter Notebook 首先,确保你安装了正确的Python版本和包管理器(pip&…

(6)elasticsearch的分词器

1 文档规范化(normalization) 是为了提高召回率。 停用词 、时态转换、大小写、同义词、语气词。 以下的doc1\doc2,经过normalization之后,在搜索的时候是可以匹配到这两个doc。 我们可以看到,normalization就是把一…

带你认识什么是BMS(电池管理系统)

文章目录 概述BMS的硬件拓扑BMS的电气架构BMS的功能BMS的总压采集(主板功能)BMS的电流采集(主板功能)BMS的电芯电压和温度采集(从板功能)BMS的SOC、SOP和SOH(ASW计算)BSM的绝缘检测B…

ES6新特性(1)

目录 一、字符串扩展 (1)字符串遍历器接口(for...of...) (2)模板字符串 二、字符串新增方法 (1)包含方法 (2)重复方法 (3)补全方…

MySQL数据库,JDBC连接数据库操作流程详细介绍

前言: 在学完 MySQL 和 Java 后,我们通常会尝试使用 Java编译器 连接 MySQL数据库,从而达到使用编译器来操作数据库的效果。连接的这个过程会用 JDBC 相关知识,因此我把 JDBC 包的下载及导入流程,以及 JDBC 的使用流程…

Arduino驱动L298N控制直流电机的正反转和调速

Arduino驱动L298N控制直流电机的正反转和调速 一、前言二、产品参数三、驱动直流电机三、接线图四、程序五、实验结果总结 一、前言 本模块使用ST公司的L298N作为主驱动芯片,具有驱动能力强,发热量低,抗干扰能力强的特点。LN2&am…

Windows系统自带工具介绍

文章目录 1 Windows系统工具1.1 系统增强工具PowerToys1.1.1 简介1.1.2 使用 1.2 增强版任务管理器 Process Explorer1.2.1 简介1.2.2 使用 1.3 进程监视器 Process Monitor1.3.1 简介1.3.2 使用 1.4 数据恢复神器 Windows File Recovery1.4.1 简介1.4.2 使用 1.5 微软AI识图1.…

Acwing- 835. Trie字符串统计

什么是Trie?Trie是一种高效地存储和查找字符串集合的数据结构。 我想,看下图就明白了 hh~ 在本题中,我们将a-z映射为0-25,然后将其作为数组下标,便于处理。 idx为已使用的节点数量(使用一个节点则idx&…

Go语言——【高质量编程 | 代码规范】

作者:非妃是公主 专栏:《Golang》 博客主页:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 文章目录 一、高质量编程定义 二、代码规范1. 代码格式…

Scratch资料

Scratch软件是免费的、免费的、免费的。任何需要花钱才能下载Scratch软件的全是骗子。 1、什么是Scratch Scratch是麻省理工学院的“终身幼儿园团队”开发的一种图形化编程工具。是面向青少年的一款模块化,积木化、可视化的编程语言。 什么是模块化、积木化&…

箭牌家居首次亮相AWE展会,大秀智慧生活新提案

作者 | 曾响铃 文 | 响铃说 2023年作为全面贯彻党的二十大精神开局之年,同时也是后疫情时代的第一年,以科技创新驱动社会发展成为当下首要任务。 特别是科技强国战略的实施落地,对推动经济社会高质量发展有着不可或缺的作用。所谓需求产生…

线性表之单链表(详解)

🍕博客主页:️自信不孤单 🍬文章专栏:数据结构与算法 🍚代码仓库:破浪晓梦 🍭欢迎关注:欢迎大家点赞收藏关注 文章目录 🍥前言🍉链表1. 链表的概念及结构2. 链…

肝一肝设计模式【二】-- 工厂模式

系列文章目录 肝一肝设计模式【一】-- 单例模式 传送门 肝一肝设计模式【二】-- 工厂模式 传送门 文章目录 系列文章目录前言一、简单工厂模式二、工厂方法模式三、抽象工厂模式写在最后 前言 在实际开发过程中,构建对象往往使用new的方式来构建,但随着…