在 Golang 中使用 HSET 将空映射插入 Redis 失败
Inserting an empty map into Redis using HSET fails in Golang
我有一些代码可以使用 HSET
命令将地图插入 Redis:
prefix := "accounts|asdfas"
data := make(map[string]string)
if _, err := conn.Do("HSET", redis.Args{}.Add(prefix).AddFlat(data)...); err != nil {
return err
}
如果 data
中有值,那么这将起作用,但如果 data
为空,则会发出以下错误:
ERR wrong number of arguments for 'hset' command
这似乎是 AddFlat
函数将映射转换为键及其关联值的交错列表的结果。当地图为空时这不起作用是有道理的,但我不确定如何处理它。我宁愿不向 map 添加空值,但这就是我所能想到的。有没有一种方法可以更符合 Redis 的处理方式?
根据一般经验,Redis 不允许也从不保留空数据结构(但有一个例外)。
这是一个例子:
> HSET members foo bar
(integer) 1
> EXISTS members
(integer) 1
> HDEL members foo
(integer) 1
> EXISTS members
(integer) 0
因此,如果你想保留你的数据结构,你必须至少有一个成员在其中。您可以在哈希中添加一个虚拟项目
并在您的应用程序逻辑中忽略它,但它可能不适用于 List 等其他数据结构。
我有一些代码可以使用 HSET
命令将地图插入 Redis:
prefix := "accounts|asdfas"
data := make(map[string]string)
if _, err := conn.Do("HSET", redis.Args{}.Add(prefix).AddFlat(data)...); err != nil {
return err
}
如果 data
中有值,那么这将起作用,但如果 data
为空,则会发出以下错误:
ERR wrong number of arguments for 'hset' command
这似乎是 AddFlat
函数将映射转换为键及其关联值的交错列表的结果。当地图为空时这不起作用是有道理的,但我不确定如何处理它。我宁愿不向 map 添加空值,但这就是我所能想到的。有没有一种方法可以更符合 Redis 的处理方式?
根据一般经验,Redis 不允许也从不保留空数据结构(但有一个例外)。
这是一个例子:
> HSET members foo bar
(integer) 1
> EXISTS members
(integer) 1
> HDEL members foo
(integer) 1
> EXISTS members
(integer) 0
因此,如果你想保留你的数据结构,你必须至少有一个成员在其中。您可以在哈希中添加一个虚拟项目 并在您的应用程序逻辑中忽略它,但它可能不适用于 List 等其他数据结构。