Redis中可替代嵌套结构的方法?

4

我不断遇到的情况是我需要存储比 Redis 简单数据结构所能容纳更为复杂的信息。我仍然想使用 Redis,但我想知道在理想情况下人们希望使用嵌套结构时是否有任何标准的替代方案?

2个回答

11

您基本上有两种策略:

  • 您可以将复杂的对象序列化并以字符串形式存储。我们建议使用json或msgpack作为序列化格式。这很容易从大多数客户端语言中操作。如果需要服务器端访问,则服务器端Lua脚本可以轻松地对此类对象进行编码/解码,因为Redis已经编译了用于Lua的msgpack和json支持。

  • 您可以将对象拆分成不同的键。而不是将user:id和与该id相关的复杂数据结构存储在一起,您可以存储多个键,例如user:id、user:id:address_list、user:id:document_lists等。如果需要原子性,可以使用管道MULTI/EXEC块来保证数据一致性并聚合回路。

在此答案中查看一个简单的示例:

LPUSH命令是否适用于从JSON初始化的记录?

最后,Redis不是面向文档的数据库。如果您确实拥有大量复杂的文档,也许您可以通过MongoDB、ArangoDB、CouchDB、Couchbase等解决方案更好地服务。


3
当您需要修改对象时,将复杂对象序列化为字符串并保存到Redis非常低效。因为您必须将字符串取回客户端,将其反序列化为对象,进行修改,再次将其序列化为字符串,并将其保存回Redis。太麻烦了...
现在是2019年,有一些新的Redis模块可以使Redis支持嵌套数据结构,例如RedisJSONredis-protobuf
免责声明:我是redis-protobuf的作者,因此我将在这个模块上给出一些例子。另外,redis-protobuf比RedisJSON更快,更节省内存,因为它使用二进制格式而不是文本格式来序列化/反序列化数据。
首先,您需要在Protobuf格式中定义嵌套数据结构并将其保存到本地文件中:
syntax = "proto3";

message SubMsg {
    string s = 1;
    int32 i = 2;
}

message Msg {
    int32 i = 1;
    SubMsg sub = 2;
    repeated int32 arr = 3;
}

然后在redis.conf中使用以下配置加载模块:
loadmodule /path/to/libredis-protobuf.so --dir proto-directory

之后,您可以读取和编写嵌套的数据结构:
PB.SET key Msg '{"i" : 1, "sub" : {"s" : "string", "i" : 2}, "arr" : [1, 2, 3]}'
PB.SET key Msg.i 10
PB.GET key Msg.i
PB.SET key Msg.sub.s redis-protobuf
PB.GET key Msg.sub.s
PB.SET key Msg.arr[0] 2
PB.GET key Msg.arr[0]

请查看 doc 以获取详细信息。如果您在使用 redis-protobuf 时遇到任何问题,请随时告诉我

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接