首页 > 数据库 >Redis实现可重入的分布式锁

Redis实现可重入的分布式锁

时间:2024-07-09 18:19:21浏览次数:13  
标签:重入 -- Redis redis call key import local 分布式

加锁脚本

-- 加锁脚本
-- 成功返回1,失败返回-1
local key = KEYS[1]
local requestId = KEYS[2]
-- 单位毫秒
local ttl = tonumber(KEYS[3])
local result = redis.call('setnx', key, requestId)
if result == 1 then
    redis.call('pexpire', key, ttl)
else
    result = -1
    local value = redis.call('get', key)
    -- 可重入
    if (value == requestId) then
        result = 1;
        redis.call('pexpire', key, ttl)
    end
end
return result;

解锁脚本

-- 解锁脚本
-- 成功返回1,失败返回-1
local key = KEYS[1]
local requestId = KEYS[2]
local value = redis.call('get', key)
if value == requestId then
    redis.call('del', key)
    return 1
end
return -1

执行脚本代码

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class RedisLuaScriptExample {
    public static void main(String[] args) {
        JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost");
        try (Jedis jedis = pool.getResource()) {
            // 读取 Lua 脚本文件
            String script = new String(Files.readAllBytes(Paths.get("lock.lua")));

            // 加载 Lua 脚本到 Redis
            String scriptSha = jedis.scriptLoad(script, "0");

            // 执行 Lua 脚本
            jedis.evalsha(script, 0); // 改一下参数

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            pool.close();
        }
    }
}

标签:重入,--,Redis,redis,call,key,import,local,分布式
From: https://www.cnblogs.com/ylty/p/18292524

相关文章

  • jmeter分布式no-gui 测试报告
    1、远程测试https://jmeter.apache.org/usermanual/remote-test.html 2、 3、进行分布式压测是,服务器需要先启动jmeter-sever,启动jmeter-sever建议加上nobup,后开运行,停止服务时,先停master,在停slave,不然可能有问题。linux上具体的压测命令如下:只有一台服务时,若堡垒机可......
  • Redis实战(黑马点评--点赞关注)
    一、发布、查看探店笔记保存blog@PostMappingpublicResultsaveBlog(@RequestBodyBlogblog){//获取登录用户UserDTOuser=UserHolder.getUser();blog.setUserId(user.getId());//保存探店博文blogService.save(blog);//返回idret......
  • Redis实战(黑马点评--优惠券秒杀)
    一、redis实现全局唯一订单id1、问题:使用数据库自增id不合适当用户抢购商品时,生成的订单会保存到tb_voucher_order表中,而订单表如果使用数据库自增ID就会存在一些问题id规律性太明显受单表数据量的限制2、解决方法:全局id生成器符号位:1bit,永远为0时间戳:31bit,以秒为单位,可......
  • CenterOs7安装redis
    CenterOs7安装redis1.redis的安装1.1下载redis从官网下载redis,并且上传到服务器的安装位置1.2安装redis①解压redis,执行tar-zxvf安装包名称②makeredis源码,make③makeinstallmakeinstall2.redis的配置2.1配置启动脚本配置redis的启动脚本,放置于/etc/init.d/......
  • redis学习(007 实战:黑马点评:登录)
    黑马程序员Redis入门到实战教程,深度透析redis底层原理+redis分布式锁+企业解决方案+黑马点评实战项目总时长42:48:00共175P此文章包含第25p-第p34的内容文章目录短信登录功能session共享问题短信登录功能接口编写这里是Result的封装过滤器在......
  • 【模型预测控制】单向拓扑结构下异构车辆排分布式模型预测控制【含Matlab源码 4968期
    ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信或扫描文章底部QQ二维码。......
  • Redis三大缓存问题:缓存穿透、缓存击穿、缓存雪崩的场景以及解决方法
    文章目录都是缓存惹的祸缓存穿透场景描述解决方法缓存键同时失效1.过期时间随机化2.使用多级缓存3.缓存预热4.加互斥锁缓存中间件故障1.服务熔断-Java示例2.构建Redis集群注意事项缓存击穿场景描述解决方法1.加互斥锁(MutexLock)2.永久缓存热点数据注意事......
  • redis常用命令
    redis常用命令:    1)连接操作命令   quit:关闭连接(connection)   auth:简单密码认证   helpcmd:查看cmd帮助,例如:helpquit      2)持久化   save:将数据同步保存到磁盘   bgsave:将数据异步保存到磁盘   lastsave:返回上次成功将数据保......
  • redis安装教程
    1.redis下载: Windows下载reids:https://github.com/MSOpenTech/redis/releases。 下载redis的可视化工具:https://github.com/uglide/RedisDesktopManager/releases/download/0.9.3/redis-desktop-manager-0.9.3.817.exe 2.启动redis:,,打开运行窗口,启动redis服务器端,然......
  • redis安装
    redis安装#1、安装编译环境等dnfinstall-ygccvimwget#2、下载并建立目录mkdirsoftwarewgethttps://download.redis.io/releases/redis-7.2.5.tar.gztar-zxvfredis-7.2.5.tar.gz#3、安装cdredis-7.2.5.tar.gzmakemakeinstall4、编译后默认安装目录是/usr/local/bin......