三高项目-缓存设计

分流、并发

导流:将原本复杂操作的请求,引导到简单的操作上。以后再来查,不需要经过复杂的计算。

成本:空间,收益:节省了时间。

不要以为仅仅是 redis,map等。

对应。kv值。

1计算k,2 查询k,3 得到值,做转换。

如果能做好对应,最好,做不好对应呢? 命中率。没有命中的缓存,查原数据。

数据的查询时间:时间(123)+(1-命中率p)*查原数据的时间。

命中率=缓存中能查到的数据/数据库总数据

如何 提升缓存的收益:

减少 123时间。

提高命中率(*)。

应用场景:

读多写少用缓存。

查询原数据时间特别长的场景。

Key

键K有关

生成时间

不同功能业务的,key值要不一样,否则会被覆盖。

要唯一,避免碰撞。

单向函数:hash。给定输入的情况下,很容易计算出结果,而给定结果的情况下,几乎不可能计算出输入值。

一般不存在。正向快速,逆向困难,输入敏感,冲突避免。


md4 , md5,sha-0,sha-1,sha-2(用)


查询时间

缓存的位置。内存,硬盘,本地。

数据结构。

1234567890

234567890-

equals,hashcode。

键总结

无碰撞(唯一),高效生成(不需要,约定好),高效比较。

系统标识+功能标识+业务标识+前后缀。

13910712345+vcode: 123456

公司统一标准。

序列化值(二进制),对象值。

数据污染:

0-0.5-1 1-2 存的不是最终值


缓存只是 在 调用方和 数据提供方之间的一个 暂存方。

统一:缓存中数据怎么来的,查询的时候,如果没有,就从数据提供方获取,然后放到缓存中。

缓存的更新机制

时效性更新机制

固定时间过期,被动更新

:缓存中的数据设置一个过期时间。如果缓存数据过期,那么,我会去提供方查询,这样就相当于将 提供方 的数据 更新到缓存中了。

放弃了:实时一致性。(商品关注人数,评论数,浏览量,评论点赞收藏)

读,

写:只写数据提供方。不理会缓存。

主动更新机制

清风:cap。

cache aside

写:先更新,更新数据提供方,删除缓存。

概率很低:

1。 读的时候,缓存里 没有数据。

2。 读的时候,有写在同时进行。

3。读的时长大于 写操作。(不那么容易发生 1%)。

4。 读写操作 同时发生时,读到的是旧值。50%。

可以用。鸵鸟算法。

在计算机科学中,鸵鸟算法 是一个忽略潜在问题的一种算法策略,这种策略对计算机程序可能出现的问题采取无视态度(类似于鸵鸟在遇到危险时将头埋在地里,装作看不见)。鸵鸟算法的使用前提是,问题出现的概率很低。

三高项目-缓存

双写一致性

先删除缓存,再更新数据提供方。 延迟双删。

1。更新缓存,更新数据库。更容易造成数据的不一致,缓存成功,数据提供方失败。更糟糕。

2。更新数据库,更新缓存。有缺点,一点点稍微可取。

缺点:A 更新了数据库。B更新了数据库,B更新了缓存,A更新了缓存。

空干活,经过复杂的计算,给缓存设置值,但是用的少,浪费了资源。

3。删除缓存,更新数据库。延迟双删

4。更新数据库,删掉缓存。上节课所说的额cache aside。

延迟双删:删除缓存,更新数据提供方,睡眠一段时间(根据实际业务),再删除缓存。

如果第二次 删除失败了,怎么办? 重试一下。

自己写重试代码,没问题。自己挂了呢?

转移风险。重试的组件? 消息队列。

上面所说的,不管方案多么复杂,完善,总不能保证一致性。

Read/Write Through

直接 将 结果写入缓存。再从缓存 同步到数据提供方。调用方只需要和缓存交互。

写成功标识:缓存成功,数据提供方成功。TCC。

初始化:1。 启动缓存,从数据提供方,初始化。2。读取缓存 ,初始化。

缓存预热。命中率低,慢慢的命中率才高。

保障:缓存 非常 可靠。

Write Behind

在上面 做了升级,异步写入到数据提供方。加入消息队列,保证最终一致性。


缓存空间足够大,能缓存所有的数据,命中率 100%。

清理机制

以提高缓存命中率为目标。

过去访问多的,未来访问也多。

最近被更新的,未来访问的多。

时效性清理

