springboot整合redis以及缓存穿透缓存雪崩缓存击穿的理解分布式情况下如何添加分布式锁续篇(代码片段)

Mr.Aholic Mr.Aholic     2023-04-08     613

关键词:

文章目录

前言

上一篇实现了单体应用下如何上锁,这一篇主要说明如何在分布式场景下上锁

上一篇地址:加锁

1、分布式情况下如何加锁

需要注意的点是: 在上锁和释放锁的过程中要保证原子性操作

2、具体实现过程

核心是上锁和解锁的过程

关于解锁使用脚本参考:SET key value [EX seconds] [PX milliseconds] [NX|XX]

//上锁过程
String uuid = UUID.randomUUID().toString();
Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock", uuid, 300, TimeUnit.SECONDS);

//解锁过程、需要 调用脚本
String script = "if redis.call(\\"get\\",KEYS[1]) == ARGV[1] then  return redis.call(\\"del\\",KEYS[1]) else return 0 end";
Long lock1 = (Long) redisTemplate.execute(new DefaultRedisScript<Long>(script, Long.class), Arrays.asList("lock"), uuid);
         
    public Map<String, List<Catalog2Vo>> getCatalogJsonDbWithSpringCache() 
        //占分布式锁.redis中占坑
        String uuid = UUID.randomUUID().toString();
        Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock", uuid, 300, TimeUnit.SECONDS);
        Map<String, List<Catalog2Vo>> dataFromDb;
        if (lock) 
            System.out.println("加锁成功......");
            try 
                //加锁成功...执行业务
                dataFromDb = getCategoriesDb();
             finally 
                //删除锁
                String script = "if redis.call(\\"get\\",KEYS[1]) == ARGV[1] then  return redis.call(\\"del\\",KEYS[1]) else return 0 end";
                Long lock1 = (Long) redisTemplate.execute(new DefaultRedisScript<Long>(script, Long.class), Arrays.asList("lock"), uuid);
            
            return dataFromDb;

         else 
            //加锁失败...重试.synchronized  休眠100ms重试
            System.out.println("加锁失败......");
            try 
                Thread.sleep(200);
             catch (Exception e) 

            
            //自旋方式
            return getCatalogJsonDbWithSpringCache();
        

    

3、测试

3.1 一个服务按照多个端口同时启动

模拟分布式情况、将一个服务按照多个端口同时启动

具体过程

  • 1 首先,点击修改运行配置

  • 2 将你的项目配置的右上角的Allowl parallel run勾上(允许多启动)

  • 3 将你的项目配置复制一份重启个名字,添加上-Dserver.port=端口号

  • 4 启动项目

3.2 使用jmeter进行压测

请求的基本配置

测试情况
模拟的基本前提: redis中没有缓存数据

上锁成功的情况下、 三个服务中只会出现一次查询数据库、其余接口请求从redis中拿取数据.

下方是测试截图、符合预期情况 、上锁成功



redis中缓存的数据

springboot整合redis缓存

...非常流行的NoSQL数据库(Redis)来实现我们的缓存需求。SpringBoot整合Redis是非常方便快捷的,我用的是Mybatis,这里就不说Springboot整合Mybatis了网上有很多,同样非常简单。下面进入正题: 查看详情

springboot整合redis实现缓存

...纲一、缓存的应用场景二、更新缓存的策略三、运行 springboot-mybatis-redis 工程案例四、springboot-mybatis-redis 工程代码配置详解 运行环境:MacOS10.12.xJDK8+Redis3.2.8SpringBoot1.5.1.RELEASE 一、缓存的应用场景什么是缓存?... 查看详情

shiro整合springboot缓存之redis实现(代码片段)

Shiro整合Springboot缓存之Redis实现Redis下载安装引入redis依赖配置redis连接启动redis服务自定义redis缓存的实现自定义shiro缓存管理器自定义salt实现实现序列化接口自定义Realm改造开启redis缓存Redis下载安装Windows系统中Redis下载安装其它... 查看详情

精通springboot--整合redis实现缓存

今天我们来讲讲怎么在springboot中整合redis实现对数据库查询结果的缓存。首先第一步要做的就是在pom.xml文件添加spring-boot-starter-data-redis。要整合缓存,必不可少的就是我们要继承一个父类CachingConfigurerSupport。我们先看看这个类... 查看详情

springboot整合redis缓存

