当前位置: 首页 > 面试题库 >

您是否需要在Redis脚本中提前声明密钥?

章青青
2023-03-14
问题内容

我的计划是将一些现有的Redis密钥存储在散列中,稍后再从Redis
Lua脚本中获取并采取行动。我读到,最好的做法是提供调用时脚本中使用的所有键EVAL

我的问题是,运行在运行时没有提供任何键EVAL,而是对从脚本 内部 获取的某些键进行操作的脚本是否安全?如果没有,后果是什么,如何避免这一缺点?

我提到在的时候EVAL,无法知道特定哈希中的键是什么。我可以在步骤之前的某个步骤中从哈希中获取所有键EVAL,然后将其提供给EVAL,但这听起来像是过分杀了。


问题答案:

由于文档中的含糊不清,这个问题被问了很多,但是我将借此机会尝试指定用于管理Redis脚本中键的使用的实际规则。

实际规则是这样的: 您的脚本只能访问驻留在单个服务器上的密钥,而Redis必须知道该服务器是什么,以便它可以将脚本路由到那里。

如果您不使用Redis Cluster,则将始终满足这些条件,因为只有一台服务器。

如果使用Redis Cluster,则必须至少指定一个密钥,并且脚本使用的所有密钥必须与指定的密钥位于同一服务器上。

因此,请回答您的问题:如果您不使用集群,您的脚本将可以正常工作。结果是,如果您以后切换到集群,它将无法正常工作,因为Redis不知道将脚本发送到哪里。

Redis也可能会更改为执行已记录的规则,从而使所有动态生成密钥的脚本无效。我认为这将是一个严重的错误,而且我认为这不会发生。但是,如果没有其他规定,则指定密钥对于文档很有用,因此,如果我碰巧事先知道密钥,我总是这样做。



 类似资料:
  • 问题内容: 我知道没有第一行就可以使用它,但实际上它经常包含在内。 是什么原因?没有它是否不安全? 我知道您也可以这样做: 但我说的是您需要一一添加项目的情况。 问题答案: 如果您未声明新数组,并且创建/更新数组的数据由于任何原因而失败,则将来尝试使用该数组的任何代码都将因为该数组不存在。 例如,如果未声明该数组且未添加任何值,将抛出错误。但是,如果数组只是空的,则不会发生任何错误,就像您声明它的

  • 问题内容: AFAIK,您无需在onclick中指定协议: 坏 好 今天,我在GoogleAnallytics上注意到他们正在使用它: 这个例子是完全错误的,还是有理由指定除?以外的其他内容? 问题答案: 这里的一些响应声称“javascript:”前缀是“过去的遗留物”,这意味着浏览器有意对它进行了特殊处理,以实现向后兼容。是否有确凿的证据证明是这种情况(有人检查过源代码)吗? 对我来说,它的意

  • 问题内容: 众所周知,Windows使用带反斜杠的路径,而Unix使用带反斜杠的路径。node.js提供了始终使用正确的斜杠。因此,例如,您不必编写Unix,而只编写Unix 。 但是,似乎存在这种差异,但是如果您不对路径进行规范化(例如,使用path.join),而仅编写诸如node.js之类的路径,则在Windows上运行脚本没有问题。 那么,有没有写上任何好处了?无论平台如何,两者似乎都可以

  • 我对Laravel很陌生,并使用这个答案为我的助手函数实现了服务提供者。 它建议: 在新生成的HelperServiceP的寄存器函数中rovider.php添加以下代码 然而,Laravel docs指出,register方法只能用于将内容绑定到容器中: 如前所述,在register方法中,您应该只将内容绑定到服务容器中。绝不应尝试在register方法中注册任何事件侦听器、路由或任何其他功能。

  • 作为一般规则,jasypt期望加密的配置参数出现在“enc(...)”的周围。 例如,在appconfig.properties文件中,我有以下属性:

  • 问题内容: 我想在我的JavaScript代码中包含几个JSON文件,这些文件与JavaScript源文件位于同一目录中。 如果我想包含另一个JavaScript文件,可以直接使用。现在,我正在使用和获取JSON,我认为这是执行此操作的丑陋方法。 是否有类似的要求,使我能够加载JSON文件? 问题答案: 从节点v0.5.x开始,是的,您可以像需要js文件一样要求JSON。 在ES6中: