我经常遇到这样的情况:我要存储的信息比redis的任何简单数据结构都要复杂。我仍然想使用redis,但我想知道当人们理想地希望使用嵌套结构时,是否有任何标准的替代方案?
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等解决方案得到更好的服务。。。
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有任何问题,请随时告诉我。
2条答案
按热度按时间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等解决方案得到更好的服务。。。
chy5wohz2#
当您需要修改对象时,将复杂对象序列化为字符串并将字符串保存到redis是非常低效的。因为您必须将字符串取回客户端,将其反序列化为对象,修改它,再次序列化为字符串,然后将其保存回redis。太多的工作。。。
现在是2019年,有一些新的redis模块可以让redis支持嵌套的数据结构,比如redisjson,redis protobuf。
desclaimer:我是redis protobuf的作者,所以我将给出一些关于这个模块的例子。此外,redis protobuf比redisjson更快、内存效率更高,因为它使用的是二进制格式而不是文本格式来序列化/反序列化数据。
首先,您需要以protobuf格式定义嵌套数据结构并将其保存到本地文件:
然后在redis.conf中加载具有以下配置的模块:
之后,可以读写嵌套的数据结构:
详细情况请看文件。如果您对redis protobuf有任何问题,请随时告诉我。