使用springBoot添加redis缓存需要在POM文件里引入<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency><dependency 查看详情

redis实现session管理以及缓存穿透与雪崩(代码片段)

...星,欢迎大家来互相助力我的链接redis实现session管理以及缓存穿透与雪崩一、Redis实现分布式Session管理1管理机制2开发Session管理1.引入依赖2.开发Session管理配置类3.打包测试即可二、缓存穿透与雪崩缓存穿透缓存击穿(量... 查看详情

redis缓存穿透,缓存击穿,缓存雪崩解决方案以及封装redis工具类(代码片段)

参考自黑马程序员缓存穿透缓存穿透:数据在数据库和redis中都不存在,请求直接打在数据库中。解决方案:方案一:方案二:代码案例实现: //缓存穿透privateShopcacheBreakDown(Longid)//查询redisStringjsonShop=(String)r... 查看详情

redis缓存穿透,缓存击穿,缓存雪崩解决方案以及封装redis工具类(代码片段)

参考自黑马程序员缓存穿透缓存穿透:数据在数据库和redis中都不存在,请求直接打在数据库中。解决方案:方案一:方案二:代码案例实现: //缓存穿透privateShopcacheBreakDown(Longid)//查询redisStringjsonShop=(String)r... 查看详情

redis缓存穿透,缓存击穿,缓存雪崩解决方案以及封装redis工具类(代码片段)

参考自黑马程序员缓存穿透缓存穿透:数据在数据库和redis中都不存在,请求直接打在数据库中。解决方案:方案一:方案二:代码案例实现: //缓存穿透privateShopcacheBreakDown(Longid)//查询redisStringjsonShop=(String)r... 查看详情

32springboot——缓存之整合redis

springboot缓存默认使用ConcurrentMapCacheManager 将数据保存在下面的Map中1、docker中开启Redis 2、添加Redis相关依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-st 查看详情

springboot整合springcache,简化分布式缓存开发(代码片段)

前言上篇博文,我们深入的介绍了SpringBoot整合Redis的相关内容,处理缓存我们使用RedisTemplate或者StringRedisTemplate结合场景选择不同的数据结构,会造成缓存代码和业务代码会紧耦合在一起。有没有更加简便的方式呢... 查看详情

springboot整合redis实现缓存

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>1.5.2.RELEASE</version></dependency& 查看详情

重学springboot系列之ehcache缓存,缓存问题(代码片段)

重学SpringBoot系列之EhCache缓存,缓存问题,session共享与redis分布式锁EhCache缓存整合SpringCache与Ehcache缓存的使用方法缓存使用中的坑缓存雪崩穿透等解决方案缓存使用的若干问题缓存穿透缓存击穿缓存雪崩redis缓存配置自定... 查看详情

springboot整合shiro集成redis缓存

简介:由于考虑到项目后期分布式部署,所以缓存由ehcache改为redis,而redis既有单机版部署,也有分布式部署,所以二者需要兼容。1.maven依赖<dependency><groupId>org.crazycake</groupId><artifactId>shiro-redis</artifactId><... 查看详情

springboot中使用redistemplate实现redis数据缓存

SpringBoot整合Redis数据库实现数据缓存的本质是整合Redis数据库,通过对需要“缓存”的数据存入Redis数据库中,下次使用时先从Redis中获取,Redis中没有再从数据库中获取,这样就实现了Redis做数据缓存。??按照惯例,下面一步一步... 查看详情

springboot2.0实战(23)整合redis之集成缓存springdatacache

SpringBoot2.0实战(23)整合Redis之集成缓存SpringDataCache来源:https://www.toutiao.com/a6803168397090619908/?timestamp=1584450221&app=news_article_lite&group_id=6803168397090619908&req_id=20200317210341 查看详情

springboot整合spring@cache和redis(代码片段)

转载请注明出处:https://www.cnblogs.com/wenjunwei/p/10779450.htmlspring基于注解的缓存对于缓存声明,spring的缓存提供了一组java注解:@Cacheable:触发缓存写入。@CacheEvict:触发缓存清除。@CachePut:更新缓存(不会影响到方法的运行)。@Caching:重新... 查看详情

springboot整合redis以及redis的简单使用

...多种数据结构的存储系统,用于缓存还是很方便的, springboot整合redis也很简单。 首先在pom文件里面加入redis的相关依赖: <!--Redis客户端--><dependency><groupId>redis.clients</groupId><artifac 查看详情