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><!--redisson-->
<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.16.6</version>
</dependency>

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

spring:redis:host: 39.107.46.146port: 6379password:timeout: 5000database: 0prefix: redis://

3、管理RedisTemplate,RedissonClient

package com.company.springbootinterviewquestions.sys.config;import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.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;}@Beanpublic RedissonClient redissonClient(){Config config = new Config();config.useSingleServer().setAddress(ymlBean.getRedisPrefix() + ymlBean.getRedisHost() + ":" + ymlBean.getRedisPort());return Redisson.create(config);}}

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;@Value("${spring.redis.prefix}")private String redisPrefix;}

5、缓存雪崩控制类

package com.company.springbootinterviewquestions.lock.redis;import cn.hutool.core.util.ObjectUtil;
import com.company.springbootinterviewquestions.core.pojo.response.ResponseData;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
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;/*** 缓存雪崩控制类** @author 35997* @date 2022/4/15*/
@RequestMapping("/cache/avalanche")
@Controller
public class CacheAvalancheController {@Autowiredprivate RedisTemplate redisTemplate;/*** 模拟数据库中的数据*/public void data(){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}redisTemplate.opsForValue().set("aa", "数据");}@Autowiredprivate RedissonClient redissonClient;final String LOCK_NAME = "distributed_mutex";/*** 互斥锁解决缓存雪崩(分布式锁)* @return*/@RequestMapping("/distributed_mutex")@ResponseBodypublic ResponseData distributedMutex(String key){Object value = redisTemplate.opsForValue().get(key);if (ObjectUtil.isEmpty(value)){RLock lock = redissonClient.getLock(LOCK_NAME);if (lock.tryLock()) {try {value = redisTemplate.opsForValue().get(key);if(ObjectUtil.isEmpty(value)){data();}} catch (Exception e){e.printStackTrace();} finally {lock.unlock();}}else{value = redisTemplate.opsForValue().get(key);if(ObjectUtil.isEmpty(value)){try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}distributedMutex(key);}}}return ResponseData.success(value);}}

到此,大功告成。

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

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

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

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

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

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

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

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

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

  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. bzoj3442 学习小组
  2. 好用的 Abyss Web Server
  3. PMCAFF微课堂 (已结束)| 京东平台产品负责人:如何打造一个支撑3200万日订单量的平台型产品
  4. poj 2388 排序的水题
  5. My97 DatePicker获取自定义日期的前一天
  6. android+后台+拍照,Android相机无法从后台服务拍照
  7. kafka : CommitFailedException Commit cannot be completed since the group has already rebalanced
  8. java8(2)--- Stream API
  9. 计算机算法设计与分析教学大纲,《算法设计与分析》教学大纲
  10. Android studio设置代码自动提示
  11. python中eval和ast.literal_eval的区别
  12. 需求提炼:产品需求、技术需求
  13. Ubuntu 20.04 搭建 Fisco-BCOS 2.8.0 区块链系统
  14. 【XSY4041】搬砖(线段树)
  15. 荒岛新生_荒岛Excel文件
  16. DEFERRED_SEGMENT_CREATION参数
  17. nginx resin mysql_Nginx整合Resin
  18. 4.3 ipu_init_channel_buffer函数的详细分析
  19. 12306购票系统前端优化
  20. 自写的C语言矩阵简易运算库

热门文章

  1. 6 大主流 Web 框架优缺点对比(转)
  2. 3-5年的电子工程师最容易遇到的4个瓶颈是什么?
  3. 关于WPF引用字体文件的详细说明
  4. 自建商城系统,如何有个好开始
  5. tomcat 黑马学习笔记
  6. css属性width默认值width: auto与width: 100%区别
  7. 教堂(church)
  8. three.js添加人物实现第一人称视角控制,类似于cf或绝地求生游戏控制人物
  9. Beehive UVALive - 7528 (找规律+数学思维)
  10. 【VLN阅读报告8:History Aware Multimodal Transformer for Vision-and-Language Navigation】