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 cachearticle, err := cache.GetOneArticleCache(articleId)if err == redis.Nil || err != nil {//get from mysqlarticle, errSel := dao.SelectOneArticle(articleId)if errSel != nil {return nil, errSel} else {//set cacheerrSet := 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).Errorif 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.本测试代码下载