谷粒商城——缓存的概念

1. 使用缓存的好处:减少数据库的访问频率,提高用户获取数据的速度。

2. 什么样的数据适合存储到缓存中?

①及时性、数据一致性要求不高的数据,例如物流信息、商品类目信息

②访问量大更新频率不高的数据(读多、写少)

3. 读模式中缓存使用流程

一、本地缓存

        通过cache将数据库的数据缓存在本地内存中,java中最常用的就是将数据库数据缓存在HashMap中。

使用本地缓存存在的问题: 

问题1:

        分布式架构中,相同的一个微服务部署将在多个服务器中,如果使用本地缓存,每一个服务器都要建立一个缓存区,这样在访问不同的服务器中的微服务时,需要重复将数据加入到缓存区中。

        

问题2:

        如果在写模式情况下,不同服务器中的微服务缓存中的数据同时得到修改,那么将缓存中的数据写回数据库时将会发生写操作的不一致性。

解决办法:使用分布式缓存方式

二、分布式缓存

可以通过redis作为这个缓存中间件。

首先利用序列化操作将java对象转换为跨语言、跨平台兼容的JSON字符串,这个过程可以方便将java对象以JSON字符串的方式保存在redis中。

其次可以利用反序列化操作将JSON字符串转换为java对象,这个过程可以将redis保存的JSON字符串转为java

 高并发环境下的缓存穿透问题:(主要就是DB受到过多访问)

1. 缓存穿透

问题描述:如下图。

解决方法:将空值也进行缓存,但设置较短过期时间。

2. 缓存雪崩(缓存值大面积失效)

问题描述:所有缓存数据设置的过期时间相同,从而导致在同一时间失效,恰好这个时间有大量访问,这些访问就需要同时去访问数据库,导致数据库压力过大崩溃。

解决方法:对于每一个缓存值在固定过期时间基础上设置一个随机值。

3. 缓存击穿(访问频率高的缓存值失效)

问题描述:如果缓存中一个访问频率高的值过期,此时有大量访问访问这个值,导致DB压力过大。

解决办法:加锁。大量并发时,先让一个人去查,其他人等着。这样剩下人就可在缓存直接获取值。

但是加锁,又引发了需要分布式锁的问题:

如果使用本地锁,由于相同的微服务部署在不同的服务器中,假设服务器数量为N,这样依然还是放进来N个DB访问请求(其实问题也不大)。但如果只想放行一个DB访问请求,就必须要分布式锁

分布式锁的原理如下:

可以向redis中存储一个map,其中key为lock,value可以是任意值。由这个map充当我们分布式锁。使用setIfAbsent()方法抢占分布式锁,这个方法实际上就是set nx 或者 setnx,表示只有当key不存在时才能插入:

1. 但是这个时候,在业务执行过程中出现异常或者服务器宕机则没有执行删除锁的操作,永远无法释放锁,出现死锁问题。相应解决办法:设置过期时间,即使没有删除,会自动删除。代码如下:

2. 但如果上锁与设置过期时间分开进行,会出现当我们要去设置过期时间时,出现异常或者宕机导致无法设置过期时间。解决办法:抢占锁和设置过期时间必须是原子操作。代码如下:

3. 但是由于我们业务执行时间很长,锁已经过期了,此时别的服务器上的微服务创建了一个锁,当该业务执行完后,会将别的微服务的锁删除(因为我们锁的值为1,此时无法分别这是不是我们业务上的锁,还是其他微服务业务上的锁)。解决办法:给锁赋值上uuid,删除锁之前查询是否是同一把锁。代码如下:

4. 但是上述操作又有新的问题:如果我们在校验锁是否是本业务上的时候,锁正好过期,其他微服务就会重新上锁,如果之前的校验结果为真,则本业务会将其他微服务上的锁删除。解决办法:是查询lock的值和删除lock的值需要原子操作。可以使用lua脚本,将查询与删除合并为一个原子操作。代码如下:

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

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

相关文章

加密技术概述

传输数据时的四个问题 窃听 数字加密 假冒 消息认证或数字签名 篡改 消息认证码或数字签名 事后否认 数字签名 加密技术 将数据变成第三者的计算机无法理解的形式,然后再将其恢复成原本数据的一系列操作就是加密技术。 哈希函数 哈希函数可以把给定的数据转…

设计模式之状态模式(一)

设计模式专栏: http://t.csdnimg.cn/4Mt4u 目录 1.概述 2.结构 3.实现 4.总结 1.概述 状态模式( State Pattern)也称为状态机模式( State Machine pattern), 是允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类, 属于行为型模式。 在状…

Vue3+echarts绘制世界地图

先放效果图 之前所查找的资料都没有讲清楚如何引入地图文件并绘制地图,下面做一个记录。 首先下载对应的地图json文件,这里可以参考我的这篇文章,提供了下载地址:记录echarts各种地图json文件下载地址-CSDN博客 第二步&#xff…

笔记本和台式机主板内部结构分析

笔记本和态势机主板内存接口以及配件安装位置 笔记本主板 1 以thinkpad L-490为例,使用拆机小工具拆机,打开后面板,内部结构示意图如下 台式机主板 以技嘉-B660M-AORUS-PRO-AX型号主板为例 笔记本电脑和台式机电脑的相同之处 CPU:笔记本…

