java从头开始-黑马点评-商户查询缓存

什么是缓存

在业务开发的每个流程都能够构建缓存

缓存的一些优点与缺点
这里的缺点其实都是为了保证一致性

首先第一个添加商品缓存

下面这个getById实际上是IService(Mybatis plus)提供的一个函数,直接替我们实现了mapper层的功能

添加缓存完整流程

缓存穿透



缓存雪崩

第一个是大量key失效,后面三个都是redis宕机的操作,其中后两个都是微服务部分学的

缓存击穿



互斥锁实现流程

这里不是之前学的那种简单的lock加锁,因为以前的是请求不到锁就等待资源释放,但是现在要实现一个请求不到就等一会再请求,因此需要自己进行实现。这里实际上是使用功能redis的string类型中的setnx命令来实现的。为什么它能够实现呢?这是因为setnx有一个功能,就是如果没有值就修改,有值就不修改。如下图,只有第一个人能修改,后面都不能修改。具体就是setnx设置锁,实现完成以后就删除来释放锁。同时为了防止设置锁以后出现一些故障无法查询数据库导致死锁,因此可以给setnx设置有效期


java中的setnx命令

设置锁
后面不是直接返回的原因是有时候可能有空指针,因此使用工具类实现。


逻辑过期




下面这一步需要注意,因为上面我们创建了一个RedisData类型的变量,但是你能发现其实其中的data实际上是一个object类型的变量,如果直接进行类型转换,getData无法将其转换成Shop对象,因为实际上存储的时候是一个object而不是shop,但是这里的类型还必须设置为object,因为需要保证代码的扩展性。此时就可以转换为下面的JsonObject类型来存储就可以了



## 创建线程池

独立线程的具体操作

封装redis工具类


两个set函数:

下面的是解决缓存穿透问题的。下面这一段实际上使用了泛型与函数式编程来实现对不同类型的通用操作


方法中调用的时候可以极大地简化

后面的缓存击穿封装也是类似的


调用也是很简单的

相关推荐
要开心吖ZSH13 分钟前
一文搞懂:JDK 21 虚拟线程 vs N种异步方案,到底该怎么选?
java·数据库·jdk·虚拟线程
guodingdingh5 小时前
软件开发工作问题总结0718
java·开发语言·数据库
咖啡八杯7 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育7 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵7 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
腻害兔8 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
碎光拾影9 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Miao1213110 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔10 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
爬也要爬着前进11 小时前
redis主从搭建
数据库·redis·缓存