对Golang对象使用Redis HMSET与RedisLab的ReJSON

在此示例中,我提出了一种使用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