衔接上文,继续开发。这一章我们接入Redis缓存功能。

 

设计Redis缓存方案

我们目前需要缓存Tag和Article,主要是解决读取请求。

 

Tag缓存方案

查询1,根据TagID判断一个tag是否存在:

  • 我们可以用Redis的Set结构存储TagID。新增就添加一个TagID,删除就删除TagID。
  • 需要解决的问题就是获取新添加的TagID…这个GORM文档有写到。

 

查询2,添加Tag的时,判断TagName是否存在:

  • 修改Set结构为Hash结构,TagID-TagName做Key-Value,然后HEXISTS判断Key是否存在解决查询1.
  • 根据HGETALL获取所有的键值,然后判断值是否有匹配(看起来效率不高)。

查询2拓展:

  • 使用Set结构存储TagName,直接判断Name是否在Set结构内。

 

查询3,获取所有的Tag数量:
  • 使用HASH结构,HLEN命令即可实现。

 

查询4, 获取Tag所有的信息:
  • 拓展Hash结构,Key-Value改为TagID-Tag结构。

 

Tag总结:
  1. Hash结构,TagID-Tag存储Tag信息(不过期)
  2. Set结构,存储TagName

 

Article缓存方案

article字段比较多,且跟Tag相比,占用的内存会稍大(文章内容多)。

所以只缓存被请求过的完整信息,加上过期时间。

 

查询1,获取一篇文章所有信息:

  • 用String存储ID-Article(json化)。
  • 需要注意的是,只有从数据库获取了这篇文章,我们才把它加到缓存中去。过期时间1天。

 

查询2,根据ID判断文章是否存在:

  • 这个使用前面的String是否存在判断完全不行,因为了缓存并不会缓存所有的文章信息。
  • 可以使用Set结构存储所有文章ID,判断文章是否存在。

 

查询3,获取文章数量:

  • Set结构有SCARD命令可以获取所有的ID数量,它就是所有的文章数量。

 

Article总结:

  1. 大量的String,缓存Article所有信息,1天过期。
  2. Set结构,存储所有文章ID。

 

分页缓存方案

需要注意的是,我们这里需要分页缓存方案。

1. 最基本的统一缓存方案(适应所有查询条件):

  1. 访问数据库,根据查询条件、分页条件,得到所有的文章ID。
  2. 根据文章ID在缓存中查找所有的文章内容。
  3. 缓存数据不全,则在数据库中查找对应ID文章内容。
  4. 更新缓存。

 

2. 没有其他任何查询条件,进行单纯的分页查询:

  1. List缓存中计算分页得到ID。
  2. 缓存数据不全,查找数据库补齐。
  3. 根据ID在缓存中获取内容。

 

目前我实现了方案2,就是一种没有其他查询条件的分页缓存方案。

 

分页缓存逻辑

1. 如果没有其他查询条件,采用方案2

2. 如果有查询条件,先访问数据库根据查询条件获取ID,然后根据ID从缓存中获取数据。

3. 还可以将查询条件结果存入缓存,相同的查询条件直接从缓存获取数据。

 

List缓存设计方案

这里其实就是保存了所有有效的ID,用来计算分页。

  • 初始化时,将当前SQL有效数据ID加入到缓存List。
  • 创建时,RPUSH进List
  • 修改时,不需要修改List
  • 删除时,用LREM删除指定ID即可。

 

 

 

接入Redis

新增Redis配置

修改 conf/setting.ini 文件,新增redis相关配置

 

修改pkg/setting/setting.go文件,新增Redis相关配置读取:

这里只给出Redis相关修改。

 

Redis工具包

提供功能如下:

  • 连接Redis数据库,操作Redis。
  • 提供操作相关接口

在pkg目录下新建gredis文件夹,文件夹内新建redis.go文件,写入内容如下:

主要是封装了以下方法:

  • 公共方法: Exist、Delete
  • String相关方法Get、Set
  • Hash相关方法HSet、HGet、HMGet、HExist、HDelete
  • List相关方法LPush、RPush、LLen、LRange、LRemove
  • Set相关方法SAdd、SRemove、SIsMember
  • ZSet相关方法ZAdd、ZCount、ZRange、ZRemove

这一步完成之后,我们就可以接入Redis缓存逻辑了。

 

提供Article和Tag的缓存Key

1. 缓存Prefix

打开 pkg/e 目录,新建 cache.go 文件,写入内容:

 

2. 缓存Key

项目根目录下新建service目录,然后新建cacheservice目录。

2.1 tag

Tag的缓存有两个结构,一个Hash结构,一个Set结构。

在cacheservice目录下新建tag.go文件,写入内容如下:

 

2.2 article

Article有两个结构,大量的String用来缓存文章信息,一个Set结构缓存所有文章ID。

在cacheservice目录下新建article.go文件,写入内容如下:

 

 

在Service层接入Redis缓存逻辑

1. Tag的缓存逻辑

1. 对 models/tag.go 有一些修改:

 

2. 修改 service/tagservice/tag.go 文件:

Tag的缓存没有过期时间。

 

2. Article的缓存逻辑

1. models/article.go代码如下:我也忘了改没改。

 

2. service/articleservice/article.go文件修改如下:

 

嗯,以上就是所有代码…下面是测试…还没做。哈哈哈

 

【Go】gin Blog项目(十二) 接入Redis缓存
Tagged on:     
5 1 投票
Article Rating
订阅评论
提醒

1 评论
最新
最旧 最多投票
内联反馈
查看所有评论

博主,有些方法没有暴露呦 方便分享下示例项目的github吗?