缓存设计的创新之旅:架构的灵魂之一

news2025/2/26 3:02:42

        缓存在架构设计中占有重要地位。缓存在提升性能中也扮演重要的角色。常见的有对资源的缓存,比如数据库连接池、http连接池,还有对数据的缓存等。缓存的设计可复杂也可简单,但是需要考虑的点却很多。

缓存对象

        设计缓存的时候一定要考虑的是,缓存的对象是什么,缓存哪些对象。缓存对象一定是热数据,也就是频繁被访问。把对象加载到内存是以牺牲内存为代价的,如果缓存的对象不经常访问,那么就是在浪费内存,并且不但不会提升性能,还会因为命中率低的原因降低性能。

缓存的大小

        因为内存是有限的,所以缓存不能无限大,那么就要决定缓存多少数据以保证内存不被撑爆。

缓存一致性

        缓存一致性是必须要考虑的点。很多缓存设计都忘记了这一点,导致在使用缓存的时候经常返回过期数据。数据在更新的时候,缓存可以采用如下几个策略:1.将缓存中的数据设置为无效或者删除,再次查询的时候重新去数据库查询并更新缓存;2.更新数据时,先更新缓存,再更新数据库或者先更新缓存之后异步刷新到数据库;3.直接更新数据库,缓存定期去数据库同步最新数据,这种方式需要容忍一定时间内的不一致。缓存刷新策略一定要明确。作者本人在工作中遇到过这种情况:更新数据的接口有两个,其中一个更新缓存后更新数据库,另一个直接去更新的数据库,由于没有同步机制,导致总是偶现数据不一致的情况,而且只能重启来规避。

缓存在哪里

        对于缓存数据的存储位置也是需要考虑的。如果是分布式系统或者近期会重构成分布式的系统,缓存需要集中存储,比如使用redis做缓存。如果是单机系统,最简单的方式就是缓存到内存中。缓存的存储位置的访问一定要快于数据的存储位置,不然缓存就没有意义了。

缓存流程

baeedb73f76c279555d45db2c6474932.jpeg

缓存流程

经典缓存问题

1.缓存穿透

        缓存穿透是指客户端访问即不在缓存中的数据又不在数据库中的数据。这种访问过多会导致数据库挂掉影响正常访问。对于这种问题,可以在数据访问前做校验,过滤掉不存在的数据访问,必须不合法的查询字段或者使用布隆过滤器,筛选掉不存在的数据;也可以将不存在的数据在缓存中建立空值缓存。

2.缓存击穿

        缓存击穿是指客户端访问不在缓存中但数据库中存在的数据。如果对某个key的访问量很大,这个时候缓存过期了,那么就会有很多的访问漏到数据库层面去访问数据。这个问题可以采用如下方法解决:热点数据常驻缓存;访问在缓存中没有拿到数据,在需要去数据库中访问数据时加锁处理,只漏过一个访问去数据库查询数据,并将数据更新到缓存,其他访问加锁失败,后续从缓存中取数据。

3.缓存雪崩

        缓存雪崩是指大量的key过期,导致访问落到数据库上。这个问题的解决方法如下:

    1.每个缓存数据设置不同的缓存时间,避免大量的缓存同时过期;

    2.添加的节点预热。在需要添加缓存节点的时候,先做缓存预热,避免大量访问未命中的情况;

    3.对于热点数据的判断采用延迟的策略。在访问缓存中不存在的数据的时候,不直接将它设置成最热数据,而是设置到缓存数据按热度排序中间的位置,避免某一时刻大量访问冷数据导致热数据被剔除缓存的情况。

建议

        不建议在架构设计的最初阶段就采用缓存。首先,采用缓存容易掩盖一些问题,比如业务逻辑导致的性能低下在由于缓存的存在在初期不容易暴露;再有就是在最初阶段有的时候很难去判断什么是热数据什么是冷数据,需要缓存什么;如果已经确定要在系统中引入缓存那么一定要考虑好上面的几点。

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

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

相关文章

将vue项目打包成安卓app

