本文以友情链接为例,说明RichCMS中的内存缓存使用,其类型的缓存,如:栏目缓存,文章缓存,实现方法类似。
文件:/github.com/zituocn/richcms/src/cms/cache/link_cache.go
package cache
import (
"github.com/zituocn/richcms/common/constname"
"github.com/zituocn/richcms/common/repository/model"
)
type LinkCache struct{}
func (m *LinkCache) Remove() error {
return MC.RemoveCache(constname.LinkCacheKey)
}
// GetLinks 缓存中的cache
func (m *LinkCache) GetLinks() (data []*model.Link, err error) {
ok, _ := MC.GetCache(constname.LinkCacheKey, &data)
if !ok {
data, _ = new(model.Link).List()
if err != nil {
return
}
_ = MC.SetCache(constname.LinkCacheKey, data)
}
return
}
源码解析:
- GetLinks() 函数,用于获取内存中所有的友情链接信息。先从内存中取数据,如果不存在,从数据库中获取;
- 获取成功后,设置数据到内存中。
- Remove() 函数,用于移出缓存,当友情链接被编辑、删除时,会调用此函数。
文件:/github.com/zituocn/richcms/src/cms/handler/admin/links/links.go
package links
/*
友情链接
*/
import (
"fmt"
"github.com/zituocn/gow"
"github.com/zituocn/richcms/common/repository/model"
"github.com/zituocn/richcms/common/utils"
"github.com/zituocn/richcms/src/cms/cache"
"github.com/zituocn/richcms/src/cms/middleware"
)
func Save(c *gow.Context) {
req := new(model.Link)
err := c.DecodeJSONBody(&req)
if err != nil {
c.DataJSON(1, fmt.Sprintf("参数错误:%v", err))
return
}
if req.Name == "" {
c.DataJSON(1, "请填写站点名称")
return
}
if req.Url == "" {
c.DataJSON(1, "请填写站点网址")
return
}
if req.OrderInt < 0 {
c.DataJSON(1, "排序值须大于0")
return
}
if req.Id == 0 {
user := middleware.GetAdminUser(c)
if user != nil && user.Uid > 0 {
req.Uid = user.Uid
req.Username = user.Username
}
req.Created = utils.NowUnixTime()
err = req.Create()
if err != nil {
c.DataJSON(1, fmt.Sprintf("保存失败:%v", err))
return
}
} else {
ex := map[string]interface{}{
"name": req.Name,
"url": req.Url,
"order_int": req.OrderInt,
"remark": req.Remark,
}
err = req.Update(ex)
if err != nil {
c.DataJSON(1, fmt.Sprintf("保存失败:%v", err))
return
}
}
// 移出link cache
_ = new(cache.LinkCache).Remove()
c.DataJSON()
}
// Delete 删除
func Delete(c *gow.Context) {
req := new(model.Link)
err := c.DecodeJSONBody(&req)
if err != nil {
c.DataJSON(1, fmt.Sprintf("参数错误:%v", err))
return
}
if req.Id < 1 {
c.DataJSON(1, "参数错误")
return
}
err = req.Delete()
if err != nil {
c.DataJSON(1, fmt.Sprintf("操作错误:%v", err))
return
}
// 移出link cache
_ = new(cache.LinkCache).Remove()
c.DataJSON()
}
func Page(c *gow.Context) {
name := c.GetString("name")
data, count, err := new(model.Link).Page(c.Pager.Offset, c.Pager.Limit, name)
if err != nil {
c.DataJSON(1, fmt.Sprintf("查询错误: %v", err))
return
}
c.Pager.Count = count
c.DataJSON(data, c.Pager)
}
以上源码,管理平台,操作友情链接对应的handler函数,分别是:保存、删除和翻页列表,可以看到,在此页面,调用了移出缓存的Remove()函数。