返回顶部
首页 > 资讯 > 数据库 >Redis Lua同步锁实现源码解析
  • 635
分享到

Redis Lua同步锁实现源码解析

RedisLua同步锁RedisLua源码解析 2023-05-19 11:05:05 635人浏览 薄情痞子
摘要

目录Redis+lua同步锁Jedis配置Jedis工具类→获取jedisredis 锁工具类加锁示例(jedis+lua)Redis+Lua同步锁 Jedis配置 @Configuration @Getter

Redis+Lua同步锁

Jedis配置

@Configuration
@Getter
@Setter
@Slf4j
@ConfigurationProperties(prefix = "jedis")
public class JedisConfig {
    @Value("${spring.redis.host}")
    private String host;
    @Value("${spring.redis.port}")
    private int port;
    @Value("${spring.redis.passWord}")
    private String password;
    private int timeout;
    private int maxTotal;
    private int maxIdle;
    private int minIdle;
    @Bean
    public JedisPool jedisPool() {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(maxIdle);
        jedisPoolConfig.setMinIdle(minIdle);
        jedisPoolConfig.setMaxTotal(maxTotal);
        JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, password);
        log.info("JedisPool连接成功:" + host + "\t" + port);
        return jedisPool;
    }
}

Jedis工具类→获取jedis

@Component
public class JedisUtil {
    @Resource
    private JedisPool jedisPool;
    
    public Jedis getJedis() {
        return jedisPool.getResource();
    }
    
    public void close(Jedis jedis) {
        if (jedis != null) {
            jedis.close();
        }
    }
}

redis 锁工具类

public class RedisLockUtil {
    private static final Long RELEASE_SUCCESS = 1L;
    private static final String PREFIX = "api_LOCK_";
    
    public static boolean unLock(Jedis jedis, String lockKey, String valve) {
        String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
        Object result = jedis.eval(script, Collections.singletonList(PREFIX + lockKey), Collections.singletonList(PREFIX + valve));
        if (RELEASE_SUCCESS.equals(result)) {
            return true;
        }
        return false;
    }
    
    public static boolean lock(Jedis jedis, String lockKey, String valve, int timeout) {
        String script = "if redis.call('setnx',KEYS[1],ARGV[1]) == 1 then" +
                " redis.call('expire',KEYS[1],ARGV[2]) return 1 else return 0 end";
        Object result = jedis.eval(script, Collections.singletonList(PREFIX + lockKey), Lists.newArrayList(PREFIX + valve, String.valueOf(timeout)));
        //判断是否成功
        if (RELEASE_SUCCESS.equals(result)) {
            return true;
        }
        return false;
    }
}

加锁示例(jedis+lua)

@Slf4j
@Component
public class InterfaceEventListener {
    @Resource
    private JedisUtil jedisUtil;
    @Value("${jedis.lock.cycle-number}")
    private int cycleNumber;
    @Value("${jedis.lock.expire-time}")
    private int expireTime;
    @Value("${jedis.lock.sleep-time}")
    private int sleepTime;
    @Value("${spring.redis.database}")
    private int database;
    public void onApplicationEvent(InterfaceEvent event) {
        Jedis jedis = jedisUtil.getJedis();
        jedis.select(database);
        boolean unLock = false;
        boolean lock;
        int currentNumber = 0;
        try {
            do {
                lock = RedisLockUtil.lock(jedis, "lockKey", "valve", expireTime);
                if (lock) {
                    try {
                       //todo 加锁的代码
                    } catch (Exception e) {
                        log.error(e.getMessage());
                        e.printStackTrace();
                    } finally {
                        unLock = RedisLockUtil.unLock(jedis, detectCode, detectCode);
                    }
                }
                currentNumber++;
                Thread.sleep(sleepTime);
            }
            while (!unLock && currentNumber < cycleNumber);
        } catch (Exception e) {
            e.printStackTrace();
            log.error(e.getMessage());
        } finally {
            jedisUtil.close(jedis);
        }
    }
}

以上就是Redis Lua同步锁实现源码解析的详细内容,更多关于Redis Lua同步锁的资料请关注我们其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: Redis Lua同步锁实现源码解析