目标:将vue项目打包成安卓app 工具:HbuilderX 1.在HbuilderX中创建一个 5App 项目 创建好的app项目目录 2.将vue项目打包 2.1 在 vue.config.js 中添加公共路径(解决打包后的app图片不显示问题) module.exports defineConfig(…

Java进阶 之 再论面向对象(1)——面向对象的编程思想 Java中的类和对象 深入认识对象,内存图解+变量作用域+参数传递

前言 我们都知道Java是一门面向对象object-oriented(OOP)的编程语言,但究竟什么是面向对象,为什么要用面向对象,往往会语焉不详。 本篇博客从面向过程和面向对象的编程思想谈起,阐述了类和对象在Java中的…

044:mapboxGL利用fill-extrusion自定义挤出状建筑体

第044个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中利用fill-extrusion自定义挤出状建筑体。填充挤压样式图层在地图上渲染一个或多个填充(以及可选的描边)挤压(3D)多边形。 您可以使用填充拉伸图层来配置多边形或多多边形要素的拉伸和视觉外观。 直接复…

JMeter定时器

一. 同步定时器(Synchronizing Timer) (在Loadrunner中叫做集合点) 思考: 如何模拟多个用户同时抢一个红包?如何测试电商网站中抢购活动、秒杀活动? 1.1 介绍 Sync Timer的目的是阻塞线程,直…

【算法-动态规划】完全背包问题

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

计算机毕业设计选什么题目好?springboot 儿童福利院管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

【Java 定时任务】crontab定时任务配置(139)

背景 在日常的开发工作中我们经常会遇到定时任务的相关问题,比如: 信用卡定时每月给用户推送账单数据; 轮训更新某个任务的状态是否完成; 设置一个定时提醒; 邮件或消息设置定时发送; 定时统计某个时间段的…

高压放大器在软体机器人领域的应用

软体机器人是一种新型机器人技术,与传统的硬体机器人有着很大的不同。软体机器人通常由柔软的材料制成,具有高度的柔韧性和灵活性,并且可以实现多种形状和动作。但是,软体机器人的发展面临很多技术挑战,其中之一就是控…

信息与网络安全基础知识汇总

需要面试真题和考证资料的 面试真题考证资料点我领取 面试真题考证资料点我领取 面试真题考证资料点我领取 一、概述 1.网络信息安全基本概念 信息安全:是指信息网络中的硬件、软件及其系统中的数据受到保护,不受偶然的或者恶意的原因而遭到破…

2023年中国潜望式镜头市场发展趋势分析:潜望式镜头渗透将进一步提升[图]

随着摄像技术的渐渐成熟,专业摄影师对镜头的要求越来越高,所以产生了潜望式镜头,“潜望镜式变焦”镜头俗称“内变焦”镜头,由于光学变焦是在机身内部完成,所以可以很容易安装滤镜,无需额外安装镜头筒。其次…

推荐16款最好的3dMax插件

3DMAX本身就是一个非常复杂的3d软件,有许多功能。所有的建模、动画和模拟工具都在其中.然而,也有由外部作者创建的插件或脚本。 这些插件可以显著改善和促进3DMAX的工作的。在许多情况下,它们超出了这个应用程序的基本工具,并引入了原始创造者未提供的功能。下面就给大家介绍…

C语言之文件操作篇(1)

目录 为什么要使用文件 什么是文件 文件名 文件名的访问路径 相对路径 绝对路径 文件类型 文件缓冲区 文件指针 文件的打开与关闭 fopen fclose 打开方式如下 w r 今天我们来介绍C语言的文件操作。之前我们实现的通讯录有两个问题 信息太多,空间小了…

什么是无人直播呢?

无人直播是指通过技术手段实现直播间不停播,从而无需主播真人出镜参与直播。这种直播方式通常需要使用一些特定的软件或工具,例如虚拟背景软件等。 无人直播通常用于一些商业目的,如广告宣传、产品销售等。 通过无人直播,商家可…

2023年中国在线问诊行业发展历程及趋势分析:线上医疗将朝服务多样化、智慧化发展[图]

在线问诊是指通过开设线上义诊等通道进行诊疗的活动,主要作用是可防止线下就诊造成交叉感染。在线问诊平衡医疗资源供给,但问诊顺利开展的前提是可以提供专业的诊断或医疗建议。线上问诊病人很难甄别医生的资质,所以只能作基础性诊断参考。 …

ssm+vue的培训学校教学管理平台(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频: ssmvue的培训学校教学管理平台(有报告)。Javaee项目,ssm vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结…

keepalived+nginx实现高可用

1.安装keepalived、nginx yum install keepalived –y//centos默认无nginx源 rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpmyum install -y nginx2.修改keepalived配置文件(/etc/keepalived/keepalived.c…

代码随想录算法训练营第六十二、六十三天 | 单调栈 part 2 | 503.下一个更大元素II 、42. 接雨水、84.柱状图中最大的矩形

目录 503.下一个更大元素II思路代码 42. 接雨水思路一 双指针思路二 单调栈代码 84.柱状图中最大的矩形思路一 双指针思路二 单调栈代码 503.下一个更大元素II Leetcode 思路 将数组乘2来遍历即可,就是加长版的每日温度。 但是处理起来会有细节,如果…

Annoy vs Milvus:哪个向量数据库更适合您的AI应用?知其然知其所以然

1. Annoy vs Milvus简介 Annoy 和 Milvus 都是用于向量索引和相似度搜索的开源库,它们可以高效地处理大规模的向量数据。 Annoy(Approximate Nearest Neighbors Oh Yeah): Annoy 是一种近似最近邻搜索算法,它通过构…

微信小程序服务通知(订阅消息)定时推送消息功能

首先先说项目需求:向预约参观的用户提前一天晚上8点推送消息。小程序端主要用到的API是我是小程序用到的API。以及服务端用到的API:我是服务端用到的API。 1. 开通订阅消息功能 (1)、 首先需要在小程序管理后台开通订阅消息功能。没开通前如下图所示: …

解读提示工程(Prompt Engineering)

提示工程(Prompt Engineering),也称为上下文提示,是一种通过不更新模型的权重/参数来引导LLM行为朝着特定结果的方法。这是与AI有效交流所需结果的过程。提示工程可以用于各种任务,从回答问题到算术推理乃至各种应用领…