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

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

缓存对象

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

缓存的大小

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

缓存一致性

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

缓存在哪里

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

缓存流程

baeedb73f76c279555d45db2c6474932.jpeg

缓存流程

经典缓存问题

1.缓存穿透

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

2.缓存击穿

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

3.缓存雪崩

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

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

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

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

建议

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

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

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

相关文章

大语言模型之十七-QA-LoRA

由于基座模型通常需要海量的数据和算力内存,这一巨大的成本往往只有巨头公司会投入,所以一些优秀的大语言模型要么是大公司开源的,要么是背后有大公司身影公司开源的,如何从优秀的开源基座模型针对特定场景fine-tune模型具有广大的…

香港专用服务器拥有良好的国际网络连接

香港服务器在多个领域有着广泛的应用。无论是电子商务、金融交易、游戏娱乐还是社交媒体等,香港服务器都能够提供高效稳定的服务。对于跨境电商来说,搭建香港服务器可以更好地满足亚洲用户的购物需求;对于金融机构来说,香港服务器…

当涉及到API接口数据分析时,主要可以从以下几个方面展开

当涉及到API接口数据分析时,主要可以从以下几个方面展开: 请求分析:可以统计每个API接口的请求次数、请求成功率、失败率等基础指标。这些指标可以帮助你了解API接口的使用情况,比如哪个API接口被调用的次数最多,哪个…

c++-list

文章目录 前言一、list介绍及使用1、list介绍2、list使用2.1 list构造函数的使用2.2 list iterator的使用2.3 list capacity的使用2.4 list modifiers的使用2.5 list使用算法库中的find模板生成find方法2.6 list中的sort方法 二、list模拟实现1、查看list源码的大致实现思路2、…

身份证实名核验接口,身份证实名认证,身份证二要素实名认证,身份证实名校验,身份证一致性实名认证

一、接口介绍 验证身份证与姓名是否匹配,查询身份证信息。如校验通过,接口返回生日、性别、地址等信息。广泛应用于信贷、安防、银行、保险等行业及各种身份核查场景。 注意:当请求参数符合“【固定同一个参数,其余参数不同】,”…

基于VScode 使用plantUML 插件设计状态机

本文主要记录本人初次在VScode上使用PlantUML设计 本文只讲述操作的实际方法,假设java已安装成功 。 1. 在VScode下安装如下插件 2. 验证环境是否正常 新建一个文件夹并在目录下面新建文件test.plantuml 其内容如下所示: startuml hello world skinparam Style …

基于小波变换的分形信号r指数求解算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ................................................................... %通过功率谱密度曲线…

WebSocket连接异常 Error parsing HTTP request header Connection reset by peer

问题描述 在使用spring的方式集成websocket时,在配置WebSocketConfigurer后 Configuration EnableWebSocket public class WebSocketConfiguration implements WebSocketConfigurer {ResourceServletWebSocketServerHandler servletWebSocketServerHandler;Overri…

linux总结

cat -n filename 查看文件,-n用来给每一行标行号,可以省略 cat /var/log/mysqld.log | grep password 我们可以通过上述指令,查询日志文件内容中包含password的行信息。 more 作用: 以分页的形式显示文件内容 语法: more fileName 操作说明: 回车键 …

Spring Boot 中的 Redis 数据操作配置和使用

Spring Boot 中的 Redis 数据操作配置和使用 Redis(Remote Dictionary Server)是一种高性能的开源内存数据库,用于缓存、消息队列、会话管理和数据存储。在Spring Boot应用程序中,Redis被广泛用于各种用例,包括缓存、…

【教学类-35-04】学号+姓名+班级(中3班)学号字帖(A4竖版2份 竖版长条)

图片展示: 背景需求: 2022年9-2023年1月我去过小3班带班,但是没有在这个班级投放过学具,本周五是我在本学期第一次带中3班,所以提供了一套学号描字帖。先让我把孩子的名字和脸混个眼熟。 之前试过一页两套名字的纸张切割方法有:…

distcc分布式编译

distcc https://gitee.com/bison-fork/distcc.git 下载工具链 mingw,https://www.mingw-w64.org/downloads/#w64devkitperl,https://strawberryperl.com/releases.html免安装zip版本,autoconf等脚本依赖perlautoconf、automake&#xff0c…

只有正规才有机会,CTF/AWD竞赛标准参考书来了

目录 前言 一、内容简介 二、读者对象 三、目录 前言 随着网络安全问题日益凸显,国家对网络安全人才的需求持续增长,其中,网络安全竞赛在国家以及企业的人才培养和选拔中扮演着至关重要的角色。 在数字化时代,企业为了应对日益…

Flutter:open_file打开本地文件报错问题

相关插件及版本: open_file: ^3.2.1 问题: 项目中一直用的这个插件,突然发现在安卓高版本不能正常使用,报权限问题permissionDenied,断点调试提示相关权限是MANAGE_EXTERNAL_STORAGE,申请权限之后还是不行&…

springboot集成kafka

1、引入依赖 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><version>2.8.6</version></dependency> 2、配置 server:port: 9099 spring:kafka:bootstrap-servers: 192.1…

JWT - 令牌认证授权(认证流程、认证原理、Jwt 工具类)

目录 一、JWT 认证 1.1、对 JWT 的认识 1.1.1、JWT 解释 1.1.2、为什么使用的 JWT 认证&#xff0c;而不是 Session 认证&#xff1f; a&#xff09;基于传统的 Session 认证 1.1.3、JWT 认证流程 1.1.4、优势 1.1.5、JWT 的结构 JWT 第一部分&#xff1a;标头 Header …

LeetCode - 318 最大单词长度乘积(Java JS Py C)

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 318. 最大单词长度乘积 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个字符串数组 words &#xff0c;找出并返回 length(words[i]) * length(words[j]) 的最大值&#xff0c;并且这两个单词…

RocketMQ核心编程模型以及生产环境最佳实践

文章目录 一、深入理解RocketMQ的消息模型二、消息确认机制消息生产端采用消息确认加多次重试的机制保证消息正常发送到RocketMQ消息消费者端采用状态确认机制保证消费者一定能正常处理对应的消息消费者也可以自行指定起始消费位点 三、广播消息四、顺序消息机制五、延迟消息六…

【Mybatis】动态 SQL

动态 SQL \<if>标签\<trim>标签\<where>标签\<set>标签\<foreach>标签 动态 sql 是 Mybatis 的强⼤特性之⼀&#xff0c;能够完成不同条件下不同的 sql 拼接。 <if>标签 前端用户输入时有些选项是非必填的, 那么此时传到后端的参数是不确…

ipad手写笔哪个好用?苹果平替笔性价比高的

如果你想要入手一款和iPad匹配的电容笔&#xff0c;想必你的第一想法就是苹果的原装电容笔。然而这款电容笔虽然很好用&#xff0c;但价格会相对的昂贵一些。而平替电容笔&#xff0c;却是一种不错的选择&#xff0c;而且价格也很合理。一支普通的平板电容笔&#xff0c;其售价…