本文以友情链接为例,说明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()函数。