当前位置: 首页 > news >正文

redisson常用加锁方式

RLock lock = redissonClient.getLock("lock:order:" + order);和redissonDistributedLocker.tryLock("lock:order:" + order, TimeUnit.SECONDS, RedisLockKey.DEFAULT_WAIT_TIME, RedisLockKey.DEFAULT_HOLD_TIME);这两种加锁方式的区别如下:

  1. 基本的加锁方式 (RLock)

    RLock lock = redissonClient.getLock("lock:order:" + order);
    

    获取锁: 通过 redissonClient.getLock() 获取一个 RLock 对象,并且传入一个键(key),这个键可以是任何字符串。这里的键是 "lock:order:" + order,它通常是基于某个业务标识(比如订单号)来唯一标识锁的。这样,每个订单的锁就是唯一的,其他订单不会被影响。
    锁的操作: 可以使用 lock.lock() 来请求锁,lock.unlock() 来释放锁。它还支持带超时的锁,例如 lock.tryLock(long waitTime, long leaseTime, TimeUnit unit),这可以控制等待的时间和锁的持有时间。
    锁的特点: 这种方式是直接通过 Redisson API 操作锁的基础方式,较为简单和直接。

  2. 使用 RedissonDistributedLocker.tryLock()

    redissonDistributedLocker.tryLock("lock:order:" + order,
                     TimeUnit.SECONDS,
                     RedisLockKey.DEFAULT_WAIT_TIME,
                     RedisLockKey.DEFAULT_HOLD_TIME);
    

    获取锁: redissonDistributedLocker 是一个封装了 Redisson 锁操作的工具类,它通常用于对锁的获取和释放进行更高层次的封装和抽象。tryLock 是尝试获取锁的方法,可以指定等待时间和锁持有时间。"lock:order:" + order作为锁的 key

    tryLock 方法通常有以下几个参数:
    锁的名称: 即锁的 key,这里传入了一个包含业务标识的值。
    等待时间: 即如果锁被占用,最多等待的时间,单位通常是秒或毫秒。
    持有时间: 获取到锁后,锁自动过期的时间,也就是锁的最大持有时间。即使操作没有结束,锁也会在这个时间后自动释放。
    单位: 时间单位,可以是秒、毫秒等。

    锁的操作: tryLock 会尝试获取锁,如果锁被占用,且没有在 DEFAULT_WAIT_TIME 规定的时间内成功获取锁,则会放弃,返回 false。如果获取成功,则锁会在 DEFAULT_HOLD_TIME 时间后自动释放。这个机制有助于避免死锁和长时间占用锁。

  3. 主要区别
    封装和简化:redissonDistributedLocker.tryLock() 是对 Redisson 锁操作的封装,提供了更高层次的 API,使得锁的操作更加简便且灵活,减少了需要手动处理的锁等待和持有时间等逻辑。相比之下,直接使用 RLock 的方法可能需要你手动处理更多的逻辑(如等待、超时等)。

锁的超时管理:

RLock 本身提供了 lock() 和 tryLock() 方法,可以通过 tryLock(long waitTime, long leaseTime, TimeUnit unit)来设置等待时间和锁持有时间。
redissonDistributedLocker.tryLock() 通过封装的方式,简化了这种超时管理,它会在超时后自动返回失败或自动释放锁,减少了代码的复杂度。

使用场景:

RLock 适用于你需要更多控制或者自定义逻辑的场景,比如需要自己处理锁等待时间、持有时间等。
redissonDistributedLocker 更适合在业务中封装常见的分布式锁操作,它提供了简单的 API 以便快速实现分布式锁,特别是当你有一套统一的锁处理逻辑时。

http://www.dtcms.com/a/122606.html

相关文章:

  • 【代码模板】判断C语言中文件是否存在?错误:‘F_OK’未声明如何处理?(access;#include “unistd.h“)
  • 【智慧养猪场】-猪的行为分析视频数据集及展示(已做好分类)
  • C —— 宏
  • Redis-场景缓存+秒杀+管道+消息队列
  • 保留格式地一键翻译英文ppt
  • etf可以T+0交易吗?
  • 基础知识补充篇:什么是DAPP前端连接中的provider
  • 用网页JS实现数据添加和取出的操作,链表
  • Class 文件和类加载机制
  • 【10】数据结构的矩阵与广义表篇章
  • 聊透多线程编程-线程基础-3.C# Thread 如何从非UI线程直接更新UI元素
  • 学习MySQL的第六天
  • vue+uniapp 获取上一页直接传递的参数
  • 大数据(6)【Kettle入门指南】从零开始掌握ETL工具:基础操作与实战案例解析
  • Spring Boot 自定义配置类(包含字符串、数字、布尔、小数、集合、映射、嵌套对象)实现步骤及示例
  • PHP 表单处理详解
  • docker安装软件汇总(持续更新)
  • 2022年全国职业院校技能大赛 高职组 “大数据技术与应用” 赛项赛卷(2卷)任务书
  • (三)行为模式:12、访问者模式(Visitor Pattern)(C++示例)
  • 家居实用品:生活中的艺术,家的温馨源泉‌
  • skynet.dispatch 使用详解
  • 微信小程序中的openid的作用
  • 对比 redis keys 命令 ,下次面试说用 scan
  • Python-Django+vue宠物服务管理系统功能说明
  • 如何在powerbi使用自定义SQL
  • 自定义控件封装
  • 【QT】QT编译链接 msql 数据库
  • vue用D3.js实现轮盘抽奖
  • AC 自动机 洛谷P3808 P3796 P5357
  • 深度学习篇---LSTMFFTGCT