首页 > 数据库 >Lua脚本解决Redis 分布式锁

Lua脚本解决Redis 分布式锁

时间:2024-07-29 10:50:28浏览次数:11  
标签:释放 name Redis Lua PREFIX 线程 stringRedisTemplate 分布式

Redis分布式锁

  • 由于判断锁和释放锁是两个步骤,在判断一致后如果线程阻塞导致锁超时释放。之后阻塞结束,当前线程继续执行释放了其它线程的锁。锁设计失败
  • 解决方法:通过lua封装比较和释放锁两个步骤:要么同时成功,要么同时失败
  • 我的疑问?为什么不对判断和释放锁两个步骤再加锁

 @Override
    public void unlock() {
      // 调用lua脚本
        stringRedisTemplate.execute(
                UNLOCK_SCRIPT,
                Collections.singletonList(KEY_PREFIX + name),
                ID_PREFIX + Thread.currentThread().getId());
    }

    @Override
    public void unlock() {
        // 获取线程表示
        String threadId = ID_PREFIX + Thread.currentThread().getId();
        // 获取锁中标识
        String id = stringRedisTemplate.opsForValue().get(KEY_PREFIX + name);
        // 判断标识是否一致
        if (threadId.equals(id)) {
            // 释放锁
            stringRedisTemplate.delete(KEY_PREFIX + name);
        }
    }

标签:释放,name,Redis,Lua,PREFIX,线程,stringRedisTemplate,分布式
From: https://www.cnblogs.com/Biang-blog/p/18329630

相关文章

  • Redis中pipeline(管道)详解
    redis管道pipeline举个例子:小卖铺免费让你拿50瓶饮料,你是一次拿一瓶拿回家,还是打包一次或者多次拿回家?概念Redis管道(pipelining)是一种在客户端向服务端发送多个请求而不等待响应的技术。它可以显著提高Redis应用程序的性能。管道的主要思想是客户端向服务端发送多个请求......
  • Lua 语法 面向对象实现
    封装--面向对象类其实都是基于table来实现--元表相关的知识点Object={}Object.id=12functionObject:Test() print(self.id)end--冒号是会自动将调用这个函数的对象作为第一个参数传入的写法--在Object表添加new成员方法functionObject:new() --self......
  • Lua 语法 自带库
    时间相关--系统时间print(os.time())--自己传入参数得到时间print(os.time({year=2014,month=8,day=14}))--os.date("*t")localnowTime=os.date("*t")fork,vinpairs(nowTime)do print(k,v)end数学运算--math--绝对值print(math.abs(-11))--弧度转角......
  • 说说你对redis的理解2
    高可用1.主从复制redis中的数据备份在多个服务器中,为了保障数据一致性,提供了主从复制的策略。主服务器进行读写操作,从服务器只读,并且接收主服务器的同步过来的写操作。设置主服务器和从服务器#服务器B执行这条命令replicaof<服务器A的IP地址><服务器A的Re......
  • Lua 语法 元表
    元表概念--任何表变量都可以作为另一个表变量的元表--任何表变量都可以有自己的元表(继承(浅拷贝))--当我们子表中进行一些特定操作时--会执行元表中的内容设置元表设置元表的公共方法setmetatable(被设置的表,元表)getmetatable得到元表,判断是否有元表meta={}myTa......
  • Lua 语法 协同程序
    协程的创建lua协程的类型是thread(线程)协程的本质是一个线程对象关键字:coroutine.create--创建协程fun=function()print(123)end--第一种协程创建方式co=coroutine.create(fun)--协程的本质是一个线程对象--输出类型:地址print(co)--输出threadprint(ty......
  • [Redis]原子性
    事务为了确保连续多个操作的原子性,一个成熟的数据库通常都会有事务支持,Redis也不例外。Redis的事务使用方法非常简单不同于关系数据库我们无须理解那么多复杂的事务模型就可以直接使用。不过也正是因为这种简单性它的事务模型很不严格这要求我们不能像使用关系数据库的事务一样......
  • Redis基础命令
    目录介绍特征redis安装 redis数据结构String类型Hash类型 List类型Set类型 SortedSet Java中操作redisJedisSpringDataRedis导入依赖 编写配置文件测试案例自动序列化手动序列化 介绍Redis全称是RemoteDictionaryServer远程词典服务器,是一个基于......
  • 服务端高并发分布式结构演进之路
    一、概述本文以一个“电子商务” 应用为例,介绍从一百个到千万级并发情况下服务端的架构的演进过程,同时列举出每个演进阶段会遇到的相关技术,了解过后可以对架构的演进有一个整体的认知。二、常见概念在正式引入架构演进之前,先对其中一些比较重要的概念做前置介绍。1、......
  • Lua 语法 复杂类型表 字典 , 类,结构体,表的公共操作
    字典字典的本质运用键值对一个键对应一个值和自定义索引表相似定义使用--字典是由键值对构成a={["name"]="洛溪",["age"]=14,["1"]=10}--访问单个变量用中括号填键来访问print(a["name"])print(a["1"])print(a["age"])--还可以类似成员变量的形式得......