首页 > 解决方案 > Save generic struct to redis

问题描述

while writing a golang webserver I had to use some sort of cache so i chose redis. I had the need for some sort of function that takes any structure and saves it as is to redis as a value. Is there any way to do this without using the interface{} as a receiving parameter or repeating myself too much and still staying type safe?

标签: goredis

解决方案


使用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 客户端进行调整。

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


推荐阅读