使用Lua脚本在Redis中编辑JSON对象。

我想在从Redis服务器返回之前编辑我的json对象, 在我的Redis服务器中,我有4个密钥:

user:1 {"Id":"1","Name":"Gholzam","Posts":"[]"}
user:1:post:1 {"PostId":"1","Content":"Test content"}
user:1:post:2 {"PostId":"2","Content":"Test content"}
user:1:post:3 {"PostId":"3","Content":"Test content"}

我想通过lua脚本获取这个上下文,怎么做?:

{"Id":"1","Name":"Gholzam","Posts":"[{"PostId":"1","Content":"Test
content"},{"PostId":"1","Content":"Test
content"},{"PostId":"1","Content":"Test content"}]}
点赞
用户23354
用户23354

客户端的选择并不重要;重要的是:找出数据存储的方法。你说你有4个键,但对于给定的user:1,我们如何知道对应的帖子并不明显。常见的方法包括:

  • 有一个名为user:1:posts(或类似)的_set_,其中包含完整的键(user:1:post:1等)或相对键(1等)。
  • 有一个名为user:1:posts(或类似)的_hash_,其中包含按其ID键入的帖子。

我倾向于使用后一种方法,因为它更直接 - 所以我可能会有:

  • user:1,一个字符串,内容为{"Id":"1","Name":"Gholzam","Posts":"[]"}

  • user:1:posts,哈希,有3对:

    • 键为1,值为{"PostId":"1","Content":"Test content"}
    • 键为2,值为{"PostId":"2","Content":"Test content"}
    • 键为3,值为{"PostId":"3","Content":"Test content"}

然后你可以使用hgetallhvals轻松获取帖子。

第二部分是如何在服务器上操作json。好消息是redis通过cjson提供了对内部lua的json工具的访问。

我既不是cjson也不是lua的专家;但是,坦率地说我的建议是:不要这样做。在我看来,如果让redis集中于其擅长的存储和检索工作,那么它的效果最好。你可能可以迎合自己的心意来使用它,但我很想在redis之外执行任何json操作。

2014-08-14 15:54:24