3

如果 Redis 记录是从其中包含列表的 JSON 对象中设置的,那么以后可以在该列表上使用 LPUSH 命令来更新它吗?(在 node.js 上使用 redis)谢谢

4

1 回答 1

8

不,Redis 与格式无关。它无法解析 JSON,也不是面向文档的数据库。

LPUSH 仅适用于 Redis 列表对象。

然而,使用 Lua Redis 2.6 服务器端脚本功能可以完成的是一个脚本来解码 JSON 对象、添加项目、编码回对象并存储它。

例如,使用以下 JSON 对象:

set users:1 "{\"id\":1,\"name\":\"Rocco\",\"age\":50,girlfriends:[\"Ulla\"]}"

添加新女友可以使用eval 命令在一个操作中实现:

eval "local t = cjson.decode( redis.call('get',KEYS[1] ))
  if t.girlfriends then
     table.insert(t.girlfriends,ARGV[1])
  else
     t.girlfriends = {ARGV[1]}
  end
  return redis.call('set',KEYS[1], cjson.encode(t))
" 1 user:1 Augusta

另一种可能性是避免将 JSON 对象直接存储在 Redis 中,而是编写一个层将 JSON 对象转换为多个 Redis 键(将列表部分隔离在其特定键中)。

例如:

 { "id":1, "name": "Rocco", "age":50,
  girlfriends: [ "Ulla", "Bella", "Josepha", "Isabella" ] }

可以存储为:

 HMSET users:1:info name Rocco age 50
 RPUSH users:1:girlfriends Ulla Bella Josepha Isabella

这种方法的主要好处是性能和部分更新支持。主要缺点是失去了一些灵活性,并且转换代码编写起来可能很乏味。

于 2012-05-01T11:56:58.150 回答