一,安装用到的库
1,安装go-redis
liuhongdi@ku:~$ go get -u github.com/go-redis/redis
2,安装bigcache
liuhongdi@ku:~$ go get -u github.com/allegro/bigcache
说明:刘宏缔的go森林是一个专注golang的博客,
地址:https://blog.csdn.net/weixin_43881017
说明:作者:刘宏缔 邮箱: 371125307@qq.com
二,演示项目的相关信息
1,项目地址:
2,项目功能:演示redis+bigcache两级缓存,
通过订阅redis消息更新进程内缓存bigcache
3,项目结构:如图:
三,go代码说明
1,config/config.yaml
Database:
DBType: mysql
UserName: root
Password: password
Host: 127.0.0.1:3306
DBName: dig
Charset: utf8
ParseTime: True
MaxIdleConns: 10
MaxOpenConns: 30
Server:
RunMode: debug
HttpPort: 8000
ReadTimeout: 60
WriteTimeout: 60
Redis:
Addr: 127.0.0.1:6379
Password:
2,controller/setController.go
package controller
import (
"github.com/gin-gonic/gin"
"github.com/liuhongdi/digv10/global"
"github.com/liuhongdi/digv10/pkg/result"
)
type SetController struct{}
//new
func NewSetController() SetController {
return SetController{}
}
//发布一条消息到redis
func (u *SetController) Pub(c *gin.Context) {
resultRes := result.NewResult(c)
data:=c.Query("id")
err := global.RedisDb.Publish("articleMsg", data).Err()
if err != nil {
resultRes.Error(400,err.Error())
return
} else {
resultRes.Success("发送成功")
}
}
3,bigcache/article.go
package bigcache
import (
"encoding/json"
"fmt"
"github.com/liuhongdi/digv10/global"
"github.com/liuhongdi/digv10/model"
"strconv"
)
//bigcache中索引的名字
func getArticleCacheName(articleId uint64) (string) {
return "article_"+strconv.FormatUint(articleId,10)
}
//从bigcache得到一篇文章
func GetOneArticleBigCache(articleId uint64) (*model.Article,error) {
fmt.Println("bigcache:GetOneArticleBigCache")
key := getArticleCacheName(articleId);
val,err := global.BigCache.Get(key)
if (err != nil) {
return nil,err
} else {
article := model.Article{}
if err := json.Unmarshal([]byte(val), &article); err != nil {
return nil,err
}
return &article,nil
}
}
//向bigcache保存一篇文章
func SetOneArticleBigCache(articleId uint64,article *model.Article) (error) {
key := getArticleCacheName(articleId);
content,err := json.Marshal(article)
if (err != nil){
fmt.Println(err)
return err;
}
errSet := global.BigCache.Set(key,[]byte(content))
if (