谷粒商城——缓存的概念

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.hqwc.cn/news/557324.html

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

相关文章

【Java11下载、安装、部署指南】

oracle jdk11下载 oracle jdk所有版本归档【archive】下载地址: https://www.oracle.com/java/technologies/downloads/archive/ oracle jdk11下载地址: https://www.oracle.com/java/technologies/javase/jdk11-archive-downloads.html 配置或修改wi…

【文末附gpt升级4.0方案】FastGPT详解

FastGPT知识库结构讲解 FastGPT是一个基于GPT模型的知识库,它的结构可以分为以下几个部分: 1. 数据收集:FastGPT的知识库是通过从互联网上收集大量的文本数据来构建的。这些数据可以包括维基百科、新闻文章、论坛帖子等各种类型的文本。 2…

河北库卡机器人KR500电源模块故障,该如何处理?

库卡机器人KR500电源模块常见故障类型及维修方法 1)电源模块故障指示灯亮 故障现象:库卡机器人KR500电源模块上的故障指示灯亮起,机器人不能正常工作。 维修方法:根据故障指示灯的闪烁频率或颜色判断具体的故障类型。然后&#xf…

Vue3学习记录(七)--- 组合式API之指令和插件

一、内置指令 1、v-memo ​ 该指令是Vue3的v3.2版本之后新增的指令,用于实现组件模板缓存,优化组件更新时的性能。该指令接收一个固定长度的依赖值数组,在组件进行更新渲染时,如果数组中的每个依赖值都与上一次渲染时的值相同&a…

【php基础】输出、变量、布尔类型、字符串

php基础补充 1. 输出2.和"的区别3.变量3.1变量的命名规则3.2 两个对象指向同一个值3.3 可变变量 4.变量的作用域5. 检测变量6. 布尔类型7.字符串定义与转义8.字符串常用函数9.常量 1. 输出 echo: 输出 print: 输出,输出成功返回1 print_r(): 输出数组 var_dum…

AndroidStudio 由dolphin升级到giraffe,出现“gradle project sync failed“

1 现象描述 将AS由之前的dolphin版本升级到giraffe之后,接着打开以前的Android project,出现了"Gradle project sync failed…"的异常提示,在build面板中并没有出现project sync过程中报错的日志。 异常提示如下图所示&#xff1a…

【机器学习-07】逻辑回归(Logistic Regression)的介绍和python实现

Logistic Regression 虽然被称为回归,但其实际上是分类模型,并常用于二分类。主要用来表示某件事情发生的可能性,因此因变量的范围在 0 和 1 之间。Logistic Regression 因其简单、可并行化、可解释强深受工业界喜爱。例如,探讨引…

深入了解 Postman Test 校验的使用方法

Postman 是一个广泛使用的 API 开发工具,它允许开发人员测试 API 的各个方面,包括请求、响应、身份验证等等,其中最常用的功能之一就是 Test 校验。那今天就一起来看看 Postman 的 Test 校验该如何使用。 Test 校验是什么? Test…

借教室与差分

原题 题目描述 在大学期间,经常需要租借教室。 大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。 教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。  面对海量租借教室的信息&…

Python程序设计 基本数据类型及操作

1.计算一元二次方程的根 编写一个计算一元二次方程的根的小程序。 一元二次方程经过整理都可化成一般形式axbxc0(a≠0)。 其中ax叫作二次项,a是二次项系数;bx叫作一次项,b是一次项系数;c叫作常数项 。 由一…

Android Launcher开发注意事项

在开发Android Launcher时,需要关注性能、用户体验、权限管理、兼容性等方面,同时遵循相关的开发者政策和最佳实践。有几个重要的注意事项,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎…

【精彩回顾】百度智能云千帆产品3月21日发布会

3月21日,AI Cloud Day:百度智能云千帆产品发布会在北京举办。会议聚焦百度智能云千帆大模型平台最新进展,分享思考与实践。百度智能云在发布会期间宣布: >>满足企业“效价比”核心诉求,千帆ModelBuilder大模型服…