1、创建springboot项目,添加相关依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><!-- hutool -->
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.5.8</version>
</dependency><!-- lombok -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version>
</dependency><!-- redis,使用jedis客户端排除lettuce -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><exclusion><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId>
</dependency>

2、application.yml配置文件添加配置

spring:redis:host: localhostport: 6379password:timeout: 5000database: 0

3、管理RedisTemplate

package com.company.springbootinterviewquestions.sys.config;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;/*** 缓存的配置** @author zj* @date 2020/7/9 11:43*/
@Configuration
public class CacheConfig {@Autowiredprivate YmlBean ymlBean;/*** redis缓存类** @author zj* @date 2020/4/19 17:53*/@Beanpublic RedisTemplate<String, String> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();redisTemplate.setConnectionFactory(connectionFactory);Jackson2JsonRedisSerializer<?> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);// 字符串key序列化方式redisTemplate.setKeySerializer(RedisSerializer.string());// 字符串value序列化方式redisTemplate.setValueSerializer(RedisSerializer.string());// Hash key序列化方式redisTemplate.setHashKeySerializer(jackson2JsonRedisSerializer);// Hash value序列化方式redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);// 设置序列化方式, 前面只是声明, 该方法才实际注入序列化方式redisTemplate.afterPropertiesSet();return redisTemplate;}}

4、配置文件参数

package com.company.springbootinterviewquestions.sys.config;import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;/*** 配置文件参数** @author 35997* @date 2022/4/20*/
@Data
@Configuration
public class YmlBean {@Value("${spring.redis.host}")private String redisHost;@Value("${spring.redis.port}")private String redisPort;}

5、缓存雪崩控制类

package com.company.springbootinterviewquestions.lock.redis;import cn.hutool.core.util.ObjectUtil;
import com.company.springbootinterviewquestions.core.pojo.response.ResponseData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.concurrent.locks.ReentrantLock;/*** 缓存雪崩控制类** @author 35997* @date 2022/4/15*/
@RequestMapping("/cache/avalanche")
@Controller
public class CacheAvalancheController {ReentrantLock reentrantLock = new ReentrantLock();@Autowiredprivate RedisTemplate redisTemplate;/*** 互斥锁解决缓存雪崩* @return*/@RequestMapping("/mutex")@ResponseBodypublic ResponseData mutex(String key){Object value = redisTemplate.opsForValue().get(key);if (ObjectUtil.isEmpty(value)){if (reentrantLock.tryLock()) {try {value = redisTemplate.opsForValue().get(key);if(ObjectUtil.isEmpty(value)){data();}} catch (Exception e){e.printStackTrace();} finally {reentrantLock.unlock();}}else{value = redisTemplate.opsForValue().get(key);if(ObjectUtil.isEmpty(value)){try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}mutex(key);}}}return ResponseData.success(value);}/*** 模拟数据库中的数据*/public void data(){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}redisTemplate.opsForValue().set("aa", "数据");}}

到此,大功告成。

互斥锁解决缓存雪崩问题(一)相关推荐

  1. 互斥锁解决缓存雪崩问题(二)

    1.创建springboot项目,添加相关依赖 <dependency><groupId>org.springframework.boot</groupId>< ...

  2. Redis( 缓存篇 ==> 互斥锁解决缓存击穿

    我们可以在查询缓存未命中的时候添加一个互斥锁.这样一来,在面对高并发的情况下,只有第一个进来的线程才可以拿到锁然后操作数据库,待操作结束后释放锁,未拿到锁的用户则等待一段时间重新查询缓存,直到缓存重建 ...

  3. Spring Cache使用Redisson分布式锁解决缓存击穿问题

    文章目录 1 什么是缓存击穿 2 为什么要使用分布式锁 3 什么是Redisson 4 Spring Boot集成Redisson 4.1 添加maven依赖 4.2 配置yml 4.3 配置Redi ...

  4. Python | threading02 - 互斥锁解决多个线程之间随机调度,造成“线程不安全”的问题。

    文章目录 一.前言 二.线程不安全的现象 2.1.代码 2.2.运行 三.使用互斥锁解决线程不安全 3.1.代码 3.2.运行 四.忘记释放互斥锁,造成死锁 4.1.代码 4.2.运行 4.3.造成死 ...

  5. 架构系列---利用zookeeper 分布式锁解决缓存重建冲突实战

    上一篇 分布式缓存重建并发冲突问题以及zookeeper分布式锁解决方案, 主要讲解了分布式缓存重建冲突原因及利用zookeeper分布式锁解决缓存重建冲突问题,本篇接着上篇,实现上篇思路,带你利用z ...

  6. Redis解决缓存雪崩和缓存穿透

    Redis缓存雪崩 什么是雪崩? 从字面意思已经就能了解到,缓存大面积的失效导致请求直接落到数据库了造成数据库和服务在短时间内承受大量的请求.如果有那种特别复杂的请求,可能导致数据库服务直接宕机 产生 ...

  7. java的尝试性问题_Java并发编程实战 03互斥锁 解决原子性问题

    文章系列 摘要 在上一篇文章02Java如何解决可见性和有序性问题当中,我们解决了可见性和有序性的问题,那么还有一个原子性问题咱们还没解决.在第一篇文章01并发编程的Bug源头当中,讲到了把一个或者多 ...

  8. 如何解决缓存雪崩、击穿、穿透难题?

    缓存雪崩.缓存击穿和缓存穿透这三个问题是我们在使用redis做缓存的时候要面临的,一旦发生这三个问题,就会导致大量的请求都积压到了数据库层,有可能导致数据库宕机,进入导致整个系统不可用. 下边,具体看 ...

  9. Linux信号量与互斥锁解决生产者与消费者问题

    先来看什么是生产者消费者问题: 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问 ...

最新文章

  1. mono beta 3 released
  2. LINUX ulimit命令
  3. Javascript 变量、函数的声明
  4. 面试官:说一下Jena推理
  5. dll侧加载_动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)...
  6. mac下多个php版本切换(可操作版)
  7. android学习-仿Wifi模块实现
  8. python字符串格式化符号含义及转义字符含义
  9. Windows 10 64位系统中安装加密狗驱动出现the returncode is 3003错误的解决方法
  10. 30种常用管理工具模型整理分享(下)
  11. ipa文件生成扫码安装二维码的方法
  12. stm32 带通滤波器_PCB设计中建立带通滤波器波特图
  13. linux locale 编译,Linux locale 缺失和安装
  14. 3D游戏图形API简史
  15. 修改客户端 与服务器断开,如何处理服务器或客户端socket断开
  16. Android命令-重点命令-pm/am/content/wm/appops
  17. 记录 ESIM 安装、使用过程中遇到的问题
  18. 题69.x 的平方根
  19. 法国学术会议申根签证办理(因私)
  20. 3D模型:常用3D模型库

热门文章

  1. python使用清华源镜像安装包
  2. GCP: AppEngine(GAE)的使用
  3. RPA应用于电力行业的优势:来自3大应用场景的解读
  4. 你们关心的租房的那些事
  5. IPhone之获取Sim卡信息
  6. spaa的交互式绘图_SPSS-11统计绘图
  7. HTML5新特性结合PHP实现多图片格式转换功能 欢迎讨论
  8. Tomcat配置(WIN10版本)
  9. Linux快速入门(摘录笔记,大量文字,b站狂神)
  10. 普通话水平测试脸型软件,你明明长得挺漂亮,为什么拍照总是不上镜?