1-测试go-redis缓存数据
1.go-redis缓存数据测试效果
a.测试页面
测试页面:--这里使用 Postman 来做测试
http://127.0.0.1:8000/article/getone/3
http://127.0.0.1:8000/article/getone/4
http://127.0.0.1:8000/article/getone/5
b.测试效果
查看终端:
直接使用mysql数据库查询数据时间比较长;
使用 redis 做缓存用时比较短。
使用缓存可以缩短查找数据的时间。
2.go-redis缓存代码实现
a.程序从main函数开始
准备工作:
要配好mysql和redis等配置
b.配好路由
存储位置:/routers.routers.go
操作:
1.测试需要一个路由
//文章路由部分
article_r := r.Group("/article/")
{
//获取一篇文章详情
article_c := controllers.NewArticleController()
article_r.GET("/getone/:id", article_c.GetOne)
}
c.控制器实现逻辑
/controllers/articleController.go
操作:
1.获取参数
2.将参数带入服务中查找数据
3.返回数据
// 得到一篇文章的详情
func (a *ArticleController) GetOne(c *gin.Context) {
result := result.NewResult(c)
param := request.ArticleRequest{ID: validCheck.StrTo(c.Param("id")).MustUInt64()}
valid, _ := validCheck.BindAndValid(c, ¶m)
if !valid {
result.Error(global.ErrParam)
return
}
articleOne, err := service.GetOneArticle(param.ID)
if err != nil {
result.Error(global.ErrArticleNot)
} else {
result.Success(&articleOne)
}
}
d.在服务里实现获取数据逻辑
/service/article.go
操作:
1.想看缓存中有没有查找的数据
2.如果有,就把数据返回到控制器
3.如果缓存中没有,就到mysql中查找,然后把数据保存到redis缓存,最后返回数据
// 得到一篇文章的详情
func GetOneArticle(articleId uint64) (*model.Article, error) {
//get from cache
article, err := cache.GetOneArticleCache(articleId)
if err == redis.Nil || err != nil {
//get from mysql
article, errSel := dao.SelectOneArticle(articleId)
if errSel != nil {
return nil, errSel
} else {
//set cache
errSet := cache.SetOneArticleCache(articleId, article)
if errSet != nil {
return nil, errSet
} else {
return article, errSel
}
}
} else {
return article, err
}
}
e.从redis缓存中获得数据
/cache/article.go
操作:
1.根据条件,在redis中获取数据
2.如果数据无效,就会返回nil和err
3.如果数据有效,将 JSON 格式的字节切片解析成 Go 语言的数据结构
4.将有效数据返回
// 从cache得到一篇文章
func GetOneArticleCache(articleId uint64) (*model.Article, error) {
var ctx = context.Background()
key := getArticleCacheName(articleId)
val, err := global.RedisDb.Get(ctx, key).Result()
if err == redis.Nil || err != nil {
return nil, err
} else {
article := model.Article{}
if err := json.Unmarshal([]byte(val), &article); err != nil {
//t.Error(target)
return nil, err
}
return &article, nil
}
}
f.从数据库获取数据
/dao/article.go
操作:
1.根据条件,从mysql中获取数据
2.返回数据
// select一条记录
func SelectOneArticle(articleId uint64) (*model.Article, error) {
fields := []string{"articleId", "subject", "url"}
articleOne := &model.Article{}
err := global.DBLink.Select(fields).Where("articleId=?", articleId).First(&articleOne).Error
if err != nil {
return nil, err
} else {
return articleOne, nil
}
}
g.将数据保存到redis中
/cache/article.go
1.根据取名规则,设置键名
2.将 Go 语言的数据结构转换为 JSON 格式的字节切片
3.将字节切片数据,保存到redis中,键名是上面设置的键名
// 向cache保存一篇文章
func SetOneArticleCache(articleId uint64, article *model.Article) error {
var ctx = context.Background()
key := getArticleCacheName(articleId)
content, err := json.Marshal(article)
if err != nil {
fmt.Println(err)
return err
}
errSet := global.RedisDb.Set(ctx, key, content, ArticleDuration).Err()
if errSet != nil {
return errSet
}
return nil
}
h.查看redis中的数据
3.获取开源项目
a.gin框架中用go-redis缓存数据
b.本测试代码下载