过期全部清理。要求缓存中的数据都有一个生存期,有效期。

1条数据:data,ttl。2min。

轮询时效清理:额外开启一个程序,定期扫描所有数据的有效期,到期了,干掉。

自动时效清理:cookie。本质:上面的 轮询。

数目阈值清理

1 条数,2 每条的大小。

FIFO: 队列大小是10,

LRU:左神算法。数据访问次数,头部,删尾部。

LinkedHashMap 都可以实现 fifo,lru。

如果空间充足,则缓存多多的,提高命中率。如果空间不够,再回收空间,把空间给其他人让出来。

垃圾回收。

强引用:只要被强引用,就不会被回收。内存不足时,哪怕自己挂掉,也不回收。

软引用:空间不足时,才会被回收。

弱引用,虚引用。

SoftReference。 java实现它。

用java实现一个 根据内存空间大小的使用情况,做一个缓存组件。

Map <k,SoftReference<>>。

实战:

时效性清理+数据阈值式= 1。过期就干掉。2,密集查询,导致空间急剧增大。

LRU+软引用:保证最近用的数据在,然后最近不用的,放到软引用里,用软引用包装一下。

不建议:只用软引用。缓存的存活与否,从业务逃脱。业务控制不了。


三高项目

缓存风险点

每增加一个环节,就多一个风险。

缓存穿透

缓存没有数据,数据提供方也没有数据,穿透了。

无效的调用,增加数据提供方的压力,缓存基本无效。

解决方案:在缓存中,缓存一份 空数据。key有值,value为空。

缓存雪崩

大量缓存突然失效,引发的数据提供方压力 骤增。

数据阈值式清理:(缓存是逐个失效的)阈值比较低的时候会。10个缓存。阈值高,可以缓解。

时效式清理:会造成雪崩。避免缓存在同一时刻失效。过期时间=固定值+随机值。错峰失效。

软引用清理:当空间紧张的时候,缓存占据的空间会被回收。单纯的软引用无法解决。lru:对经常访问的数据建立强引用。

缓存击穿

有数据提供方 兜底,不叫穿透。

lru:高频访问的数据,大概率在前面 fifo。

read/write through, write behind。更新机制。缓存里有没有?因为数据的写、更新,先操作的是缓存。

cache aside: 有一个节点,缓存被删除。可能有击穿。

实际工作:

清理机制+更新机制,针对缓存,共同考虑。

缓存预热

启动系统的时候,提前加载一些数据。预加载。

缓存服务启动后,脚步直接灌入。init

时效式清理机制:缓存重复预热。

缓存的位置

需要缓存的数据,一定要靠前。。要想系统性能好,缓存一定要趁早。

前置模块:减少和后端通信的成本。

后置模块:公共模块,尽量用这个方式。

客户端缓存

客户端:浏览器,c软件,安卓,ios,h5,小程序。

浏览器:cookie,过期时间。轻量级的缓存。

F12 application。h5支持 & 浏览器的支持。

sqlite :安卓端的一个数据库。规则类。开机图片,引导页。

cdn 静态缓存

静态资源:页面,图片。

数据:重点:地名,字典,行业分类,统计局 那些标准化的数据。三级联动。算。广义:与用户个体无关的具有通用性的数据,都可以作为静态数据。

数据:用户不同,参数不同,时间不同,----结果不同。 对系统性能造成负面影响。

服务端缓存

redis。localcache,guava。

数据库缓存

冗余字段,中间表

操作完业务,需要做统计,非实时的数据,让它后置。

新增订单:

insert order (xxxxxx), 统计表 (订单数据 + 1) 10s。

5s, 定时任务扫描(48h-24h) +10。

冗余字段:

订单表(商品的数据)快照。

三高项目

写缓存

读缓存。调用方 数据提供方。

写缓存:调用方和 数据 处理方之间。目的:减少巨量调用操作对数据处理方的冲击。库存。削峰。

消息队列。

写缓存收益:原始时间 <(写缓存时间+缓存中数据向后传递的时间+原始时间)

收益在于用户的角度:目标用户的响应时间 降低了。

读缓存:是以缓存命中的数据 替代 数据提供方的操作。

写缓存:通过增加额外花费的时间,来延迟数据处理方的工作。

写缓存实践:redis(发布订阅),消息队列(发布订阅),数据库(先生成数据,后期再进行统计,耗时的&对实时性要求不高的,后置)

