ServiceStack Redis,如何以列表形式返回Lua表

2024-02-25

我正在使用 ServiceStack 的 Redis 客户端。我有一个 Lua 脚本,它使用多个 Redis 调用的结果填充 Lua 表。我想以某种方式返回这张表。我的想法是使用客户端库中的 ExecLuaShaAsList 方法,并在 lua 脚本中执行“return myTable”。这不起作用,我总是得到一个空列表。

如何将lua表返回给redis客户端?

这是我与 Redis 客户端一起使用的 C# 脚本:

using (var redisClient = GetPooledRedisClient())
{
    var sha1 = redisClient.LoadLuaScript(luaBody);
    List<string> theList = redisClient.ExecLuaShaAsList(sha1);
    int listLength = theList.Count(); //listLength is always 0 for some reason
}

根据以下答案的提示进行更新

LuaBody 是这样创建的:

    private string GetLuaScript(List<CatalogItem> categories, List<CatalogItem> products)
    {
        string categoriesToAggregate = string.Join("\",\"", categories.Select(c=>c.Name));
        categoriesToAggregate = "\"" + categoriesToAggregate + "\"";

        string csSearchResult = string.Join("\",\"", products.Select(c => c.Name));
        csSearchResult = "\"" + csSearchResult + "\"";


        StringBuilder sb = new StringBuilder();
        sb.AppendLine("local categoriesToAggregate = {").Append(categoriesToAggregate).Append("}                        ");
        sb.AppendLine("local csSearchResult = {").Append(csSearchResult).Append("}                                      ");
        sb.AppendLine("local result = {}                                                                                ");
        sb.AppendLine();
        sb.AppendLine("for i=1,#categoriesToAggregate do                                                                ");
        sb.AppendLine(" result[categoriesToAggregate[i]] = 0                                                            ");
        sb.AppendLine();
        sb.AppendLine(" for j=1,#csSearchResult do                                                                      ");
        sb.AppendLine("     local fieldValue = redis.call('hget', 'asr:'..csSearchResult[j], categoriesToAggregate[i])  ");
        sb.AppendLine("     if fieldValue then                                                                          ");
        sb.AppendLine("         result[categoriesToAggregate[i]] = result[categoriesToAggregate[i]] + fieldValue        ");
        sb.AppendLine("     end                                                                                         ");
        sb.AppendLine(" end                                                                                             ");
        sb.AppendLine("end                                                                                              ");
        sb.AppendLine();
        sb.AppendLine("return cjson.encode(result)                                                                      ");

        return sb.ToString();
    }

从 Lua 中,您需要返回一个 Lua 数组,或者一个 JSON 对象。 'myTable' 听起来像是一个只在 Lua 解释器内部有效的句柄。该句柄在调用后立即被清除,因此不会传播到客户端。

编辑:一个简单的 Lua 表/数组应该是支持的 http://redis.io/commands/eval。不看剧本就不知道发生了什么。

另请参阅此SOlink https://stackoverflow.com/questions/21718277/is-it-possible-to-call-lua-functions-defined-in-other-lua-scripts-in-redis/21921721#21921721有关 Lua 脚本原子性的一些额外信息。

希望这有帮助,TW

编辑OP后:

这是OP的原始Lua脚本:

local a={}
for i = 1, 1, 1 do
  a["47700415"] = redis.call('hget', 'asr:47700415', 'MDEngines')
  a["47700415_000"] = redis.call('hget', 'asr:47700415_000', 'MGEngines')
end
return a

Answer:您不能在 Lua 返回值中返回嵌套值。从 ServiceStack 函数中可以看到,Lua 脚本返回一个列表,并且列表不是嵌套的。

这里有两种解决方案,一种使用 JSON 的解决方案带来了轻微的开销(但在编程时可能更容易,并且是零安全的)。

一:使用cjson

local a={}
for i = 1, 1, 1 do
  a["47700415"] = redis.call('hget', 'asr:47700415', 'MDEngines')
  a["47700415_000"] = redis.call('hget', 'asr:47700415_000', 'MGEngines')
end
return cjson.encode(a)

MsgPack http://msgpack.org/也是一种非常漂亮且紧凑的序列化格式(我们经常使用它),并且可以像这样返回:

a-alt:使用 cmsgpack

return cmsgpack.pack(a)

b:使用简单数组

