我不断遇到的情况是我需要存储比 Redis 简单数据结构所能容纳更为复杂的信息。我仍然想使用 Redis,但我想知道在理想情况下人们希望使用嵌套结构时是否有任何标准的替代方案?
我不断遇到的情况是我需要存储比 Redis 简单数据结构所能容纳更为复杂的信息。我仍然想使用 Redis,但我想知道在理想情况下人们希望使用嵌套结构时是否有任何标准的替代方案?
您基本上有两种策略:
您可以将复杂的对象序列化并以字符串形式存储。我们建议使用json或msgpack作为序列化格式。这很容易从大多数客户端语言中操作。如果需要服务器端访问,则服务器端Lua脚本可以轻松地对此类对象进行编码/解码,因为Redis已经编译了用于Lua的msgpack和json支持。
您可以将对象拆分成不同的键。而不是将user:id和与该id相关的复杂数据结构存储在一起,您可以存储多个键,例如user:id、user:id:address_list、user:id:document_lists等。如果需要原子性,可以使用管道MULTI/EXEC块来保证数据一致性并聚合回路。
在此答案中查看一个简单的示例:
最后,Redis不是面向文档的数据库。如果您确实拥有大量复杂的文档,也许您可以通过MongoDB、ArangoDB、CouchDB、Couchbase等解决方案更好地服务。
syntax = "proto3";
message SubMsg {
string s = 1;
int32 i = 2;
}
message Msg {
int32 i = 1;
SubMsg sub = 2;
repeated int32 arr = 3;
}
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]