适合场景:请求峰谷值变化明显&对实时性要求不高的系统中。

抢购系统,竞品系统,秒杀系统,抢红包系统。

消息推送系统:极光,百度。

实时性不高。

大厂:

需求:平峰(请求量在某个阈值之下):正常处理。峰值超过阈值的时候,触发写缓存。

降级:微服务降级组件处理可以。

灰度发布。配置灰度规则(规则中 请求的阈值,根据阈值的不同,调用不同的系统)。

限流。要对流量进行 评估。

面试:写的访问量增大,怎么处理。

下单:订阅消息,不重要的系统订阅关键 业务的数据。


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

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

相关文章

happen-before原则

什么是 happen-before 原则&#xff1f; happen-before 是一个逻辑关系&#xff0c;用于描述两个操作之间的 “先后顺序”—— 如果操作 A happen-before 操作 B&#xff0c;那么 A 的执行结果必须对 B 可见&#xff0c;且 A 的执行顺序在逻辑上先于 B。也就是保证指令有序性和…

4.1 机器学习 - 评估指标

模型评估是判断 “模型是否有效” 的核心环节&#xff0c;需结合任务类型&#xff08;分类 / 回归&#xff09;、数据分布&#xff08;如类别不平衡&#xff09;和商业目标选择指标。本节聚焦分类任务的核心评估指标&#xff0c;从定义、计算逻辑到适用场景逐一拆解&#xff0c…

雅菲奥朗SRE知识墙分享(七):『可观测性的定义与实践』

在分布式系统日益复杂的当下&#xff0c;故障不再是“是否发生”&#xff0c;而是“何时爆发”。SRE可观测性正是应对不确定性的“显微镜”与“导航仪”&#xff1a;通过指标、日志、追踪三大数据血脉&#xff0c;实时外化系统黑盒&#xff0c;让每一次抖动、每一行报错、每一次…

C++ 详细讲解vector类

