【问题标题】:Use Multiple DBs With One Redis Lua Script?通过一个 Redis Lua 脚本使用多个数据库?
【发布时间】:2013-05-29 15:20:59
【问题描述】:

是否可以让一个 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


    【解决方案1】:

    将相关数据放在不同的 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 脚本都必须在最后重置当前数据库(即使在以前的错误的情况下),所以它会使复杂的脚本变得繁琐和尴尬。

    【讨论】:

    • 我也有类似的要求。我在想,如果一种数据进入 db1 而另一种进入 db2,那么我在 db2 或 db1 中搜索/redis-scan 数据会更好,而不必遍历两个数据库的所有键。对吗?
    • 查找的性能大致相同。扫描将大大改善。但是如果你使用 Redis 来扫描数据,也许你需要另一个数据存储...... Redis 显然不是为它设计的。
    猜你喜欢
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 2021-10-27
    • 1970-01-01
    相关资源
    最近更新 更多