将通用结构体保存到Redis

8

在编写golang web服务器时,我需要使用某种缓存,所以我选择了redis。 我需要一些函数来将任何结构作为值保存到redis中。 有没有不使用interface{}作为接收参数或重复自己过多而仍然保持类型安全的方法来实现这个功能呢?

1个回答

30

使用gobjson或类似的编码包将结构体值编码为[]byte。将[]byte存储在Redis中。获取数据时反转此过程。

假设Redis客户端具有SetGet方法,使用JSON包的代码将如下所示:

func set(c *RedisClient, key string, value interface{}) error {
    p, err := json.Marshal(value)
    if err != nil {
       return err
    }
    return c.Set(key, p)
}

func get(c *RedisClient, key string, dest interface{}) error {
    p, err := c.Get(key)
    if err != nil {
       return err
    }
    return json.Unmarshal(p, dest)
}

使用以下方式保存一个值:

var v someType
if err := set(c, key, v); err != nil {
     // handle error
}

用这种方式检索值。注意,指向该值的指针被传递给get

var v someType
if err := get(c, key, &v); err != nil {
     // handle error
}

具体细节需要根据您使用的Redis客户端进行调整。

这种方法避免了重复,只要应用程序使用相同类型设置和获取给定键的值,就是类型安全的。


同时考虑使用MessagePack。Gob非常优化,即使结构体发生小变化也能正常工作,但在Go中仍需要一个与源相同/相似的目标结构体。MessagePack类似于JSON,但开销更接近于Gob。 - Sudhir Jonathan
2
谢谢。这很好。但我希望有一种方法可以使用“redis hash”并将值并排存储。 - Amin Shojaei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接