当前位置: 首页 > 知识库问答 >
问题:

Redis Lua脚本实现CAS(检查和设置)?

漆雕欣德
2023-03-14
local x=string.len(ARGV[1]);
if redis.call('GETRANGE', KEYS[1], 0, x-1) == ARGV[1] then
    redis.call('SET', KEYS[1], ARGV[2]);
    return 1;
    end;
return 0

下面是一个在前缀值为“bar”的键“foo”上调用脚本的示例(在redis-cli中):

eval "local x=string.len(ARGV[1]); if redis.call('GETRANGE', KEYS[1], 0, x-1) == ARGV[1] then redis.call('SET', KEYS[1], ARGV[2]); return 1; end; return 0" 1 foo bar barbazzle

我认为这种使用模式可能是这样的情况:您希望同时存储一个“Geofence令牌”和一个带有键的值...如果并发客户端持有正确的Geofence令牌,则允许它们尝试更新该值。

这看起来像是代替watch/multi/exec语义的安全使用模式吗?(似乎您可以获取当前值,在本地代码中拆分隔离令牌,构建一个新值,然后尝试随时更新密钥,使用似乎比watch/multi/exec调用更容易混淆的语义)。

共有1个答案

澹台镜
2023-03-14

根据Redis的文档,在原子性方面你会很好:

Redis使用相同的Lua解释器来运行所有命令。另外,Redis保证脚本以原子的方式执行:在执行脚本时不会执行其他脚本或Redis命令。这个语义类似于MULTI/exec的语义。从所有其他客户机的角度来看,脚本的效果要么仍然不可见,要么已经完成。

但是,如果脚本太慢,就会导致问题。因此,对于需要一些逻辑和原子性的轻操作来说,脚本是最好的。

例如:您有如下脚本:

redis.call('set', 'foo', 1)
redis.call('rpush', 'foo', 2)

脚本执行将返回错误,但是foo已经在redis中设置为1

与你的问题无关的事情:我注意到你用了

eval "your_raw_code" key_count keys argv
> redis-cli eval "$(cat path/to/script/script_name.lua)" key_count keys argv
 类似资料:
  • 问题内容: 我只是想了解Redis / Lua脚本,我想知道是否有人看到以下代码有问题。 我尝试实现非常简单的“ CAS”语义:使用单个键和两个参数来调用它。它将检查服务器上与该键关联的值是否 以 第一个参数 开头 ,如果是,则将设置键的新值设置为第二个参数并返回1,否则返回0;否则返回0。如果键与字符串以外的其他某种类型的数据相关联,则Redis将返回并返回错误,就像您对这样的键/值组合尝试执行

  • Booksleve是否支持CAS操作(即Redis WATCH命令)?例如,如何实现以下内容? 当多个线程试图用相同的数据修改相同的对象时,我需要这样做来避免竞争条件。

  • 本文向大家介绍Python脚本实现集群检测和管理功能,包括了Python脚本实现集群检测和管理功能的使用技巧和注意事项,需要的朋友参考一下 场景是这样的:一个生产机房,会有很多的测试机器和生产机器(也就是30台左右吧),由于管理较为混乱导致了哪台机器有人用、哪台机器没人用都不清楚,从而产生了一个想法--利用一台机器来管理所有的机器,记录设备责任人、设备使用状态等等信息....那么,为什么选择pyt

  • 本文向大家介绍python设置检查点简单实现代码,包括了python设置检查点简单实现代码的使用技巧和注意事项,需要的朋友参考一下 说检查点,其实就是对过去历史的记录,可以认为是log.不过这里进行了简化.举例来说,我现在又一段文本.文本里放有一堆堆的链接地址.我现在的任务是下载那些地址中的内容.另外因为网络的问题或者网站的问题,每次下载可能不会非常的成功.有可能出现断链或者socket异常错误。

  • 本文向大家介绍Shell脚本实现检查服务器安全状态(用户、登录IP、防火墙检查),包括了Shell脚本实现检查服务器安全状态(用户、登录IP、防火墙检查)的使用技巧和注意事项,需要的朋友参考一下 说明:大家平时对Linux服务器安全主要是对系统用户的检查,登陆服务器IP检查,以及防火墙状态检查! 1.需要把正确系统用户名存储在/root/liu_shell/local_user.txt文件中,然后

  • 本文向大家介绍对Python 网络设备巡检脚本的实例讲解,包括了对Python 网络设备巡检脚本的实例讲解的使用技巧和注意事项,需要的朋友参考一下 1、基本信息 我公司之前采用的是人工巡检,但奈何有大量网络设备,往往巡检需要花掉一上午(还是手速快的话),浪费时间浪费生命。 这段时间正好在学 Python ,于是乎想(其)要(实)解(就)放(是)双(懒)手。 好了,脚本很长又比较挫,有耐心就看看吧。