Golang Cache2go源码结构

Golang Cache2go功能

cache2go 是一个用 Go 语言 实现的并发安全的缓存库,实现了如下特性:

  • 并发安全;
  • 可设置每条缓存的超时时间;
  • key 与 value 可以是任意数据类型。
  • 内置缓存访问计数;
  • 自调节的缓存过期检查;
  • 可设置缓存增加/删除回调函数;

这个库代码量很少,核心代码就三个文件,里面设计的技术点主要包括 读写锁goroutinemap 操作等。

Golang Cache2go源码结构

项目结构

Cache2go 的源码结构比较简单,一共就四个文件,分别为:cache.go,cacheitem.go,cachetable.go 和 errors.go 文件,目录结构如下:

01_Go语言Cache2go源码分析.png

这里的文件就这上面三个,examples 文件夹里面存放的是使用的实例,因此,不属于项目的源代码范畴。其中 cache.go 里面主要是一个 Cache 接口,通过该接口可以创建一个 Cache 对象。

cacheitem.go 里面主要存放了一个 CacheItem 结构,以及其对应的方法,而 cachetable.go 里面主要存放了一个 CacheTable 结构,以及其对应的方法。

最后的 errors.go 文件,定义了一些常用的错误信息。

核心数据结构

Cache2go 的源码的数据结构主要涉及到三个,分别为 Cache,CacheTable 和 CacheItem,它们之间的关系如下图所示:

我们可以看出,一个 Cache 里面可以通过 name 关联多个 CacheTable,同时一个 CacheTable 可以通过 key 关联多个 CacheItem。

主要API说明

接口 说明
Cache() 返回已经存在的给定名称的缓存表,类型为 *CacheTable ,如果不存在,则创建一个新的缓存表。
Add() 向缓存表添加新的 key/value 对。可以同时指定该 key 的过期时间。如果为 0,则表示一直有效。
Value() 根据 key 返回缓存中对应的 value ,类型为 *CacheItem 。如果 key 存在,则同时更新它的访问计数和最后访问时间;如果不存在,则尝试调用事先注册的回调函数 loadData 初始化数据到缓存表。
Delete() 从缓存表中删除指定 key 。
Exists() 检查 key 是否存在于缓存中, 存在返回 true 。不会更新缓存项的最后访问时间。
Foreach() 遍历缓存,对每个缓存项,调用自定义的回调函数进行处理。
SetDataLoader() 针对缓存设置数据加载回调函数,用于从缓存检索不存在的 key 时自动从其他地方如数据库、文件加载该 key/value 对到缓存中。
SetAddedItemCallback() 针对缓存设置新增 key/value 对到缓存时自动触发的回调函数。
SetAboutToDeleteItemCallback() 针对缓存设置删除 key 时自动触发的回调函数。
SetAboutToExpireCallback() 针对特定的 key 设置过期提醒回调函数。

Golang Cache2go源码结构总结

一个 Cache 里面可以通过 name 关联多个 CacheTable,同时一个 CacheTable 可以通过 key 关联多个 CacheItem。