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缓存

商品详情页动态内容展示实现的操作:

Redis缓存为啥必须设置缓存失效时间:

Redis的缺点:

本地缓存

本地热点缓存的特点:

项目中本地热点缓存的方案:

Guava Cache简介

本地缓存在项目中的体现:

本地热点缓存的设置?

本地缓存过期时间问题:?

总结:

redis缓存和本地缓存混用的优缺点


项目中的缓存是多级缓存,取数据的逻辑是:本地缓存 -> redis缓存 -> 数据库

项目中对于缓存的使用仅限于 商品详情页动态内容的展示实现。

Redis缓存

Redis简介

Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

Redis 与其他 key - value 缓存产品有以下三个特点:

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

本项目将单机版的Redis作为中间件使用,来完成性能优化的一些操作

Redis缓存有三种模式:1)单机版;2)sentinal哨兵模式;3)集群cluster模式

使用Redis做商品详情页动态获取接口的缓存的内容的实现,是企业级应用第一个常用的优化点;在SpringMVC的Controller层将对应的Redis引入,将从下游Service层(数据库)接收到的一些数据在Controller层缓存起来,以便于下次再有任何的请求进来的时候,可以直接判断缓存中是否有对应的商品详情页的数据,如果有,直接返回而不去走下游的Service层(数据库)调用,减少对数据库的依赖。

最好的优化方式就是在Controller层,在访问对应的商品库存信息之前完成缓存的操作

redis配置

引入依赖

商品详情页动态内容展示实现的操作:

将商品展示页面的Java对象数据序列化为字节序列的格式以便于保存到Redis数据库中,?并且将日期序列化为自定义的指定格式。Redis中的key是String类型数据,value是Json数据类型。

redis默认的序列化方式就是JDK的序列化方式;这里需要将数据反序列化为Json格式返回给前端

?编辑

第一次刷新不会出现上面的错误,因为是直接从数据库中取的;第二次刷新错误报这个错误的原因是对下面的字节序列反序列化不了,因为解析不了对应的参数

加入一行代码:

//可以在序列化的字节序列中包含类信息,以便于反序列化的时候JVM咋样解析参数

objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);?????

可以看到此时的字节序列中多了类的信息,加入这行代码的作用就是为了告诉JVM咋样去解析对应的参数;此时,无论刷新多少次都是从缓存(Redis)里取的

Redis缓存为啥必须设置缓存失效时间:

对应的缓存必须要有失效时间,不仅仅是为Redis的容量性能考虑,更为了对应的业务的能力,如果说缓存没有失效时间,那就必定当数据发生改变的时候,需要有一个清理缓存的机制;首先使用被动的数据过期失效方式,也就是说,不管后台数据库的数据咋么变,Redis默认给一个10分钟的失效时间。

ItemController类中?

Redis的缺点:

redis缓存的管理的优势是集中式的key-value对的数据库,并且支持数据库 --持久化操作,但是正是由于一致性管理的特性,导致了所有对于数据库的存或者取都需要经过网络的IO达到对应的redisService上(I/0开销是耗时的主要原因:因为redis的数据存在内存上),并且根据redis协议去更新对应的状态,因此相对于操作本地缓存的特性来说,redis的性能此时是并不是最高要求的;因此实现多级缓存第二级,第一级(最底层的是redis),在这之上,引入本地热点缓存。

本地缓存

本地热点缓存的特点:

1)只有热点数据才能进入本地缓存,因此叫做本地热点缓存?? ?
2)脏读非常不敏感
3)内存可控
本地缓存缓存其实就是JVM缓存,(查看一下项目的设置!!!)应用程序启动的时候,将堆栈的大小设置为2048M;这两G的运行空间里面除了要运行Java自身的字节文件以及对应的操作系统所必须要运行的内存之外,还需要做对象的管理;本地缓存其实就是属于对象内存管理区间内的一些堆栈的内存占用信息,因此这些内存其实是非常宝贵的,不可能将数据库中所有的数据加载到本地缓存当中,也不可能将所有的商品详情信息加载到缓存当中,对应缓存的利用效率是要非常高的,因此需要存放热点数据,热点数据每秒钟的访问量是非常大的,这样可以减少服务端到redis中取数据对应的网络开销,也可以减少redisService的压力。脏读非常不敏感加上内存可控就意味着本地热点缓存的生命周期必定不会特别长;对应的本地缓存的生命周期往往要比redis的key的生命周期要短很多,这样才能做到被动的失效对应的脏读的时间控制是非常非常小的。

?应用程序启动的时候,堆栈的大小设置为2048M

项目中本地热点缓存的方案:

设想一下,做一个类似于Java中HashMap的数据结构,key就是item的id,value就是对应的itemModel的模型即可;做这样的hashmap很有挑战,要支持有并发读有并发写的能力,此时想到ConcrentHashMap,但是它是基于段的方式处理锁的,写锁加上去之后会对写锁的性能产生影响;做到本地缓存就必须考虑对应的失效的淘汰时间以及对应的LRU缓存,所以本项目使用谷歌的Guava cache组件;其本质上也是一个可并发的hashmap,但是它可以控制key的大小和超时时间还可以配置LRU的策略,其次它还是线程安全的

Guava Cache简介

Guava Cache是 Google 提供的一套 Java 工具包,是一套非常完善的本地缓存机制(JVM缓存)。Guava Cache 的设计来源于 CurrentHashMap,可以按照多种策略来清理存储在其中的缓存值,且保持很高的并发读写能力。

Guava Cache的优点:

1)可控制的大小和缓存过期时间

2)可配置的LRU策略(冷数据就不会长期占据内存空间)

3)线程安全

guava介绍的好文章:

https://www.jianshu.com/p/b3c10fcdbf0f

官网(慕课老师推荐)

[Google Guava] 3-缓存 | 并发编程网 – ifeve.com

本地缓存在项目中的体现:

引入对应的jar包

之前使用redis中间件完成对应的数据库的存取操作,现在封装一个类似于cacheService来完成guava的存和取

本地热点缓存的设置?

这里cache的使用基本和map的使用一样,但是它提供了初始化的方式可以容许程序员配置最大、最小值以及对应的过期时间、过期策略

LRU策略引入leetcode算法帮助理解学习:

146. LRU 缓存

本地缓存过期时间问题:?

过期时间是一个相对的时间,到底是相对写入时间还是相对于被访问的时间?

一般设置为相对写入时间,因为被访问的时间对于热点数据如果一直被访问的话永远也失效不了,就不合理

总结:

本项目中缓存策略是Redis结合本地缓存,秒杀业务下,高频读取缓存对Redis压力很大,使用本地缓存结合Redis缓存使用,降低Redis压力,同时本地缓存没有连接开销,性能更优。

redis缓存和本地缓存混用的优缺点

优点

  • redis保证数据可持久,本地缓存保证超高的读取性能,秒杀场景下能有效降低redis压力

  • guava作为本地缓存,提供了丰富的api,过期策略,最大容量,保证服务内存可控,冷数据不会长期占据内存空间

  • 服务重启导致的本地缓存清空不会影响业务进行

缺点

  • 只适用于缓存内容只增不改的场景

  • 会产生一定的延时,这个延时具体的影响将会根据业务的差别而定。

最后关于项目中的缓存自己算是搞懂了,还要根据面经再看看,针对面试学习嘛

好的博客

面试官:你对Redis缓存了解吗?面对这11道面试题你是否有很多问号? - 掘金

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

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年4日历 -2025/4/30 22:02:48-

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