【boost_search搜索引擎】1.获取数据源

boost搜索引擎 1、项目介绍2、获取数据源 1、项目介绍 boost_search项目和百度那种不一样,百度是全站搜索,而boost_search是一个站内搜索。而项目的宏观上实现思路就如同图上的思路。 2、获取数据源 我们要实现一个站内搜索,我们就要有这…

Rust 程序设计语言学习——结构体

结构体和元组类似,它们都包含多个相关的值。和元组一样,结构体的每一部分可以是不同类型。但不同于元组,结构体需要命名各部分数据以便能清楚的表明其值的意义。由于有了这些名字,结构体比元组更灵活:不需要依赖顺序来…

医院预约挂号系统设计与实现|jsp+ Mysql+Java+ Tomcat(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW,文末可获取本项目的所有资料。 推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java,…

初识kafka-数据存储篇1

目录 背景 1 kafka总体体系结构 2 疑问解答 2.1 高吞吐低延迟 2.2 实现分布式存储和数据读取 2.3 如何保证数据不丢失 背景 最近在和产品过项目审批的时候,深刻感受到业务方对系统的时时响应提出了更高的要求。目前手上大部分的业务都是基础定时任务去实现的&…

nodejs+vue高校会议室预订管理系统python-flask-django-php

伴随着我国社会的发展,人民生活质量日益提高。于是对系统进行规范而严格是十分有必要的,所以许许多多的信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套高校会议室预订管理系统,帮助学校进行会议…

JDK,JRE,JVM之间的关系

他们明面上的关系是JDK包含JRE,JRE包含JVM。 简单理解JDK就是Java开发工具包。JRE是Java运行环境。JVM是Java虚拟机。 JDK是面向开发者的,JRE是面向JAVA程序的用户的。也就是说开发者开发JAVA程序是需要用到JDK,如果用户不去开发JAVA程序&am…

OpenHarmony IDL工具规格及使用说明书(仅对系统应用开放)

IDL接口描述语言简介 当客户端和服务器进行IPC通信时,需要定义双方都认可的接口,以保障双方可以成功通信,OpenHarmony IDL(OpenHarmony Interface Definition Language)则是一种定义此类接口的工具。OpenHarmony IDL先…

初识 Redis 浅谈分布式

目 录 一.认识 Redis二.浅谈分布式单机架构分布式是什么数据库分离和负载均衡理解负载均衡数据库读写分离引入缓存数据库分库分表引入微服务 三.概念补充四.分布式小结 一.认识 Redis 在 Redis 官网我们可以看到介绍 翻译过来就是:数以百万计的开发人员用作缓存、…

nodejs+vue高校社团管理小程序的设计与实现python-flask-django-php

相比于以前的传统手工管理方式,智能化的管理方式可以大幅降低学校的运营人员成本,实现了高校社团管理的标准化、制度化、程序化的管理,有效地防止了高校社团管理的随意管理,提高了信息的处理速度和精确度,能够及时、准…

t-rex2开放集目标检测

论文链接:http://arxiv.org/abs/2403.14610v1 项目链接:https://github.com/IDEA-Research/T-Rex 这篇文章的工作是基于t-rex1的工作继续做的,核心亮点: 是支持图片/文本两种模态的prompt进行输入,甚至进一步利用两…

CCF-CSP认证考试 202303-5 施肥 35/60/75/100分题解

更多 CSP 认证考试题目题解可以前往:CSP-CCF 认证考试真题题解 原题链接: 202303-5 施肥 时间限制: 2.0s 内存限制: 1.0GB 问题描述 春天到了,西西艾弗岛上的 n n n 块田地需要施肥了。 n n n 块田地编号为 1 , 2…

基于Google云原生工程师的kubernetes最佳实践(二)

目录 二、应用部署篇 为deployment打上丰富的label,以便selecting 使用sidecar容器部署agent、proxy等组件 使用init container处理依赖关系,而不要用sidecar 镜像tag使用版本号,不要用latest或空tag 为pod设置readiness和liveness探针 不要给所有服务都使用LoadBalance…

【微服务】以模块化单体架构开发微服务应用

目录 推荐超级课程: Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战我们知道,起初,单体应用有显著的优势:它们更容易开发和部署。从开发人员的角度来看,这种简单性是有益的。一切都是集中的,可以快速更新任何部分的业务逻辑并立即看到结果。这种开…

竞赛 python opencv 深度学习 指纹识别算法实现

1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 python opencv 深度学习 指纹识别算法实现 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:4分创新点:4分 该项目较为新颖…

ETL数据倾斜与资源优化

1.数据倾斜实例 数据倾斜在MapReduce编程模型中比较常见,由于key值分布不均,大量的相同key被存储分配到一个分区里,出现只有少量的机器在计算,其他机器等待的情况。主要分为JOIN数据倾斜和GROUP BY数据倾斜。 1.1GROUP BY数据倾…

【短接笔记本或者台式机的CMOS针脚解决电脑开机无法启动BIOS无法进入问题】

为什么要执行短接笔记本或者台式机的CMOS针脚操作? 问题:可以解决如下图所示,技嘉小雕主板开机时按delete键无法进入BIOS主板界面,长时间等待之后依然无法进入BIOS主板界面,则判定为主板问题。此时短接CMOS针脚可清空…