结构体对象切片在redis中容易存储(变成了字符串),但是不容易还原成对象切片。
解决方法:通过将结构体对象切片序列化,存储在redis中。取出时,将数据反序列化还原成结构体对象切片
序列化
- 定义容器
- 定义编码器
- 编码
- 给redis传入数据
//请求数据
o.QueryTable("ArticleType").All(&articlesTypes)
//定义容器
var buffer bytes.Buffer
//定义编码器
enc := gob.NewEncoder(&buffer)
//编码
enc.Encode(articlesTypes)
//给redis传入数据
conn.Do("set", "newsWeb", buffer.Bytes())
反序列化
- 从redis中取出数据
- 定义解码器
- 解码
- 得到数据
//从redis中取出数据
resp, err := conn.Do("get", "newsWeb")
result, err := redis.Bytes(resp, err)
//定义解码器
dec := gob.NewDecoder(bytes.NewReader(result))
//解码
dec.Decode(&articlesTypes)
如何判断当前是第一次访问
先从redis中获取数据,如果取不到,是第一次访问,需要从数据库中拿去数据。取到值不是第一次访问。
var articlesTypes []models.ArticleType
conn, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
beego.Error("redis连接失败:", err)
return
}
//从redis获取数据
resp, err := conn.Do("get", "newsWeb")
result, err := redis.Bytes(resp, err)
//判断是否是第一次访问,如果长度为0则是第一次访问
if len(result) == 0 {
o.QueryTable("ArticleType").All(&articlesTypes)
this.Data["articleTypes"] = articlesTypes
//定义容器
var buffer bytes.Buffer
//定义编码器
enc := gob.NewEncoder(&buffer)
//编码
enc.Encode(articlesTypes)
//给redis传值
conn.Do("set", "newsWeb", buffer.Bytes())
} else {
//定义解码器
dec := gob.NewDecoder(bytes.NewReader(result))
//解码
dec.Decode(&articlesTypes)
this.Data["articleTypes"] = articlesTypes
}