SETNX

使用方法:SETNX(SET if Not eXists)是 Redis 中一个经典的用于设置分布式锁的命令。它的作用是当指定的键不存在时,才会设置该键的值,如果键已经存在则不做任何操作。但 SETNX 本身不支持直接设置过期时间。

坏处:为了避免死锁(例如持有锁的客户端崩溃而未释放锁),需要额外使用 EXPIRE 命令来为锁设置过期时间。然而,SETNX 和 EXPIRE 是两个独立的命令,在高并发场景下,可能会出现 SETNX 执行成功,但在执行 EXPIRE 之前客户端崩溃的情况,这样就会导致锁没有设置过期时间。他们不是一个原子操作。

setIfAbsent

使用方法:setIfAbsent(key, value, expireTime, TimeUnit.SECONDS) 是 Spring Data Redis 对 Redis 中 SET key value NX PX timeout 命令的封装。这个命令将设置键值对、判断键是否存在以及设置过期时间这三个操作合并为一个原子操作。

Redisson 实现分布式锁

使用方法:开发者只需创建 RLock 对象,调用 lock() 或 tryLock() 方法获取锁,调用 unlock() 方法释放锁,无需关心底层的 Redis 命令和复杂的实现细节。

redission锁的好处

功能特性丰富

1、可重入锁:Redisson 支持可重入锁,即同一个线程可以多次获取同一把锁,而不会产生死锁。这在一些复杂的业务逻辑中非常有用,例如递归调用时可以安全地使用锁。

2、公平锁:提供公平锁的实现,保证线程按照请求锁的顺序依次获得锁,避免某些线程长时间得不到锁的情况,适用于对锁获取顺序有严格要求的场景。

3、联锁和红锁:支持联锁(MultiLock)和红锁(RedLock)。联锁可以将多个锁作为一个整体进行加锁和解锁操作;红锁用于在多个 Redis 节点上实现高可用的分布式锁,提高了锁的可靠性。

自动续期机制

Redisson 实现了锁的自动续期机制,当持有锁的线程在执行任务过程中,若锁的过期时间快到了,Redisson 会自动延长锁的过期时间,避免因业务逻辑执行时间过长导致锁提前释放,从而保证业务逻辑的原子性。

异常处理和可靠性

Redisson 对异常情况进行了良好的处理,例如在获取锁或释放锁时出现网络异常等情况,会有相应的重试机制和错误处理逻辑,提高了系统的可靠性。

