我看到了这个pass results to another command in redis,并且使用了via命令行,这个命令很好用:
src/redis-cli keys '*' | xargs src/redis-cli mget然而,我们如何才能通过生菜达到同样的效果(我开始尝试4.0.2最后)
另外,在以下情况下,解决这一问题特别重要:
假设我们使用的是地理定位功能,并使用GEOADD添加了一组“我的位置-类别”的位置。
GEOADD "category-1" 8.6638775 49.5282537 "location-id:1" 8.3796281 48.9978127 "location-id:2" 8.665351 49.553302 "location-id:3"接下来,假设我们做了一个GeoRadius,在8.6582361 -1类的10公里半径范围内得到8.6582361 49.5285495的位置。
现在,当我们得到“位置-id:1”和“位置-id:3”时
考虑到我已经为上面的键设置了值“location:1”和“location:3”
我想管道命令来做GEORADIUS以及做mget对所有匹配的结果。
Redis提供了这样的功能吗?
和/或如何通过莴苣客户端库实现这一点,而无需首先手动迭代GEORADIUS的结果,然后执行手动mget。
对于使用它的程序来说,这将是更有效的性能。
有人知道我们该怎么做吗?
更新--这是我前面讨论的场景的管道命令:
src/redis-cli GEORADIUS "category-1" 8.6582361 49.5285495 10 km | xargs src/redis-cli mget现在我们需要知道如何通过生菜来做这件事。
发布于 2015-12-16 23:47:52
在深入研究Lua脚本之后,我的结论是,按照Itamar的建议,只有通过Lua脚本才能以这种方式消除往返。
最后,我创建了一个lua脚本文件(myscript.lua),如下所示
local locationKeys = redis.call('GEORADIUS', 'category-1', '8.6582361', '49.5285495', '10', 'km' )
if unpack(locationKeys) == nil then
return nil
else
return redis.call('MGET', unpack(locationKeys))
end**我们当然应该发送参数.这只是一个poc :)
现在您可以通过命令执行它了。
src/redis-cli EVAL "$(cat myscript.lua)" 0然后,为了减少将整个脚本发送到Redis执行的网络开销,我们可以选择向Redis注册脚本。
Redis将为该脚本的未来引用提供一个sha1摘要代码,可用于对该脚本的下一次调用。
这可以按以下方式进行:
src/redis-cli SCRIPT LOAD "$(cat myscript.lua)"这应该返回一个sha1代码,如下所示:49730a2ed3034ee48f818e486tpbdf1b500b19e
接下来的调用可以使用下面的代码完成
src/redis-cli evalsha 49730aa2ed3034ee48f818e486b2bdf1b500b19e 0然而,令人悲哀的是,只有在redis实例运行时,sha1摘要才会被记住。如果重新启动,sha1摘要将丢失。然后再次执行脚本加载。如果脚本中没有任何变化,那么sha1 1摘要代码将是相同的。
理想情况下,当通过客户端api使用时,我们应该首先尝试evalsha,如果这返回了一个“没有匹配的脚本”错误,然后作为回退做脚本加载,并再次获取sha1代码,并创建一个内部映射,并使用该sha1代码进行进一步的调用。
这完全可以通过生菜来完成。我能找到解决这些的方法。希望这能为这个问题的解决方案提供一个很好的见解。
https://stackoverflow.com/questions/34240338
复制相似问题