总结
豆包 AI 助手文章总结
首页 > Java > java教程 > 正文

SpringBoot整合redis实现分布式锁,执行lua脚本出错:RedisTemplate.execute()方法返回值类型和EVALSHA命令异常如何解决?

心靈之曲
发布: 2024-10-26 13:15:02
原创
354人浏览过

springboot整合redis实现分布式锁,执行lua脚本出错:redistemplate.execute()方法返回值类型和evalsha命令异常如何解决?

springboot整合redis实现分布式锁,执行lua脚本出错

redistemplate.execute()方法的返回值类型

redistemplate.execute()方法的返回值类型由给定的redisscript的泛型决定。因此,此处正确的代码应该是:

object result = redistemplate.execute(redisscript, collections.singletonlist(key), value);
登录后复制

单元测试报错分析

从日志中可以看出,错误原因是执行命令时遇到了illegalstateexception。这是因为在执行evalsha命令时,redis服务器尝试解析脚本并准备执行。如果脚本中存在错误或语法无效,则会抛出这个异常。

在给定的脚本中,并没有明显的语法错误。然而,lua脚本中的sha1哈希值似乎不匹配redistemplate中存储的脚本的sha1哈希值。这可能是由于以下原因造成的:

  • 脚本已更改而未重新加载
  • 使用了错误的redistemplate实例

要解决此问题,请检查你的脚本是否正确,并确保在执行evalsha之前已通过scriptoperations正确加载脚本。

修正后代码

public void unlock(String key, Object value) {
    String script = "if (redis.call('GET',KEYS[1]) == ARGV[1]) then return redis.call('DEL',KEYS[1]) else return 0 end";
    RedisScript<Long> redisScript = new DefaultRedisScript<>(script);
    redisScript.setResultType(Long.class);
    List<String> keys = new ArrayList<>();
    keys.add(key);
    Long result = stringRedisTemplate.execute(redisScript, keys, value);
    System.out.println(result);
}
登录后复制

以上就是SpringBoot整合redis实现分布式锁,执行lua脚本出错:RedisTemplate.execute()方法返回值类型和EVALSHA命令异常如何解决?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
豆包 AI 助手文章总结
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号