首页 > 其他分享 >Springboot实战——黑马点评之缓存

Springboot实战——黑马点评之缓存

时间:2024-08-22 21:05:26浏览次数:14  
标签:缓存 Springboot 过期 数据库 Redis 任务 线程 黑马

Springboot黑马点评——缓存

1 缓存初识与简单实现

1.1 根据商铺id的缓存查询

基础缓存实现:

考虑到有数据会同时存在于数据库和缓存中,所以:
Q:数据库和缓存的数据一致性问题?
A:三种缓存更新策略用来解决一致性问题

1.2 缓存更新策略的选择

  • 第一种:内存淘汰
  • 第二种:超时剔除
  • 第三种:主动更新(自行编码)

1.2.1 主动更新策略:三种写缓存

一般主动更新策略最通用,主动更新策略又有三种写缓存的方式:

一般使用第一种主动更新策略
即 调用者对缓存和数据库的一致性的操作编码 两者同时操作
同时我们需要考虑以下三点问题

选择更新数据库删除缓存 避免更多的无效写操作
选择先操作数据库再删除缓存

  • 不同场景对于缓存更新策略的选择

2 缓存穿透与缓存击穿问题的解决方案

2.1 缓存穿透

常见的解决方法有两种:

  • 缓存空对象

  • 布隆过滤

2.1.1 缓存穿透解决方案

1.1那样读取数据:
先查Redis->Redis命中则转换存储格式返回
->Redis未命中则到数据库中查找
->数据库未命中则返回404数据不存在
->数据库命中则将数据转换存储格式写入Redis
(即下图的流程图)

存在缓存穿透的风险:若有恶意查询不存在数据的请求频繁插入,将会给数据库查询带来很大压力

解决缓存穿透的方法:

  • 若从数据库查询为空,则将该空值存入Redis中
    (设置有效时间为2分钟,以防止内存大量置空消耗)
  • 在Redis中置空的店铺在下一次用户查找时,非正常返回不存在错误信息而不是用户实体

2.2 缓存雪崩

2.3 缓存击穿

满足两个条件:高并发访问的热点数据/缓存重建业务很复杂
多个线程同时访问,而此时该业务的缓存数据已失效
则对数据库的持续查询造成很大负担且需要轮询等待


解决缓存击穿的两种方法:

  • 互斥锁
  • 逻辑过期


2.4 实现缓存击穿解决思路

2.4.1 使用简易互斥锁(redis中的SETNX方法)



2.4.2 使用逻辑过期时间

逻辑锁:
前提条件:当前查询的对象属于热点key,例如属于当前活动或折扣商品,所以后台会在初始阶段将该热点数据存入Redis中(封装+逻辑过期时间),请求大概率会直接命中
简单来说就是 将过期时间封装在键值中作为该对象的逻辑过期时间(logic expiretime) 而存入Redis时不给该键值设置expiretime 对外显示为永久生效的键值
在命中该键值时->无论过期时间是否到期->统一将当前(旧)数据返回给前端->
->如果过期时间已到期->开启独立线程 重新从数据库中载入
->尝试获取互斥锁(和互斥锁逻辑相同)



【知识点】:
开启独立线程 借助 java的线程池来实现:
线程池是一种常用的并发编程工具,它允许我们有效地管理和控制并发任务的执行。newFixedThreadPool方法接受一个整数参数,表示线程池中的线程数量。一旦线程池创建完成,我们就可以使用ExecutorService接口的方法来提交任务到线程池中执行。

ExecutorService executorService = Executors.newFixedThreadPool(5);
executorService.submit(() -> {...提交至线程池中执行的内容})

newFixedThreadPool默认使用无界队列(LinkedBlockingQueue)来保存等待执行的任务。这意味着如果线程池中的线程都在忙碌状态,新提交的任务将一直排队等待,而不会立即被拒绝。然而,这也可能导致队列中的任务数量无限制增长,从而消耗过多的内存资源。因此,在实际应用中,我们可以考虑使用有界队列来限制队列的最大容量,当队列满时,新提交的任务将被拒绝执行。
在应用程序结束时,我们需要确保正确地关闭线程池,以释放系统资源。ExecutorService接口提供了shutdown和shutdownNow两个方法来关闭线程池。
1)shutdown方法用于启动线程池的关闭序列。已经提交的任务将继续执行,但新的任务将不再接受。当所有任务都执行完毕后,线程池中的线程将自动终止。
2)shutdownNow方法尝试停止所有正在执行的任务,并返回等待执行的任务列表。与shutdown方法不同,shutdownNow方法并不保证能够停止所有正在执行的任务,但它会尝试中断正在执行的任务。

标签:缓存,Springboot,过期,数据库,Redis,任务,线程,黑马
From: https://www.cnblogs.com/Wyuf1314/p/18363417

相关文章

  • 基于Springboot+vue的学生网上请假系统
    文章底部获取项目源码联系方式【万字文档+源码】基于Springboot+vue的学生网上请假系统-可用于毕设-课程设计-练手学习1系统概述1.1研究背景随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管......
  • 【源码+论文】基于springboot的信息技术知识竞赛系统的设计与实现
    系统包含:源码+论文所用技术:SpringBoot+Vue+SSM+Mybatis+Mysql免费提供给大家参考或者学习,获取资料请私聊我目录第1章绪论 11.1选题动因 11.2目的和意义 11.3论文结构安排 2第2章开发环境与技术 32.1MYSQL数据库 32.2Tomcat介绍 32.3vue技术 42.4Sp......
  • 【论文+源码】基于springboot搭建的疫情管理系统
    系统包含:源码+论文所用技术:SpringBoot+Vue+SSM+Mybatis+Mysql免费提供给大家参考或者学习,获取资料请私聊我目录目录 III1绪论 11.1研究背景 11.2目的和意义 11.3论文结构安排 22相关技术 32.1springboot框架介绍 32.2B/S结构介绍 32.3Mysql数据......
  • 基于SpringBoot+Vue的学生作业管理系统的详细设计和实现(25年最新,附源码+论文+部署讲
    文章目录1.前言2.系统演示录像3.论文参考4.代码运行展示图5.技术框架5.1SpringBoot技术介绍5.2Vue技术介绍6.可行性分析7.系统测试7.1系统测试的目的7.2系统功能测试8.数据库表设计9.代码参考10.数据库脚本11.找我做程序,有什么保障?12.联系我们1.前......
  • springboot中redis缓存的基本使用
    springboot中redis缓存的基本使用一、使用1、依赖引入<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-cache</artifactId></dependency><dependency>  <groupId>org.springframe......
  • 免费【2024】springboot 旅游攻略系统实现APP的设计与实现
    博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数......
  • 免费【2024】springboot 基于Android的个人财务系统的设计与实现
    博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数......
  • 免费【2024】springboot 环境保护生活APP的设计与实现
    博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数......
  • 免费【2024】springboot 旅游攻略系统实现APP的设计与实现
    博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数......
  • 免费【2024】springboot 基于Android的个人财务系统的设计与实现
    博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数......