本文链接: https://lsjlt.com/news/213049.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Redis Lua同步锁实现源码解析
    目录Redis+Lua同步锁Jedis配置Jedis工具类→获取jedisredis 锁工具类加锁示例(jedis+lua)Redis+Lua同步锁 Jedis配置 @Configuration @Getter...
    99+
    2023-05-19
    Redis Lua同步锁 Redis Lua 源码解析
  • Springboot基于Redisson实现Redis分布式可重入锁源码解析
    目录一、前言二、为什么使用Redisson1. 我们打开官网2. 我们可以看到官方让我们去使用其他3. 打开官方推荐4. 找到文档三、Springboot整合Redisson1. 导...
    99+
    2024-04-02
  • redisson实现分布式锁的源码解析
    目录redisson测试代码加锁设计锁续期设计锁的自旋重试解锁设计撤销锁续期解锁成功唤排队线程 redisson redisson 实现分布式锁的机制如下: 依赖版本 implem...
    99+
    2024-04-02
  • Java同步锁Synchronized底层源码和原理剖析(推荐)
    目录1 synchronized场景回顾2 反汇编寻找锁实现原理3 synchronized虚拟机源码3.1 HotSpot源码Monitor生成3.2 HotSpot源码之Moni...
    99+
    2024-04-02
  • Java CountDownLatch线程同步源码硬核解析
    目录场景CountDownLatch代码demo场景 有时间在主线程中开启了多线程后,主线程需要等所有线程执行完毕才能return,这个时候就需要在return前拦一下,直到所有线程...
    99+
    2023-01-28
    Java CountDownLatch Java线程同步 Java CountDownLatch线程同步
  • Springboot基于Redisson如何实现Redis分布式可重入锁源码解析
    这篇文章主要介绍了Springboot基于Redisson如何实现Redis分布式可重入锁源码解析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、前言我们在实现使用Redi...
    99+
    2023-06-29
  • Redis主从同步原理解析(实验)
    redis主从同步原理        在主从数据同步过程中,        master只在第一次同步时创建了RDB文件,用此做基础进行同步。        之后的同步,都是通过增量传输命令的方式(AOF)...
    99+
    2024-04-02
  • Redis的主从同步解析
    一、Redis主从同步原理 1.1 Redis主从同步的过程 配置好slave服务器连接的master后,slave会建立和master的连接,然后发送sync命令。无论是第一次同步建立的连接还是连接断...
    99+
    2022-06-04
    主从 Redis
  • RocketMQproducer同步发送单向发送源码解析
    目录RocketMQ生产者发送消息分为三种模式1. 同步发送1.1 DefaultMQProducerImpl#sendDefaultImpl1.2 DefaultMQProduce...
    99+
    2023-03-19
    RocketMQ producer单向发送 RocketMQ producer同步发送
  • ReentrantLock从源码解析Java多线程同步学习
    目录前言管程管程模型MESA模型主要特点AQS共享变量资源访问方式主要方法队列node节点等待状态ReentrantLock源码分析实例化ReentrantLock加锁A线程加锁成功...
    99+
    2023-05-16
    Java多线程ReentrantLock Java ReentrantLock
  • redis如何实现session同步
    Redis可以通过以下几种方式实现session同步:1. 使用Redis Cluster:Redis Cluster是Redis自...
    99+
    2023-08-30
    redis session
  • Java实现synchronized锁同步机制
    目录synchronized实现原理适应性自旋(AdaptiveSpinning)锁升级Java对象头偏向锁(BiasedLocking)偏向锁获取偏向锁释放关闭偏向锁轻量级锁(Li...
    99+
    2024-04-02
  • Node.js pipe实现源码解析
    从前面两篇文章,我们了解到。想要把 Readable 的数据写到 Writable,就必须先手动的将数据读入内存,然后写入 Writable。换句话说,每次传递数据时,都需要写如下的模板代码 reada...
    99+
    2022-06-04
    源码 Node js
  • Android实现屏幕锁定源码详解
    最近有朋友问屏幕锁定的问题,自己也在学习,网上找了下也没太详细的例子,看的资料书上也没有有关屏幕锁定程序的介绍,下个小决心,自己照着官方文档学习下,现在做好了,废话不多说,先发...
    99+
    2022-06-06
    源码 Android
  • 基于Redis实现分布式锁的方法(lua脚本版)
    1、前言 在Java中,我们通过锁来避免由于竞争而造成的数据不一致问题。通常我们使用synchronized 、Lock来实现。但是Java中的锁只能保证在同一个JVM进程内中可用...
    99+
    2024-04-02
  • Redis主从同步的详细解析
    这篇文章主要讲解了Redis主从同步的详细解析,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。一、Redis主从同步原理1.1 Redis主从同步的过程配置好slave服务器连接...
    99+
    2024-04-02
  • Libtask源码解析之如何理解锁
    这篇文章主要讲解了“Libtask源码解析之如何理解锁”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Libtask源码解析之如何理解锁”吧!libtask中...
    99+
    2024-04-02
  • Redisson分布式锁之加解锁源码分析
    这篇文章主要介绍“Redisson分布式锁之加解锁源码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Redisson分布式锁之加解锁源码分析”文章能帮助大家解决问题。锁的可重入性我们都知道,Ja...
    99+
    2023-07-05
  • java底层AQS实现类ReentrantLock锁的构成及源码解析
    目录引导语1、类注释2、类结构3、构造器 4、Sync 同步器4.1、nonfairTryAcquire 4.2、tryRelease5、FairSync 公平锁...
    99+
    2024-04-02
  • redis怎么实现主从同步
    redis怎么实现主从同步?针对这个问题,今天小编总结了这篇文章,希望能帮助更多想解决这个问题的朋友找到更加简单易行的办法。Redis主从复制可以根据是否是全量分为全量同步和增量同步。1 全量同步Redis...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作