论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
Springboot实战——黑马点评之缓存
Springboot实战——黑马点评之缓存
知者何南
金牌会员
|
2024-8-22 20:00:45
|
显示全部楼层
|
阅读模式
楼主
主题
884
|
帖子
884
|
积分
2652
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方法并不保证能够停止所有正在实行的使命,但它会实验中断正在实行的使命。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
知者何南
金牌会员
这个人很懒什么都没写!
楼主热帖
SQLServer数据库基础教程
开源二三事|ShardingSphere 与 Databa ...
Sqlserver创建用户并授权
Oracle调度器Scheduler
「笔记」某移动SRE运维体系交流 ...
华为再次登上央视!鸿蒙系统3.0今年上 ...
这个简单的小功能,半年为我们产研团队 ...
ESP32-C3 学习测试 蓝牙 篇(六、添加 ...
Kubernetes(K8S) Controller - Statefu ...
我眼中的大数据(三)——MapReduce ...
标签云
存储
挺好的
服务器
快速回复
返回顶部
返回列表