目录 1. 什么是vector? 2. vector的使用 1. 构造函数---初始化 1. 默认构造函数(无参构造&#xff09; 2. 填充构造函数(指定数量和初始值&#xff09; 3. 范围构造函数(通过迭代器拷贝其他容器元素&#xff09; 4. 拷贝构造函数(直接拷贝另一个vector&#xff09; 注…

Windows Server2012 R2 安装.NET Framework 3.5

Windows Server2012 R2 安装.NET Framework 3.5 虚拟机系统是Windowsserver 2012R2&#xff0c;在安装SQlserver2012时候警告未安装.NET Framework 3.5。于是找了个.NET Framework 3.5的安装包&#xff0c;但是由于系统原因无法正常安装。按照提示从控制面板-程序-启动或关闭Wi…

IDEA中Transaction翻译插件无法使用,重新配置Transaction插件方法

原因 由于Transaction默认的翻译引擎为谷歌翻译&#xff0c;由于一些原因&#xff0c;这个翻译无法使用&#xff0c;因此导致插件无法使用。 解决办法 更换Transaction插件翻译引擎即可。 方法步骤 1.进入Idea的设置里&#xff0c;找到Tool下的Transaction选项2.更改翻译引擎&a…

外置flash提示音打包脚本

批处理脚本说明文档 - 音频资源打包与分发 一、脚本功能概述 本批处理脚本&#xff08;.bat 文件&#xff09;用于将指定目录下的多个音频文件&#xff08;.wtg 和 .mp3 格式&#xff09;打包为音频资源配置文件&#xff08;tone.cfg&#xff09;&#xff0c;进一步将配置文件与…

Go语言设计模式(三)抽象工厂模式

抽象工厂模式与工厂模式类似,被认为是工厂方法模式的另一层抽象.抽象工厂模式围绕创建其他工厂的超级工厂工作.1.角色:1.1抽象产品:构成产品系列的一组不同但相关的产品的声明接口.1.2具体产品:实现抽象产品接口的类,主要用于定义产品对象,由相应的具体工厂创建.1.3抽象工厂:创…

大狗王 DG1+ 13.6G矿机详细参数解析与性能评测

近年来&#xff0c;随着加密货币挖矿行业的不断发展&#xff0c;越来越多的矿机厂商推出了高性能、低功耗的矿机设备。大狗王&#xff08;DG1&#xff09;13.6G矿机便是其中一款备受关注的设备&#xff0c;特别是在LTC&#xff08;莱特币&#xff09;、Doge&#xff08;狗狗币&…

Python 算术运算练习题

计算数字特征值题目描述 编写一个程序&#xff0c;接收用户输入的两个整数 a 和 b&#xff08;a > b > 0&#xff09;&#xff0c;计算并输出以下结果&#xff1a;a 与 b 的和的平方a 除以 b 的商和余数a 与 b 的平均数&#xff08;保留 2 位小数&#xff09;示例请输入整…

OS项目构建效能改进策划方案

一、现状分析与问题定位构建稳定性问题&#xff1a; 表现&#xff1a;非代码变更引发的构建失败&#xff08;如环境依赖、工具链版本、第三方库更新、资源竞争等&#xff09;“幽灵构建”时有发生。影响&#xff1a;严重破坏开发流程的顺畅性&#xff0c;耗费大量开发/测试人员…

Ai8051 2.4寸320*240 ILI9341 I8080接口驱动

/*---------------------------------------------------------------------*/ /* --- Web: www.STCAI.com ---------------------------------------------*/ /* 液晶屏驱动程序参考wiki技术网站提供的开源源码&#xff0c;仅供学习使用 */ /*----------------------…

最大似然估计:损失函数的底层数学原理

引言当你第一次看到线性回归时&#xff0c;你是否注意到了作为参数优化关键的损失函数&#xff08;均方损失&#xff09;&#xff0c;你是否能够理解它的本质和由来。其实&#xff0c;在我第一次接触时&#xff0c;我是感到有些惊讶的&#xff0c;然后试着去强行理解它&#xf…

使用 n8n 结合通义千问大模型构建业务数据库分析智能体

一、项目概述 本项目致力于构建一个结合 n8n 工作流引擎 与 通义千问大模型 的智能体&#xff0c;旨在对庞大的业务数据库进行自动化分析、语义建模及自然语言问答。通过不同工作流的迭代构建&#xff0c;实现了表结构解析、业务含义提取、关系可视化、问答服务等能力&#xff…

css margin外边距重叠/塌陷问题

一、定义 相邻块级元素或父子元素的垂直外边距会合并&#xff08;折叠&#xff09;为单个边距&#xff0c;其大小为单个边距的最大值&#xff08;或如果他们相等&#xff0c;则仅为其中的一个&#xff09;&#xff0c;这种行为称为边距折叠 <div style"margin-bottom: …

可重复读 是否“100%”地解决幻读?

这是一个非常深刻的问题&#xff0c;答案是&#xff1a;几乎解决了&#xff0c;但在一个非常特殊且罕见的边界场景下&#xff0c;理论上仍然可能出现幻读。 因此&#xff0c;严格来说&#xff0c;它并非被“彻底”或“100%”地解决。下面我们来详细分解这个结论&#xff1a;1. …

从零开始的云计算生活——第五十八天,全力以赴,Jenkins部署

目录 一.故事背景 二.安装Jenkins必要插件 1.安装Publish Over SSH 2.安装maven integration插件 3. 配置jenkins并发执行数量 4. 配置邮件地址 三. 基于Jenkins部署PHP环境 1. 下载ansible插件 2. 下载ansible应用 3. 构建项目 ​编辑 使用Jenkins账户生成ssh密钥 …

串口HAL库发送问题

想了很久&#xff0c;不知道该标题起的是否合适&#xff0c;该篇Blog用于记录在使用HAL库的USART模块时实际遇到的一个涉及发送方式的问题&#xff0c;用于提醒自身同时也希望能帮到各位。程序问题叙述先来看一段代码&#xff1a;void CusUSART_SendByte_IT( uint8_t Byte ) { …

CUDA默认流的同步行为

默认流 对于需要指定 cudaStream_t参数的 cuda API&#xff0c;如果将 0作为实参传入&#xff0c;则视为使用默认流&#xff1b;对于不需要指定 cudaStream_t参数的 cuda API&#xff0c;则也视为使用默认流。 在 cuda中&#xff0c;默认流有两种类型&#xff0c;一种是 legacy…

「数据获取」《中国电力统计年鉴》(1993-2024)(含中国电力年鉴)

01、数据简介一、《中国电力统计年鉴》作为全面系统反映中国电力领域发展状况的权威性年度统计资料&#xff0c;涵盖了电力建设、生产、消费及供需等全链条关键信息。其编制工作有着深厚的历史积淀&#xff0c;可追溯至 20 世纪 50 年代&#xff0c;历经数十年的积累与完善&…