0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用redis实现分布式锁的lua脚本出现和资料说明

Wildesbeast 来源:搜狐新闻 作者:程序猿的内心独白 2019-12-01 11:00 次阅读

1.lua简介

从 Redis 2.6.0 版本开始,通过内置的 Lua 解释器,可以使用 EVAL 命令对 Lua 脚本进行求值。

Redis 使用单个 Lua 解释器去运行所有脚本,并且, Redis 也保证脚本会以原子性(atomic)的方式执行:当某个脚本正在运行的时候,不会有其他脚本或 Redis 命令被执行。这和使用 MULTI / EXEC 包围的事务很类似。在其他别的客户端看来,脚本的效果(effect)要么是不可见的(not visible),要么就是已完成的(already completed)。

2.Lua脚本配置流程

在resource目录下面新增一个后缀名为.lua结尾的文件

编写脚本执行内容

调用redisTemplate.execute方法执行脚本

3.lua eval:http://doc.redisfans.com//eval.html 4.本地起两个服务节点作为演示。演示代码如下:

本文采用定时调度模拟线程去获取锁(链接:详解Scheduled定时调度)

使用-Dserver.port=9527,-Dserver.port=9528开启多个节点

local lock_key = KEYS[1]

local lock_value = KEYS[2]

local result = redis.call(‘SETNX’,lock_key,lock_value)

if result == 1

then

redis.call(‘SETEX’,lock_key,60,lock_value)

return result

else

return result

end

lua脚本redis客户端执行命令如下:

redis-cli --eval xxxx.lua value value 。..。..。

ps:执行成功返回1,失败返回0

local lock_key = KEYS[1]

local lock_value = KEYS[2]

local lock_time_out = KEYS[3]

local result = redis.call(‘SET’,lock_key,lock_value,‘EX’,lock_time_out,‘NX’)

return result

ps:执行成功返回OK,失败返回nil

@Component

public class RedisLock {

@Autowired

private RedisTemplate redisTemplate;

private DefaultRedis《Boolean》 lock;

@Value(“${server.port}”)

private String port;

@Scheduled(cron = “0/5 * * * * *”)

public void lock {

String lock = “LockNxExJob”;

Boolean absent = false;

try {

// 获取锁

absent = luaExpress (lock, port);

if (!absent) {

System.out.println (String.format (“获取锁失败!被%s拿走”, redisTemplate.opsForValue .get (lock)));

} else {

System.out.println (String.format (“获取锁成功!值为:%s”, redisTemplate.opsForValue .get (lock)));

}

} catch (Exception e) {

e.printStackTrace ;

} finally {

// 释放锁

if (absent) redisTemplate.delete (lock);

}

}

public Boolean luaExpress(String key, String value) {

lock = new DefaultRedis《》 ;

lock.setSource (new ResourceSource (new ClassPathResource (“lua\redis.lua”)));

lock.setResultType (Boolean.class);

List《Object》 list = new ArrayList《》 ;

list.add (key);

list.add (value);

Boolean result = (Boolean) redisTemplate.execute (lock, list);

return result;

}

}

ps:当节点9527成功获取分布式锁,在没有执行释放锁之前,服务节点宕掉了,节点9528则会无法获取到锁,直到设置锁的超时时间结束,才能获得锁。避免了单节点挂掉了,锁一直未被释放的尴尬场景。

5.总结

Redis 使用单个 Lua 解释器去运行所有脚本,并且, Redis 也保证脚本会以原子性(atomic)的方式执行:当某个脚本正在运行的时候,不会有其他脚本或 Redis 命令被执行,保证了只要能setnx成功就能setex。解决了服务获取锁成功,但突然宕机,未能设置超时时间问题。
责任编辑 LK

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66750
  • Lua
    Lua
    +关注

    关注

    0

    文章

    75

    浏览量

    10444
  • Redis
    +关注

    关注

    0

    文章

    362

    浏览量

    10492
