redis分布式锁的应用场景有哪些_分布式锁使用场景举例

redis分布式锁的应用场景有哪些_分布式锁使用场景举例为什么需要分布式锁分布式锁是实现用户进程同步的一种方式,需要注意的是,Redis是分布式锁实现的一种技术,而不是作用对象多用户进程请求服务的场景很多,为什么分布式锁并不普遍应用?首先需要定义一下分布式锁的原理和使用场景使用场景原子锁—线程同步,一个程序下的多线程之间对于共享变量进行同步,如计数器分布式锁—进程同步,集群下的多服务进程之间对于共享资源进行同步,如数据库可以明确的是数据库已经实现这种“锁”的机制了,因为它的事务锁机制,虽然多个用户I/O之间会出现数据短暂的不.

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

为什么需要分布式锁

分布式锁是实现用户进程同步的一种方式,需要注意的是,Redis是分布式锁实现的一种技术,而不是作用对象

多用户进程请求服务的场景很多,为什么分布式锁并不普遍应用?首先需要定义一下分布式锁的原理和使用场景 

使用场景

原子锁—线程同步,一个程序下的多线程之间对于共享变量进行同步,如计数器

分布式锁—进程同步,集群下的多服务进程之间对于共享资源进行同步,如数据库

redis分布式锁的应用场景有哪些_分布式锁使用场景举例

可以明确的是数据库已经实现这种“锁”的机制了,因为它的事务锁机制,虽然多个用户I/O之间会出现数据短暂的不一致,长期还是可以保证数据一致性的

不需要进程同步的场景:因为多个用户进程的请求是相对独立的,不受彼此影响或影响不大的(两个都不是持久化请求,即写+写),例如,A开放权限B访问页面属于写+读,同时搜索信息属于读+读

需要进程同步的场景:多个用户进程的请求是互相影响的(两个都是持久化请求,写+写),例如,秒杀系统防止超卖,占位抢票

Redis加锁

需要满足以下特性,因此用到两个命令

独占性:如果锁已经被占用,线程需要阻塞等待—setnx

时效性:锁超过一定时间自动释放—setex

对于共享的Jedis连接,操作需要原子性:

jedis.set(KEY,VALUE,”NX”,”PX”,EXPIRE_TIME);

KEY—锁的密钥

VALUE—用户请求ID/线程ID

“NX”—setnx

“PX”—setex

EXPIRE_TIME—失效时间

代码示例

    private static final String LOCK_SUCCESS = "OK";

    public static boolean lock(Jedis jedis,String KEY,String VALUE,int EXPIRE_TIME) {
        String success = jedis.set(KEY, VALUE, "NX", "PX", EXPIRE_TIME);
        return LOCK_SUCCESS.equals(success);
    }

Redis解锁

需要解决一个问题,因此用到两个命令

避免误删:进程A超时,锁被释放,进程B获得锁,此时进程A删除了KEY,解决方法“解铃还须系铃人”,需要校验传入的VALUE,即用户请求ID,伪代码if get(KEY)=VALUE then del(KEY)

同样地,需要通过一个Jedis的命令实现原子性

jedis.eval(SCRIPT, KEY, VALUE);

SCRIPT—LUA脚本来完成KEY-VALUE校验和删除KEY两个步骤,保证原子性

KEY—锁的密钥

VALUE—用户请求ID/线程ID

代码示例

private static final Long RELEASE_SUCCESS = 1L;

public static boolean release(Jedis jedis,String KEY,String VALUE) {
    String script="if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
    Object success = jedis.eval(script, Collections.singletonList(KEY),Collections.singletonList(VALUE));
    return RELEASE_SUCCESS.equals(success);
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197874.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • word如何一键全选,word怎么全选所有内容(word文档的快捷键操作)「建议收藏」

    word如何一键全选,word怎么全选所有内容(word文档的快捷键操作)「建议收藏」全选快捷键能够提升我们在实际操作word时工作效能,在实际操作Word2003中如何对文本文档中的文本开展选中呢?下边为大伙儿出示几类选中的方式,肯定功能强大。Word如何选中?方式一、应用Word全选快捷键“CtrlA”开展选中(也适用excel表);方式二、进行工具栏中的“编写”,随后挑选“选中”按键来选中;方式三、运用电脑鼠标选中,鼠标左键按着没放随后拖拽到最终还可以选中;方式…

    2022年5月25日
    133
  • pycharm 搜索快捷键_word替换文字快捷键

    pycharm 搜索快捷键_word替换文字快捷键PyCharm快捷键——搜索/替换快捷键搜索/替换快捷键序号快捷键作用1CTRL+F查找2F3查找下一个3SHIFT+F3查找上一个4CTRL+R替换5CTRL+SHIFT+F指定路径下查找6CTRL+SHIFT+R指定路径下替换

    2022年8月25日
    5
  • linux怎么配置tomcat的端口,linux下安装tomcat及iptables开放端口

    linux怎么配置tomcat的端口,linux下安装tomcat及iptables开放端口在Linux运行Tomcat之前必须安装jdk,并配置环境变量。以下是Tomcat的安装配置:1.下载安装包解压以tomcat7为例,https://tomcat.apache.org/download-70.cgi,下载apache-tomcat-7.0.88.tar.gz即可可在/usr下建以tomcat目录,将安装包解压在此目录下即可tar-zxv-fapache-tomcat-7.0…

    2022年5月15日
    37
  • linux解压安装包rar_ubuntu rar文件解压

    linux解压安装包rar_ubuntu rar文件解压#wgethttps://www.rarlab.com/rar/rarlinux-x64-5.8.b4.tar.gz—>>下载包#ls-lrtrar/rar/order.htmrar/acknow.txtrar/readme.txtrar/default.sfxrar/license.txtrar/rarfiles.lstrar/…

    2022年10月21日
    9
  • graphpad两组t检验_GraphPad中国官网 – Prism 8 统计指南 – 多重t检验的选项[通俗易懂]

    graphpad两组t检验_GraphPad中国官网 – Prism 8 统计指南 – 多重t检验的选项[通俗易懂]如何计算单个P值Prism计算每行的非配对t检验,并报告相应双尾P值。有两种方法可进行计算。•更少假设。在作出这种选择后,单独分析每行。其他行中的数值与如何分析特定行中的数值毫无关系。df越来越少,检验力也越来越小,但您做的假设越来越少。请注意,尽管您未假设不同行上的数据从具有相同标准偏差的总体中抽样得到,但您假设每行上的两列中的数据是从具有相同标准偏差的总体中抽样的。这是非配对检验的标准假设,即…

    2022年6月19日
    70
  • Android之rild进程启动源码分析「建议收藏」

    Android之rild进程启动源码分析「建议收藏」Android电话系统框架介绍在android系统中rild运行在AP上,AP上的应用通过rild发送AT指令给BP,BP接收到信息后又通过rild传送给AP。AP与BP之间有两种通信方式:1.SolicitedResponse:Ap向Bp发送请求,Bp给Ap发送回复,该类型的AT指令及其回调函数以数组的形式存放在Ril_commands.h文件中:{数组中的索引号,请

    2025年9月20日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号