redis中嵌套结构的替代方案?

bf1o4zei  于 2021-06-09  发布在  Redis
关注(0)|答案(2)|浏览(1483)

我经常遇到这样的情况:我要存储的信息比redis的任何简单数据结构都要复杂。我仍然想使用redis,但我想知道当人们理想地希望使用嵌套结构时,是否有任何标准的替代方案?

l3zydbqr

l3zydbqr1#

基本上有两种策略:
可以序列化复杂对象并将其存储为字符串。我们建议使用json或msgpack作为序列化格式。这在大多数客户端语言中都很容易操作。如果需要服务器端访问,那么服务器端lua脚本可以轻松地编码/解码这些对象,因为redis是使用msgpack和json支持lua编译的。
可以将对象拆分为不同的关键点。而不是储存user:id and 对于这个id的复杂数据结构,可以存储几个键,例如user:id, user:id:地址列表,user:id:文档列表等。。。如果需要原子性,可以使用流水线multi/exec块来保证数据的一致性,并聚合往返。
请看以下答案中的一个简单示例:
lpush命令对从json初始化的记录有效吗?
最后,redis不是一个面向文档的数据库。如果你真的有很多复杂的文档,也许你可以通过mongodb、arangodb、couchdb、couchbase等解决方案得到更好的服务。。。

chy5wohz

chy5wohz2#

当您需要修改对象时,将复杂对象序列化为字符串并将字符串保存到redis是非常低效的。因为您必须将字符串取回客户端,将其反序列化为对象,修改它,再次序列化为字符串,然后将其保存回redis。太多的工作。。。
现在是2019年,有一些新的redis模块可以让redis支持嵌套的数据结构,比如redisjson,redis protobuf。
desclaimer:我是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]

详细情况请看文件。如果您对redis protobuf有任何问题,请随时告诉我。

相关问题