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)
上一篇 2025年8月26日 下午12:22
下一篇 2025年8月26日 下午1:01


相关推荐

  • lrzsz安装

    lrzsz安装当服务器没有安装FTP等工具上传文件时,可以通过rz上传文件,sz文件名进行下载文件,默认下载路径为:C:\Users\用户\Downloads,安装如下:yuminstalllrzsz-y转载于:https://www.cnblogs.com/heruiguo/p/8417031.html…

    2022年6月23日
    30
  • Gemini Nano Banana API完全指南:2025年边缘AI部署最佳实践

    Gemini Nano Banana API完全指南:2025年边缘AI部署最佳实践

    2026年3月13日
    2
  • ddns dnspod_dns和ddns的区别

    ddns dnspod_dns和ddns的区别NBNS——–NetBIOS漏洞【询问主机名】NBNS是网络基本输入/输出系统(NetBIOS)名称服务器的缩写。它也是TCP/IP协议的一部分。它负责将计算机名转化为对应的IP。其中,NamequeryNB是请求包,NamequeryresponseNB是响应包。双方的端口号均为137。NBNS在WIndows用的较少,Windows普遍采用LLMNR协议。在一个局域网中的两台主机,主机A的ip是:10.30.59.77,Mac地址为:HonHaipr_81:74:8A。主

    2022年8月31日
    4
  • Java中语法分析器_语法分析器(java语法分析器)

    Java中语法分析器_语法分析器(java语法分析器)亲这是一款采用递归下降语法分析器 是一种适合手写语法编译器的方法 且非常简单 递归下降法对语言所用的文法有一些限制 但递归下降是现阶段主流的语法分析方法 因为它可以由开发人员高度控制 在提供错误信息方面也很有优势 语法就是规则 比如 C 标识符 第一个字母不能是数字再比如大括号一定要匹配 这就是语法递归下降语法 先消除左递归 E 存在左递归 再避免回溯 本题不存在 文法改为 S gt EE

    2026年3月17日
    2
  • 优化算法——人工蜂群算法(ABC)

    优化算法——人工蜂群算法(ABC)一、人工蜂群算法的介绍人工蜂群算法(ArtificialBeeColony,ABC)是由Karaboga于2005年提出的一种新颖的基于群智能的全局优化算法,其直观背景来源于蜂群的采蜜行为,蜜蜂根据各自的分工进行不同的活动,并实现蜂群信息的共享和交流,从而找到问题的最优解。人工蜂群算法属于群智能算法的一种。二、人工蜂群算法的原理1、原理标准的ABC算法通过模拟

    2022年5月23日
    246
  • 课程设计:c++实现学生成绩管理系统

    课程设计:c++实现学生成绩管理系统学生成绩管理系统课程设计 作为计算机科学专业学生的一门必修课 印象非常深刻 上机 编码 写报告 答辩 最后很多人勉强完成了功课 但是却很少能学到东西 算是一种遗憾吧 即使我们毕业了 仍然会想回去再做一便 今天就来复习一遍这个课题 也让自己学习学习 学生成绩管理系统 对于刚学编程的人来说 是有一些难度的 有循环要考虑 还需要注意界面打印 菜单管理 输入输出控制 文件读写操作 排序算法等等技巧 学生成绩管理系统 可以分为如下几个功能 主菜单 1 输入学生成

    2026年3月16日
    2

发表回复

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

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