go - 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?
解决方案
使用gob、json或类似的编码包将结构值编码为 []byte 。将 []byte 存储在 Redis 中。在获取数据时反转该过程。
假设 Redis 客户端具有Set和Get方法,使用 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 客户端进行调整。
只要应用程序使用相同类型设置和获取给定键的值,这种方法就可以避免重复并且是类型安全的。
推荐阅读
- java - joda 时间与 java 时间的默认语言环境
- r - 如何仅在 geom_label_repel() 中更改文本颜色而不是线条颜色
- javascript - 使用 SQLite 反应原生博览会
- javascript - 在 WEBSITE 中以 BTC 实时显示美元金额的脚本
- three.js - WebGL:将分数布朗运动烘焙到纹理中
- python - 尝试运行使用 pyinstaller 创建的 Mac .app 时如何解决 Matplotlib 模块未找到错误
- apache - 任意位置的端口转发
- php - 如何在laravel刀片中从json解码中回显键名和键值
- wordpress - 在具有特定值的字段的 10 个条目后禁用 Gravity 表单的提交表单
- android - 使用 mokk 时收到“每个 { ... } 块内缺少呼叫”