IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 谷粒商城-缓存-缓存使用 -> 正文阅读

[大数据]谷粒商城-缓存-缓存使用

目录

缓存-缓存使用-本地缓存与分布式缓存

缓存-缓存使用-整合Redis测试

缓存-缓存使用-改造三级分类业务

缓存-缓存使用-压力测试出的内存泄漏及解决

缓存-缓存使用-缓存击穿、穿透、雪崩

缓存-缓存使用-加锁解决缓存击穿的问题

缓存-缓存使用-本地锁在分布式下的问题


缓存-缓存使用-本地缓存与分布式缓存

使用缓存的好处:提升系统的性能

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

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

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

读模式下的使用缓存的流程如下图所示:?

本地缓存使用的伪代码如下图所示:

本地缓存最简单的方式就是编写一个Map?

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

问题1:

加入请求负载均衡交由服务1处理,服务1将数据从数据库中查出存放到缓存中,但不能保证每次负载均衡到同一个服务,负载到其它服务时,需要再次从数据库中查出数据存放到缓存中。

问题2:

加入需要修改类目,修改请求被负载均衡到服务1,服务1修改了类目并且修改了缓存中的数据,但是负载均衡到其它服务时,其它服务的缓存数据并未被修改,会导致数据不一致的。

解决方案:

使用集中的缓存中间件,解决了上述问题的同时还解决了缓存不足的问题,可以将缓存中间件集群化

分布式缓存

缓存-缓存使用-整合Redis测试

Redis的整合步骤:

①导入data-redis-starter

        <!--导入SpringBoot整合Redis的依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

ctrl+n 搜索?RedisAutoConfiguration

SpringBoot自动配置好了redisTemplate、StringRedisTemplate用于操作,RedisstringRedisTemplate是用于存放<String,String>类型的数据

关于Redis配置的属性都放在RedisProperties中

②简单配置Redis的host等信息?

Redis配置,需要配置redis的主机地址和端口号,不配置端口号默认为6379,还可以配置密码

③使用SpringBoot自动配置好的StringRedisTemplate来操作redis

?

缓存-缓存使用-改造三级分类业务

①将原先的三级分类查询的方法中的@Override去掉,换取新的方法名作为业务处理的方法

② 在原先的实现三级分类查询的方法中编写缓存的使用

要指定value的类型为String,因为String实现了序列化接口,否则存储到redis中的数据会乱码?

我们将java对象转化为跨语言、跨平台兼容的json存入到缓存中即为序列化

我们将json数据转化为可用的java对象,即为反序列化

缓存-缓存使用-压力测试出的内存泄漏及解决

压测三级分类目录

由于我使用的data-redis-starter是2.3.7版本的,SpringBoot已经针对lettuce进行了优化未出现堆外内存溢出的现象

这里总结一下如果使用data-redis-starter出现堆外内存溢出的解决方案

出现问题:使用data-redis-starter出现堆外内存溢出即OutOfDireMemoryError

出现问题的原因:lettuce使用netty作为网络通信框架,netty默认使用-Xmx作为堆外内存大小,调大Xmx 的大小只能延缓堆外内存溢出的时间但是一定会出现异常,我们也可以通过设置-Dio.netty.maxDirectMemory设置堆外内存的大小

点击下选框

?

解决方案:不能使用-Dio.netty.maxDirectMemory去调大堆外内存的大小

①升级lettuce客户端 ②切换使用jedis

使用jedis解决堆外内存溢出

①排除lettuce的依赖

②?使用jedis客户端操控redis

lettuce、jedis都是操作redis的客户端。SpringBoot会再次封装redisTemplate?

SpringBoot会将redisConnectionFactory、redisConnectionFactory封装成RedisConnectionFactory

缓存-缓存使用-缓存击穿、穿透、雪崩

针对缓存穿透、雪崩、击穿的解决方案:?

①对null结果缓存:解决缓存穿透

②设置过期时间(加随机值的过期时间):解决缓存雪崩

③加锁:解决缓存击穿

锁加不好会带来很多问题,下面会讲解如何加锁

缓存-缓存使用-加锁解决缓存击穿的问题

加本地锁的方式

①使用synchronized修饰方法

②使用synchronized代码段

使用this当锁,this指的是当前实现类对象,在SpringBoot中所有组件都是单例的。因此,使用this当锁是可行可以确保所有线程拿的都是同一把锁。

线程拿到锁之后,需要再次判断一下缓存是否命中?

压测一下看下会不会问题:

?

出现问题 :?查询了数据两次

出现问题的原因:当线程1获得锁之后查询数据库,返回查询的结果并释放锁;线程1在将查询的数据存储到redis时,线程2获得锁,发现此时缓存并未命中,因此进行数据库的查询。

解决方案:确认缓存没有、查询数据库、将查询结果存储到redis中是一个原子操作

?

缓存-缓存使用-本地锁在分布式下的问题

存在的问题: 本地锁只能锁住当前的服务,其它服务锁不住

测试:

复制几份product服务,端口号从10000-10003,1右键选择copy configuration...

?

?

查看结果:

?

?

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-24 09:31:36  更:2022-04-24 09:31:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:36:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码