栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

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

考虑以下示例:

$ redis-cliSELECT 0SET mykey db0SELECT 1SET mykey db1

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

import redispool = 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"printprint r.get("mykey")print script1( keys=["mykey"], args = [1] )print r.get("mykey"), "misleading !!!"

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

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/376690.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号