local a={}
for i = 1, 1, 1 do
  a[1] = "47700415"
  a[2] = redis.call('hget', 'asr:47700415', 'MDEngines')
  a[3] = "47700415_000"
  a[4] = redis.call('hget', 'asr:47700415_000', 'MGEngines')
end
return a

这将返回:

a:

tw@srv-flux-02:~$ redis-cli -p 14312 EVAL "$(cat ~/tw_luatest.lua)" 0 0
"{\"47700415\":\"Hello\",\"47700415_000\":\"World\"}"

b:

tw@srv-flux-02:~$ redis-cli -p 14312 EVAL "$(cat ~/tw_luatest2.lua)" 0 0
1) "47700415"
2) "Hello"
3) "47700415_000"
4) "World"

正如你所看到的,我在其中放入了一些虚拟数据HSET.

我还可以推荐这个链接,其中有一些不错的信息:Redis 程序员的 lua 简介 http://www.redisgreen.net/blog/2013/03/18/intro-to-lua-for-redis-programmers/

可以看到一种向 Lua 字典添加值的好方法here https://stackoverflow.com/questions/6399730/efficient-index-type-operations-in-redis?rq=1 :

local fkeys = redis.call('sinter', unpack(KEYS))
local r = {}
for i, key in ipairs(fkeys) do
  r[#r+1] = redis.call('hgetall',key)
end
return r
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ServiceStack Redis,如何以列表形式返回Lua表 的相关文章

  • 用于嵌入式服务器的 Web 技术

    我最近开始了一个针对嵌入式设备的新 Web 开发项目 并希望征求一些有关使用技术的建议 该设备将提供 HTML 页面 其中包括用于从 JSON 服务器检索数据的 AJAX 代码 我们暂时使用 Cherokee 作为 Web 服务器 但我们并
  • corona sdk中拖动物理对象

    我尝试在场景中拖动重力 0 0 的动态主体 我有一个主体类型为动态的正方形 以及一个主体类型为静态的图像 但是当将方形拖动到图像上时 它会产生一点力 但是可以超出图像并传递到另一边 如图所示 这是我拖动正方形的代码 local functi
  • 如何批量删除Redis中数十万个带有特殊字符的key

    我们有一个包含数十万个 Redis 键的列表 其中包含各种特殊字符 我们希望批量删除它们 对于这个问题上的类似问题 有一些很好的答案 如何使用 Redis 自动删除与模式匹配的键 https stackoverflow com questi
  • 如何在 Lua 中实现 OO?

    Lua 没有内置对 OO 的支持 但它允许您自己构建它 您能否分享一些实现面向对象的方法 请为每个答案写一个例子 如果您有更多示例 请发布另一个答案 我喜欢将 OOP 视为容器 对象 内的数据封装以及可以使用该数据完成的操作子集 还有很多内
  • Lua :: 如何编写加载多个CPU的简单程序?

    我还无法用 Lua 编写一个可以加载多个 CPU 的程序 自从Lua通过协程支持这个概念 http www lua org pil 9 4 html 我相信这是可以实现的 我失败的原因可能是以下之一 这在Lua中是不可能的 我写不出来 an
  • 在lua中组合两个函数

    我刚开始学习lua 所以我的要求可能是不可能的 现在 我有一个接受函数的方法 function adjust focused window fn local win window focusedwindow local winframe w
  • Redis SYNC 套接字上的错误情况:连接被拒绝

    在我的 django 应用程序中使用 celery 和 redis 一切都工作正常 直到我遇到了问题 redis 文件的位置已更改 redis 无法访问它们 经过查找 原来这是由于网络随机攻击造成的 需要添加confg 我添加文件后 一段时
  • socket.io 广播功能 & Redis pub/sub 架构

    如果有人能帮助我解决一个小疑问 我将不胜感激 使用socket io广播功能和在Redis上使用pub sub设计架构有什么区别 例如 在另一个示例中 node js 服务器正在侦听 socket io 针对 键 模型 todo 和值 数据
  • 在Lua中获取前一天的日期

    谁能告诉我如何使用 Lua 获取 YYYY MM DD 格式的前一天日期 即 一个片段 它将返回运行当天的前一天的日期 Try print os date Y m d os time 24 60 60 严格来说 这只能保证在 POSIX 系
  • 安装Lua套接字库

    要么我太累了 要么我瞎了 我想学习 Lua 网络 因此我必须安装socketlib 所以我可以轻松地要求它 但我不知道我应该 要求 哪些文件 例子说 local socket require socket 但正如我所说 如果我使用 我不知道
  • Node Js:Redis 作业在完成其任务后未完成

    希望你们做得很好 我在我的 Nodejs 项目中实现了 BullMQ Bull 的下一个主要版本 来安排发送电子邮件的作业 例如 发送忘记密码请求的电子邮件 所以 我编写了如下所示的代码 用户服务 await resetPasswordJo
  • Lua 将字符串转换为数字 - 取决于语言环境

    刚刚注意到字符串 and tonumber 在 Lua 中是依赖于语言环境的 知道如何在不使用的情况下将字符串转换为数字tonumber 谢谢 例如将字符串 58 5 转换为 58 5 另外 当我尝试将带点的数字传递给函数时 该函数会转换
  • Redis是如何实现高吞吐量和高性能的?

    我知道这是一个非常普遍的问题 但是 我想了解允许 Redis 或 MemCached Cassandra 等缓存 以惊人的性能极限工作的主要架构决策是什么 如何维持连接 连接是 TCP 还是 HTTP 我知道它完全是用C写的 内存是如何管理
  • 如何使用 srlua 制作可执行的 Lua 脚本?

    我的主要目标是使我的 lua 文件成为可执行文件或使其成为咬代码 最好是两者皆有 我正在尝试 srlua 但在自述文件中它告诉我要做的事情 对于Windows 您需要首先创建srlua exe和glue exe 然后为每个 你想把Lua程序
  • 使用 Celery 通过 Gevent 进行实时、同步的外部 API 查询

    我正在开发一个 Web 应用程序 该应用程序将接收用户的请求 并且必须调用许多外部 API 来编写对该请求的答案 这可以直接从主 Web 线程使用 gevent 之类的东西来扇出请求来完成 或者 我在想 我可以将传入的请求放入队列中 并使用
  • StackExchange.Redis的正确使用方法

    这个想法是使用更少的连接和更好的性能 连接会随时过期吗 对于另一个问题 redis GetDatabase 打开新连接 private static ConnectionMultiplexer redis private static ID
  • Openresty 中的并发模型是什么?

    我很难理解 openresty 或 nginx 的并发模型 我读了Lua变量作用域 http wiki nginx org HttpLuaModule Lua Variable Scope 它解释了变量的生命周期 但它没有说明对它们的并发访
  • 为什么Redis中没有有序的hashmap?

    Redis 数据类型 http redis io topics data types包括排序集 http redis io topics data types intro sorted sets以及其他用于键值存储的必要数据结构 但我想知道
  • 如何在lua中获取shell脚本的返回码?

    我正在lua中执行一个脚本 os execute sh manager scripts update system sh f 我想获得脚本的输出 如果退出状态为 7 则返回 7 I tried local output os execute
  • 想要在后台不间断地运行redis-server

    我已经下载了 redis 2 6 16 tar gz 文件并安装成功 安装后我运行 src redis server 它工作正常 但我不想每次都手动运行 src redis server 而是希望 redis server 作为后台进程持续

随机推荐

  • 如何使用 Java 将文件传递给 Jenkins

    我创建了一个参数化的 Jenkins 作业 我将变量从 Java 传递给它 这是Java final HttpClient client new HttpClient final PostMethod buildMethod new Pos
  • 如何在 Hive 中使用日期按周动态分区表

    有一个 结果 表 其中包含 ID 和日期列 创建表结果 Id int 日期字符串 行格式分隔字段以 结尾 存储为文本文件 Id Date 11 2012 04 06 12 2012 05 08 13 2013 02 10 14 2013 0
  • 获取核心数据关系中的对象数量

    我有一个带有食谱的表格视图 用户可以添加和删除配方 单击菜谱时 会推送另一个表格视图 并显示配料 同样 用户可以添加和删除成分 配方和成分之间存在 oneToMany 关系 我想显示配方表视图行中的成分数量 我知道如何在界面生成器中使用行进
  • 将运算符 new(sizeof(T) * N) 返回的内存视为数组

    在 C 中 可以使用以下方式分配动态数组malloc sizeof T N 然后使用指针算术获取此动态数组中位于 i 偏移量的元素 在 C 中 可以使用类似的方法operator new 在相同的方式malloc 然后放置新的 例如 可以在
  • StringTemplate 缩进在 String 内添加空格

    这显然是一个SSCCE 我有以下模板文件 xml value lt lt a b value b a gt gt 使用以下代码 private static final String VALUE alpha nbeta public sta
  • Julia 中的特征分解比 Mathematica 慢 5 倍?

    我是 Julia 的新手 主要在 Mathematica 工作 所以我可能会犯一些基本的错误 我尝试计算 Julia 计算随机矩阵的特征系统所花费的时间 发现它比 Mathematica 慢 5 6 倍 在朱莉娅 D 1000 rand 1
  • 如何将自定义 RESTful 路由添加到 Rails 应用程序?

    我正在读这两页 resources http api rubyonrails org classes ActionController Resources html M000522 Adding more RESTful actions h
  • Python WWW 宏

    我需要类似 iMacros for Python 的东西 如果有这样的东西那就太好了 browse to www google com type in input search query click button search list
  • Matlab FFT 和 FFTW

    我正在尝试使用 FFTW 和 Matlab 进行相同的 FFT 我使用 MEX 文件来检查 FFTW 是否良好 我认为我的一切都是正确的 但是 我从 FFTW 得到荒谬的价值观 在同一输入信号上多次运行 FFTW 代码时 我没有得到相同的结
  • 如何在单个端口上同时运行tcp和udp?

    我遇到过这样的情况 我必须一次在一个端口上运行 UDP 和 TCP 这是因为在我的应用程序中任何人都可以随时调用任何协议 所以我需要不断检查传入的请求并服务该请求 谁能帮我摆脱java中的这种情况吗 您无法检查请求是 TCP 还是 UDP
  • React-Redux-Thunk:操作不返回调度

    我正在使用 React Native 和 Redux thunk 中间件 我的问题是调度函数不返回对象 甚至不控制台 这是我的操作文件 function movieSelc movie return type types MOVIE SEL
  • Lua:特定长度的字符串

    local data here is a string local no 12 foo string format 50s 05d data no print foo len string format q foo defines foo作
  • Intellij 有时无法为对象堆保留足够的空间

    已解决 检查下面的解决方案 我使用的是 Intellij Idea 2017 2 2 以下是我的 Intellij 规格 我的 Intellij 仅偶尔会在 Maven 构建失败或 jboss 服务器启动时出现错误 Error occurr
  • 所有 css 字体属性的一个 css 声明

    将所有 css 字体属性放入一个值的正确语法是什么 body font 12px arial red 类似的东西 但具有所有选择器和属性 body font bold italic 15px 20px arial sans serif co
  • jQuery 动画滚动

    我不知道如何调用该效果 但是有人可以向我指出一个可以帮助我实现与该网站相同的效果的库吗 http www makr com http www makr com 基本上 当鼠标单击时 它会将行向上移动到页面顶部 如果没有这样的专门效果库 代码
  • Instagram api - 按主题标签获取所有照片

    我是这个 Instagram API 的新手 我阅读了他们关于端点的文档 这是我正在使用的端点 v1 tags tag name media recent access token ACCESS TOKEN 它正在获取图像 但是 仅在我的帐
  • HTML 文档中的非 HTML 标签对 SEO 不利吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 页面中包含非 HTML 标签是一种不好的做法吗 我需要将它们用于内部内容处理需求 并想知道它是否有任何问题 例如 SEO 是的 这很糟糕
  • 动态导入,不带捆绑文件

    我有一个与 Webpack 捆绑在一起的 React 项目 我有一个组件 我希望它动态渲染组件 就我而言 组件的路径来自 props 另外 这些组件没有捆绑在我的项目 js 文件中 它们是外部 React 组件 库 我尝试过动态 ES6 导
  • 除非是纯文本,否则 SVG 外来对象内容不会显示

    我正在尝试使用 SVG 绘图中的foreignObject 标签输出 HTML 我正在使用 d3 生成元素 只有当foreignObect 标签内的内容是纯文本时 foreignObject 标签内的HTML 内容才会显示 否则它只会显示为
  • ServiceStack Redis,如何以列表形式返回Lua表

    我正在使用 ServiceStack 的 Redis 客户端 我有一个 Lua 脚本 它使用多个 Redis 调用的结果填充 Lua 表 我想以某种方式返回这张表 我的想法是使用客户端库中的 ExecLuaShaAsList 方法 并在 l