收藏 人收藏

    评论

    相关推荐

    在 Java 中利用 redis 实现一个分布式服务

    在 Java 中利用 redis 实现一个分布式服务
    发表于 07-05 13:14

    分布式Redis的五种数据类型

    分布式_Redis》_概述汇总
    发表于 10-15 10:55

    Redis 分布式锁的正确实现方式

    分布式锁一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis分布式锁;3. 基于ZooKeeper的分布式锁。
    的头像 发表于 05-31 14:19 3327次阅读

    Redis分布式锁的正确使用方式探讨

    大家指出哈,一起学习一起进步。 什么是分布式锁 方案一:SETNX + EXPIRE 方案二:SETNX + value值是(系统时间+过期时间) 方案三:使用Lua脚本(包含SETNX
    的头像 发表于 03-30 10:53 1273次阅读
    <b class='flag-5'>Redis</b><b class='flag-5'>分布式</b>锁的正确使用方式探讨

    手撸了个Redis分布式

    实现分布式锁的方式有很多,其中 Redis 是最常见的一种。而相较于 Java + Redis 的方案,我个人更倾向于 Go+Redis,从
    的头像 发表于 11-03 14:44 468次阅读

    如何使用注解实现redis分布式锁!

    使用 Redis 作为分布式锁,将锁的状态放到 Redis 统一维护,解决集群中单机 JVM 信息不互通的问题,规定操作顺序,保护用户的数据正确。
    发表于 04-25 12:42 363次阅读
    如何使用注解<b class='flag-5'>实现</b><b class='flag-5'>redis</b><b class='flag-5'>分布式</b>锁!

    深入理解redis分布式

    深入理解redis分布式锁 哈喽,大家好,我是指北君。 本篇文件我们来介绍如何Redis实现分布式锁的演进过程,以及为什么不能直接用Setn
    的头像 发表于 10-08 14:13 571次阅读
    深入理解<b class='flag-5'>redis</b><b class='flag-5'>分布式</b>锁

    redis分布式锁如何实现

    Redis分布式锁是一种基于Redis实现的机制,可以用于多个进程或多台服务器之间对共享资源的并发访问控制。在分布式系统中,由于多个进程或多
    的头像 发表于 11-16 11:29 298次阅读

    redis分布式锁可能出现的问题

    Redis分布式锁是一种常用的锁机制,用于解决多个进程或多台服务器对共享资源的并发访问问题。然而,由于分布式环境的复杂性,使用Redis分布式
    的头像 发表于 11-16 11:40 511次阅读

    redis分布式锁死锁处理方案

    引言: 随着分布式系统的广泛应用,尤其是在大规模并发操作下,对并发控制的需求越来越高。Redis分布式锁作为一种常见的分布式实现方案,由于
    的头像 发表于 11-16 11:44 508次阅读

    redis分布式锁的应用场景有哪些

    Redis分布式锁是一种基于Redis实现分布式锁机制,可以在分布式环境下确保资源的独占性,避
    的头像 发表于 12-04 11:21 554次阅读

    redis分布式锁三个方法

    Redis是一种高性能的分布式缓存和键值存储系统,它提供了一种可靠的分布式锁解决方案。在分布式系统中,由于多个节点之间的并发访问,需要使用分布式
    的头像 发表于 12-04 11:22 534次阅读

    如何实现Redis分布式

    锁机制,下面将详细介绍如何实现Redis分布式锁。 一、引言 在分布式系统中,多个节点可能同时读写同一共享资源。如果没有实现互斥访问和同步机
    的头像 发表于 12-04 11:24 380次阅读

    redis分布式锁可能出现的问题及解决方案

    Redis分布式锁是一种常见的解决分布式系统中并发问题的方案。虽然Redis分布式锁具有许多优点,但也存在一些潜在的问题需要注意。本文将详细
    的头像 发表于 12-04 11:29 420次阅读

    redis分布式锁的缺点

    Redis分布式锁是一种常见的用于解决分布式系统中资源争用问题的解决方案。尽管Redis分布式锁具有很多优点,但它也存在一些缺点。本文将从几
    的头像 发表于 12-04 14:05 473次阅读