redis实现分布式锁的方式,他们有什么区别的更多相关文章

  1. 【Redis】分布式锁RedLock

    普通实现 说道Redis分布式锁大部分人都会想到: 1.setnx+lua, 2.setkey value px milliseconds nx. - 获取锁(unique_value可以是UUID等 ...

  2. Java基于redis实现分布式锁(SpringBoot)

    前言 分布式锁,其实原理是就是多台机器,去争抢一个资源,谁争抢成功,那么谁就持有了这把锁,然后去执行后续的业务逻辑,执行完毕后,把锁释放掉. 可以通过多种途径实现分布式锁,例如利用数据库(mysql等 ...

  3. redis咋么实现分布式锁,redis分布式锁的实现方式,redis做分布式锁 积极正义的少年

    前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...

  4. Redis实现分布式锁的正确使用方式(java版本)

    Redis实现分布式锁的正确使用方式(java版本) 本文使用第三方开源组件Jedis实现Redis客户端,且只考虑Redis服务端单机部署的场景. 分布式锁一般有三种实现方式: 1. 数据库乐观锁: ...

  5. Redis分布式锁实现方式(附有正解及错误示例)

    一.前言 本文内容主要来自博客:https://wudashan.com/2017/10/23/Redis-Distributed-Lock-Implement/,本文用于归纳总结及笔记用途,如有需要 ...

  6. Redis: 分布式锁的正确实现方式(转)

    前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...

  7. 基于redis 实现分布式锁的方案

    在电商项目中,经常有秒杀这样的活动促销,在并发访问下,很容易出现上述问题.如果在库存操作上,加锁就可以避免库存卖超的问题.分布式锁使分布式系统之间同步访问共享资源的一种方式 基于redis实现分布式锁 ...

  8. 用Redis构建分布式锁-RedLock(真分布)

    在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现一个分布式锁管理器,但是这些库实现的方式差别很大,而且很多简单的实现其实只需采用稍微增 ...

  9. Redis实现分布式锁

    http://redis.io/topics/distlock 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现一个分布式锁管理器,但 ...

  10. 基于Redis实现分布式锁(1)

    转自:http://blog.csdn.net/ugg/article/details/41894947 背景在很多互联网产品应用中,有些场景需要加锁处理,比如:秒杀,全局递增ID,楼层生成等等.大部 ...

随机推荐

  1. 使用Spring Boot 优雅地发送邮件

    1.前言        在实际项目中,经常需要用到邮件通知功能.比如,用户通过邮件注册账号,通过邮件找回账号密码等:又比如通过邮件发送系统运行情况,通过邮件发送报表信息,给用户发送营销信息等等,实际应 ...

  2. 「Note」数论方向 - 组合数学

    1. 容斥原理 1.1 介绍 解决集合内计数问题. \(S\) 为集合编号集合. \[\left | \bigcup_{i\in S}A_i \right | =\sum_{T\subseteq S\ ...

  3. pytorch入门 - 微调huggingface大模型

    在自然语言处理(NLP)领域,预训练语言模型如BERT已经成为主流.HuggingFace提供的Transformers库让我们能够方便地使用这些强大的模型. 本文将详细介绍如何使用PyTorch微调 ...

  4. vue.js+vuetify学习开发排坑:一个古怪的代码 v-slot:activator="{ on, attrs }"

    由于需要全栈开发一个售票系统项目,时隔一年后重新捡回了我的前端技术~ 开发习惯是边看文档边做,然后再vuetify这个MD设计的UI元件库翻来翻去,再涉及到元件交互的时候有几段代码不是很能理解 < ...

  5. 【渗透测试】不怎么水的洞之IP伪造

    漏洞原理 有些应用程序有记录用户IP的功能或者限制IP白名单的功能,如果应用程序从请求头字段获取用户IP,可能会被攻击者伪造,来达到欺骗服务器的目的. 案例一 发现操作日志页面有个记录用户IP功能 插 ...

  6. HTML5 e CSS3 入门教程与练习项目

    HTML5 e CSS3 课程材料 这是一个公开的HTML5和CSS3教学资源库,包含完整的课程PDF.实践练习代码和在线演示. 项目特点 结构化学习路径:从基础到高级的模块化课程设计 :laptop ...

  7. 经典记忆卡片游戏html代码

    记忆卡片游戏是一款简单而富有挑战性的经典游戏,旨在锻炼玩家的记忆力和观察力.游戏通常由一组图案相同的卡片组成,玩家需要通过翻转卡片找到匹配的对.每当找到一对匹配的卡片时,玩家将获得一定的分数或奖励,游 ...

  8. StarRocks 物化视图创建与刷新全流程解析

    最近在为 StarRocks 的物化视图增加多表达式支持的能力,于是便把物化视图(MV)的创建刷新流程完成的捋了一遍. 之前也写过一篇:StarRocks 物化视图刷新流程和原理,主要分析了刷新的流程 ...

  9. 用termius或者cmd等都能够连接上服务器,但是用vscode连接不上???

    最近实验室的服务器进行重装更新了,开始使用wsl,现在直接装Linux系统的Ubantu.服务器的ip.端口.个人名字都没有变.也就相当于之前在termius等远程连接的软件上都能够连上. 我习惯用v ...

  10. SQL Prompt 联网限制

    SQLPrompt关闭联网_sqlprompt阻止联网_幻欢子的博客-CSDN博客 方法一:修改hosts文件 1.安装SQLPrompt_xxx.exe成功后,编辑修改hosts文件:C:\Wind ...