“我们可能会反对并最终删除交易”和“你可以用Redis交易做的一切,你也可以用脚本做”
http://redis.io/topics/transactions
但真的吗?我看到了一个问题。
http://redis.io/commands/eval
我看到的EVAL的问题是,您无法在脚本中获取这些变量的状态,也无法根据这些变量的状态进行唯一的写入。同样:“在给定相同的输入数据集的情况下,脚本总是用相同的参数计算相同的Redis写命令。”因此,生成的写操作已经确定(从第一次运行开始缓存),EVAL脚本并不关心脚本中的GET值是什么。唯一能做的就是在调用EVAL之前对这些变量执行GET,然后将这些变量传递给EVAL脚本,但问题是:现在调用GET和调用EVAL之间存在原子性问题。
换句话说,所有的变量,你会为一个事务做一个观察,在EVAL的情况下,你需要得到这些变量,然后把它们传递给EVAL脚本。因为在脚本实际启动之前,脚本的原子性质是不能保证的,而且您需要在调用EVAL启动脚本之前获取这些变量,这就留下了一个空间,这些变量的状态可以在GET和将它们传递给EVAL之间发生变化。因此,对于一组非常重要的用例,WATCH所具有的原子性保证在EVAL中是没有的。
那么,当交易会导致重要的Redis功能丢失时,为什么会有反对交易的言论呢?或者实际上有一种方法可以用我还不明白的EVAL脚本来做到这一点?或者是否有计划的功能可以为Eval解决这个问题?(假设的例子:如果他们让WATCH与EVAL的工作方式与WATCH与EXEC的工作方式相同,那么这可能会起作用。)
对此有解决办法吗?或者我应该理解Redis从长远来看可能不是完全安全的交易?
的确,lua脚本可以做任何事务,但我不认为Redis事务会消失。
EVAL脚本不允许查看变量
当eval脚本运行时,其他任何内容都不能并发运行。因此,watch
ing变量是毫无意义的。您可以确定,一旦您阅读了脚本中的值,就没有其他人修改了这些变量。
问题内容: 我有一个简单的Lua脚本: 为什么此脚本阻止Redis服务器?如果我在另一个控制台命令中运行,例如:设置测试1,结果: 问题答案: Redis是单线程的。每个命令都会阻止它。也是命令,因此它会阻止redis。
主要内容:第一个Lua脚本命令,为什么使用Lua脚本,常用脚本命令,基本命令应用从 Redis 2.6 版本开始,Redis 使用内置的 Lua 解释器执行脚本,这意味着我们可以直接在 Redis 客户端执行Lua 脚本 ,于此同时 Redis 还非常贴心地提供了用于编写 Lua 脚本的 命令。 第一个Lua脚本命令 Lua 是一种轻量小巧、开源的脚本语言,用标准 C语言编写。其设计目的就是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。它被广泛的应用于:游戏开发
问题内容: 我在运行Lua脚本时遇到问题,这是我在做什么: 我使用LOAD SCRIPT将脚本加载到Redis,并获取脚本的SHA。 我用SHA测试脚本,没关系。 我执行了SAVE(BGSAVE),SHUTDOWN并再次运行redis服务器,但是我无法使用SHA执行脚本,而我以前可以这样做。 为什么是这样 ? 问题答案: Redis不会保存或存储服务器端Lua脚本。它们与您在RDBMS中可以找到的
问题内容: 从Redis调用Lua脚本时,可以在两个数组中传递值:KEYS和ARGV。有什么区别?Redis如何处理KEYS数组中的值?如果在我的脚本中必须使用运行时动态生成的密钥怎么办? 问题答案: 您的所有问题都会在页面上得到回答,但是自从您问到…: 有什么区别? 用于传递键名称,而应用于其他任何名称。这不是完全强制执行的(即,大多数情况下您可以将它们混合使用),但如果不遵循,可能会导致潜在的
问题内容: 我创建了一个redis lua脚本来执行基于关键数据类型的命令: 每次执行时,它都会返回null。请帮助纠正脚本。 问题答案: 对响应的返回形式如下表:(如果类型为字符串,则返回) 因此,为了正确检查,您应该将代码更改为: 其余代码将正常运行。 问题是这样的:TYPE命令是少数几个返回“简单字符串”或“状态” redis答复的命令之一(有关响应类型,请参见redis协议规范)。在red
Lua 脚本功能是 Reids 2.6 版本的最大亮点, 通过内嵌对 Lua 环境的支持, Redis 解决了长久以来不能高效地处理 CAS (check-and-set)命令的缺点, 并且可以通过组合使用多个命令, 轻松实现以前很难实现或者不能高效实现的模式。 本章先介绍 Lua 环境的初始化步骤, 然后对 Lua 脚本的安全性问题、以及解决这些问题的方法进行说明, 最后对执行 Lua 脚本的两