在此示例中,我提出了一种使用Redis来存储(嵌入)结构的替代方法,例如-
为什么我们不能只使用Redigo?
在过去的一年中,我使用过redigo与Redis进行交互,并且绝对喜欢该库。但是,我面临的最大问题是使用嵌入式结构时。如果我们坚持使用标准数据类型并避免使用嵌入式结构,则Redigo可以正常工作。这些
参数可以结合使用redis.Args{key}.AddFlat(value)...以展平要存储在Redis中的数据结构。可以
HGETALL使用帮助程序在上读取数据
redis.ScanStruct(value, &obj)。
与嵌入式结构实例一起使用时会出现问题。存储在Redis中的结果数据如下所示-
[键]信息-[值]&{John Doe CSE} [类型字符串]
使用将数据读回到结构中时
redis.ScanStruct(value, &student),它无法将数据移植到嵌入式对象中,并返回error。 解决方案#1
JSON元帅
解决此问题的一种方法是将对象存储为JSON字符串。
使用以下命令将对象添加到数据库:
如果您只需要缓存整个对象,而不必担心曾经访问或修改对象的单个成员,则此方法很好用。
但是,如果您希望读取/修改对象中的字段,则必须解组对象,修改字段,然后将对象重新添加到Redis中。
解决方案#2使用,
ReJSON您可以将对象直接作为JSON对象存储到Redis中(请注意,不要将其编组为JSON字符串)。使用
JSON.SET命令将对象添加到Redis 。最好的部分是,我们现在可以
GET使用
JSON.GET并指定成员字段的路径从Redis返回JSON对象的任何部分。
为了使用ReJSON模块将对象添加到Redis中,我使用了go-rejson,它是我编写的帮助程序库,可轻松地将命令与redigo一起使用。
并且可以使用以下命令读取对象中的每个字段:
在rejson.io上有大量关于使用ReJSON模块的文档。
例跑步
docker
如下运行ReJSON提供的docker容器,
docker run -p 6379:6379 --name redis-rejson redislabs/rejson:latest
容器旋转起来后,请执行以下
main.go操作,
go run main.go
输出量
运行示例将生成如下所示的条目:
127.0.0.1:6379> keys * 1) "JohnDoeJSON" 2) "JohnDoeHashJSON" 3) "JohnDoeHash"
重新JSON(具有漂亮的打印选项)
127.0.0.1:6379> JSON.GET JohnDoeJSON INDENT "\t" NEWLINE "\n" SPACE " " { "info": { "FirstName": "John", "LastName": "Doe", "Major": "CSE" }, "rank": 1 }
HGETALL,键/值对为奇/偶数
127.0.0.1:6379> HGETALL JohnDoeHash Info &{John Doe CSE} Rank 1
HGETALL(存储为JSON)
花式位127.0.0.1:6379> HGETALL JohnDoeHashJSON JSON {"info":{"FirstName":"John","LastName":"Doe","Major":"CSE"},"rank":1}
使用ReJSON获取对象字段
127.0.0.1:6379> JSON.GET JohnDoeJSON INDENT "\t" NEWLINE "\n" SPACE " " .info { "FirstName": "John", "LastName": "Doe", "Major": "CSE" }
使用ReJSON设置对象字段
运行示例127.0.0.1:6379> JSON.SET JohnDoeJSON info.Major '"EEE"' OK 127.0.0.1:6379> JSON.GET JohnDoeJSON INDENT "\t" NEWLINE "\n" SPACE " " .info { "FirstName": "John", "LastName": "Doe", "Major": "EEE" }
使用ReJSON模块启动Redis
docker run -p 6379:6379 --name redis-rejson redislabs/rejson:latest
运行代码
git clone https://github.com/nitishm/rejson-struct.git cd rejson-struct go run main.go