首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Redis实现分布式锁

Redis实现分布式锁

作者头像
用户5927264
发布于 2021-06-08 13:23:50
发布于 2021-06-08 13:23:50
39700
代码可运行
举报
文章被收录于专栏:OSChinaOSChina
运行总次数:0
代码可运行

一看就会的超详细教程:SpringBoot整合MybatisPlus!>>>

1.自己实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    private static String REDIS_LOCK = "redis_lock";

    @Autowired
    private RedissonClient redission;

 

/**
     * 自定redisLock实现分布式锁,
     * 使用 RedisTemplate + lua脚本实现
     * @return
     */
    @GetMapping("/mylock")
    public String redisLock() {
        String resoult = "";

        long value = System.currentTimeMillis() + Thread.currentThread().getId();
        try {
            //1.原子性的设置锁,并且设置超时时间30s(加分布式锁)
            Boolean flag = redisTemplate.opsForValue().setIfAbsent(REDIS_LOCK, value, 30l, TimeUnit.SECONDS);
            if (!flag) {
                return "抢占锁失败";
            }

            //2.获取库存数量
            Object obj = redisTemplate.opsForValue().get("goods:100");
            int goodsNum = obj == null ? 0 : Integer.parseInt(obj.toString());
            if (goodsNum > 0) {
                goodsNum = goodsNum - 1;
                //3.把库存-1,并且设置会系统中
                redisTemplate.opsForValue().set("goods:100", String.valueOf(goodsNum));

                //模拟超时40秒
                Thread.sleep(40000);

                resoult = "成功购买到商品,剩余库存:" + goodsNum + " 件商品";
            } else {
                resoult = "商品已经售完/活动结束/调用结束,欢迎下次光临";
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            //4.消除分布式锁(使用lua脚本实现删除锁)
            DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
            //指定lua脚本
            redisScript.setScriptText("if redis.call(\"get\",KEYS[1]) == ARGV[1] then\n" +
                    "    return redis.call(\"del\",KEYS[1])\n" +
                    "else\n" +
                    "    return 0\n" +
                    "end");
            // 指定返回类型
            redisScript.setResultType(Long.class);
            // 参数一:redisScript,参数二:key列表,参数三:arg(可多个)
            Long result = (Long) redisTemplate.execute(redisScript, Collections.singletonList(REDIS_LOCK), value);
            if (result == 1) {
                System.out.println("删除 锁 ok");
            } else {
                System.out.println("删除 锁 error");
            }
        }

        System.out.println(resoult);
        return resoult;
    }

2.使用redisson实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.15.0</version>
        </dependency>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Bean
    public RedissonClient redissonClient() {
        Config config = new Config();
        config.setTransportMode(TransportMode.EPOLL);
        config.useClusterServers()
                .addNodeAddress("redis://192.168.2.13:6379");
        return Redisson.create(config);
    }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.un.project.system.controller.app;

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.data.redis.core.script.DefaultRedisScript;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Collections;
import java.util.concurrent.TimeUnit;

/**
 * Redis Lock实现分布式锁
 *
 * @author shiye
 * @create 2021-05-28 13:47
 */
@RestController
@RequestMapping("/ws/redis")
public class MyRedisLockController {


    private static String REDIS_LOCK = "redis_lock";

    @Autowired
    private RedissonClient redission;



    @GetMapping("/redissonlock")
    public String redissonLock() {
        String resoult = "";

        long value = System.currentTimeMillis() + Thread.currentThread().getId();
        //1.使用Redisson来加锁
        RLock redissionLock = redission.getLock(REDIS_LOCK);
        redissionLock.lock(30, TimeUnit.SECONDS);
        try {
            //2.获取库存数量
            Object obj = redisTemplate.opsForValue().get("goods:100");
            int goodsNum = obj == null ? 0 : Integer.parseInt(obj.toString());
            if (goodsNum > 0) {
                goodsNum = goodsNum - 1;
                //3.把库存-1,并且设置会系统中
                redisTemplate.opsForValue().set("goods:100", String.valueOf(goodsNum));

                //模拟超时41秒
                Thread.sleep(41000);

                resoult = "成功购买到商品,剩余库存:" + goodsNum + " 件商品";
            } else {
                resoult = "商品已经售完/活动结束/调用结束,欢迎下次光临";
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            //4.消除分布式锁(使用lua脚本实现删除锁)
            if (redissionLock.isLocked() && redissionLock.isHeldByCurrentThread()) {
                redissionLock.unlock();
            }
        }

        System.out.println(resoult);
        return resoult;
    }

}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Redis分布式锁存在的问题
假设有这样一个场景,在一个购票软件上买一张票,但是此时剩余票数只有一张或几张,这个时候有几十个人都在同时使用这个软件购票。在不考虑任何影响下,正常的逻辑是首先判断当前是否还有剩余的票,如果有,那么就进行购买并扣减库存数,否则就会提示票数不足,购买失败。伪代码如下:
闻说社
2022/12/28
4370
Redis分布式锁存在的问题
Redis分布式锁的正确实现方式
数据库乐观锁 基于Redis的分布式锁 基于Zookeeper的分布式锁 本文介绍的是基于Redis的分布式锁;
stys35
2020/04/02
1.1K0
一文读懂分布式锁——使用SpringBoot+Redis实现分布式锁
随着现在分布式架构越来越盛行,在很多场景下需要使用到分布式锁。很多小伙伴对于分布式锁还不是特别了解,所以特地总结了一篇文章,让大家一文读懂分布式锁的前世今生。
章为忠学架构
2023/03/23
7.2K0
一文读懂分布式锁——使用SpringBoot+Redis实现分布式锁
Redis 实现分布式锁真的安全吗?
锁的种类非常多。之前写过一篇文章,对工作中常用锁做了总结,如:乐观锁、悲观锁、分布式锁、可重入锁、自旋锁、独享锁、共享锁、互斥锁、读写锁、阻塞锁、公平锁、非公平锁、分段锁、对象锁、类锁、信号量、行锁。
微观技术
2021/03/11
4540
浅谈缓存与分布式锁
对于一个大型网站而言,每天的访问量是巨大的,尤其遇到某些特定的时间点,比如电商平台的购物节、教育平台开学季。当在某个时间点遇到过量的并发时,往往会压垮服务器导致网站崩溃,因此,网站对于高并发的处理是至关重要的,其中缓存起着举足轻重的作用。对于一些不经常变化,或者热度很高的数据,可以将其存入缓存,此时当用户访问时将直接读取缓存而不查询数据库,从而大大提高了网站的吞吐量。
wangweijun
2022/01/10
2200
redis分布式锁(2)
index1执行删除前,lock刚好过期时间已到,被redis自动释放,在redis中没有了lock,没有了锁。
一个风轻云淡
2022/11/13
3820
redis分布式锁(2)
【Redis】Redis 分布式锁
随着业务发展的需要,原单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的 Java API 并不能提供分布式锁的能力。为了解决这个问题就需要一种跨 JVM 的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题!
终有救赎
2023/10/26
4130
【Redis】Redis 分布式锁
分布式锁+AOP实现缓存
  随着业务中缓存及分布式锁的加入,业务代码变的复杂起来,除了需要考虑业务逻辑本身,还要考虑缓存及分布式锁的问题,增加了程序员的工作量及开发难度。而缓存的玩法套路特别类似于事务,而声明式事务就是用了aop的思想实现的。
别团等shy哥发育
2023/04/23
3090
分布式锁+AOP实现缓存
SpringBoot整合Redis实现分布式缓存、分布式锁等,实战分享!
在前几篇文章中,我们详细介绍了 redis 的一些功能特性以及主流的 java 客户端 api 使用方法。
Java极客技术
2023/02/23
3.4K0
SpringBoot整合Redis实现分布式缓存、分布式锁等,实战分享!
[Redis] 分布式缓存中间件 Redis 之 分布式锁实战
环境准备Redis 如何实现分布式锁线程不安全单机锁分布式锁代码实现Redisson 集成和源码分析Redisson 集成源码分析 `RedissonLock`加锁解锁集群分布式锁失效判断机制总结REFERENCES更多
架构探险之道
2020/03/19
8500
[Redis] 分布式缓存中间件 Redis 之 分布式锁实战
redis实现分布式锁
问题:加锁的原子性不能保证 解决:使用redis的setnx 2、代码第二阶段 setnx->set if not exist:原子操作。判断带保存。
周杰伦本人
2022/10/25
4260
继续项目实战,集成Redis分布式锁(大神勿进)
本文是我们小项目的第三篇文了,本次我们来把分布式锁应用到我们的项目中,使用Redis实现的分布式锁功能,这一切都是为我们往后的工作做铺垫,希望大家能get到分布式锁这项新技能。
田维常
2021/03/16
3770
【分布式进阶】我们来填填Redis分布式锁中的那些坑。
  大家好,我是Coder哥,最近在准备面试鸽了一段时间,面试告一段落了,今天我们来聊一下基于Redis锁中的那些坑。这篇分析比较全面,记得点赞收藏哟!!!
TodoCoder
2022/09/23
6840
【分布式进阶】我们来填填Redis分布式锁中的那些坑。
Java分布式锁(6种实现方法)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/144795.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/30
3.3K0
【📕分布式锁通关指南 05】通过redisson实现分布式锁
一句话总结-redis的高性能客户端,我们选择它是因为它内部已经封装好了很多锁的实现,详细介绍可以通过redisson的Github主页来查看。
别惹CC
2025/02/28
3750
【📕分布式锁通关指南 05】通过redisson实现分布式锁
redis 分布式锁的 5个坑,真是又大又深
最近项目上线的频率颇高,连着几天加班熬夜,身体有点吃不消精神也有些萎靡,无奈业务方催的紧,工期就在眼前只能硬着头皮上了。脑子浑浑噩噩的时候,写的就不能叫代码,可以直接叫做Bug。我就熬夜写了一个bug被骂惨了。
程序员小富
2020/04/22
2.3K0
写个注解帮你净化使用分布式锁的重复操作
AOP 旨在从业务逻辑中分离出来通用逻辑,切面实现了跨越多种类型和对象的关注点(例如事务管理、日志记录、权限控制)的模块化。
冷环渊
2022/11/21
3110
写个注解帮你净化使用分布式锁的重复操作
分布式锁-redis实现
为什么要分布式锁 在单机的情况下,可以通过jvm提供的系列线程安全的操作来处理高并发的情况,但是在分布式的环境下,jvm提供的线程安全操作明显是不能满足要求的。在一些小型的互联网公司经常做的crud操作如果在高并发的情况下会出现很大的问题,比如: //伪代码:下订单 1、查库存:getStock() 2、判断库存:stock>0下单 3、下单:addOrder() 4、减库存 仅仅以上三步,如果在高并发的情况下,无论是单机或者集群,如果不加锁一定会出现超卖的情况。一瞬间成千上万个请求过来,如何能够确保查询
爱撒谎的男孩
2020/03/09
5940
分布式锁-Redisson
  我们在Java中学习过了synchronized及lock锁,这些锁都是本地锁,我们通过一个案例演示本地锁的问题。
别团等shy哥发育
2023/04/23
5880
分布式锁-Redisson
分布式锁其实很简单,6行代码教你实现redis分布式锁,千万不要再用redisTemplate写redis分布式锁代码实现
分布式锁是一种用于协调分布式系统中多个节点之间对共享资源进行访问控制的机制。它可以确保在分布式环境下,同一时间只有一个节点能够获取到锁,并且其他节点需要等待释放锁后才能获取。
小小鱼儿小小林
2024/05/25
1.7K0
分布式锁其实很简单,6行代码教你实现redis分布式锁,千万不要再用redisTemplate写redis分布式锁代码实现
推荐阅读
相关推荐
Redis分布式锁存在的问题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验