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

通过一个Redis Lua脚本使用多个DB?

子车芷阳
2023-03-14
问题内容

是否可以使一个Redis Lua脚本命中多个数据库?我目前在DB 0中拥有一种类型的信息,而在DB
1中具有另一种类型的信息。我的正常工作流程是基于API调用以及来自DB 0的元信息对DB 1进行更新。
Lua脚本,但无法弄清楚如何打多个数据库。我正在使用redis-py在Python中执行此操作:

lua_script(keys=some_keys,
           args=some_args,
           client=some_client)

由于客户端暗示一个特定的数据库,所以我被困住了。有想法吗?


问题答案:

将相关数据放入不同的Redis数据库通常是一个错误的想法。与通过键命名约定定义名称空间相比几乎没有好处(没有关于安全性,持久性,过期管理等的额外粒度)。一个主要的缺点是客户端必须手动处理正确数据库的选择,这对于同时针对多个数据库的客户端来说很容易出错。

现在,如果您仍想使用多个数据库,则有一种方法可以使其与redis-py和Lua脚本一起使用。

由于底层线程安全的连接池实现,redis-
py没有为SELECT命令定义包装器(通常用于切换当前数据库)。但是没有什么可以阻止您从Lua脚本调用SELECT的。

考虑以下示例:

$ redis-cli
SELECT 0
SET mykey db0
SELECT 1
SET mykey db1

以下脚本在同一客户端连接的2个数据库中显示mykey的值。

import redis

pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
r = redis.Redis(connection_pool=pool)

lua1 = """
   redis.call("select", ARGV[1])
   return redis.call("get",KEYS[1])
"""
script1 = r.register_script(lua1)

lua2 = """
   redis.call("select", ARGV[1])
   local ret = redis.call("get",KEYS[1])
   redis.call("select", ARGV[2])
   return ret
"""
script2 = r.register_script(lua2)

print r.get("mykey")
print script2( keys=["mykey"], args = [1,0] )
print r.get("mykey"), "ok"
print
print r.get("mykey")
print script1( keys=["mykey"], args = [1] )
print r.get("mykey"), "misleading !!!"

脚本lua1天真:它只是在返回值之前选择一个给定的数据库。它的用法具有误导性,因为执行后,与该连接关联的当前数据库已更改。不要这样

脚本lua2更好。它以目标数据库和当前数据库为参数。它确保在脚本结束之前重新激活当前数据库,以便在连接上应用的下一个命令仍在正确的数据库中运行。不幸的是,在Lua脚本中没有命令来猜测当前数据库,因此客户端必须系统地提供它。请注意,无论发生什么情况(即使出现先前的错误),Lua脚本都必须在最后将当前数据库重置,因此它会使复杂的脚本变得笨拙而笨拙。



 类似资料:
  • 我有两个脚本和。脚本调用时返回一个随机数。我想从并打印所有这些返回值。换句话说,脚本如下所示: 现在我有以下代码在 但是,我收到的错误是,。我将如何着手完成这项任务?

  • 脚本会计算所有车辆识别号重复的次数 例如,如果VIN编号重复5次,则意味着将有五个零件到达,因此下一步是检查到达列中的VIN,如果有5个“是”值,则 (重复VIN编号)5/5(是”值的数量) 将触发它将[Master]选项卡零件订单列更改为“是”对于特定的VIN编号。 用户将手动更新[零件]选项卡,到达列时使用“是”或留空。(如果空白,则部分未到达。) 请参阅google工作表模板的链接:http

  • 我想创建一个函数“palindromes()”来检查一个值是否是回文(向前和向后拼写相同)。为了做到这一点,我创建了4个函数,这些函数: 使所有字母变小 删除所有非字母字符 反转接下来的数组,最后... 检查该数组是否是回文。 参见以下功能: 我如何确保函数“palindromes()”取一个值,并在所有这些函数中运行它,最终给出该值是否为回文的答案(真或假)? 问候你,贝尼

  • 问题内容: 我有一个复杂的gradle脚本,该脚本封装了围绕将多个netbeans项目构建和部署到许多环境的功能。 该脚本可以很好地运行,但是从本质上来说,它是通过六个包含项目和环境信息的地图进行配置的。 我想将任务抽象到另一个文件中,以便可以在一个简单的构建文件中简单地定义地图,然后从另一个文件中导入任务。这样,我可以对多个项目使用相同的核心任务,并使用一组简单的地图来配置这些项目。 谁能告诉我

  • 第一个shell脚本 编写 打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚本,扩展名就用php好了。 输入一些代码,第一行一般是这样: #!/bin/bash #!/usr/bin/php “#!”是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行。 运行 运行Shell脚本有两种方法: 作为可执行程序

  • 我有这样的设置: 所有.飞镖只是导入脚本1.飞镖和脚本2.dart并调用它们的主要。目标是在细节下有一堆可以单独运行的脚本。此外,我想要一个单独的 all.dart 脚本,可以一次运行所有脚本。这将使调试单个脚本更简单,但仍允许所有脚本运行。 all.dart 脚本1.飞镖 脚本2.dart 所以,这是工作,我看到运行时预期的打印语句all.dart但我有两个问题。 首先,我必须在详细信息下软链接