cache2go 源码解读
什么是cache2go?
cache2go是一个开源的应用内缓存库,保证并发安全,提供 key-value 存储以及带过期时间控制。 key 与 value 可以是任意数据类型。在源码中,我们可以学习这个库是如何维护数据,如何利用锁保证并发安全,如何对数据进行过期处理。
主要 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 设置过期提醒回调函数。
源码分析
cache2go主要的代码包括cache.go,cacheitem.go,cachetable.go三个文件。
其数据结构 为key-value形式。类似redis那样,先画一张表,然后在表中存放n个key-value

cache.go只有一个方法用于创建CacheTable对象,维护CacheTable对象集合
var (
cache = make(map[string]*CacheTable)
mutex sync.RWMutex
)
//返回具有给定名称的现有缓存表,或者如果表不存在则创建一个新的缓存表
func Cache(table string) *CacheTable {
mutex.RLock()
t, ok := cache[table]
mutex.RUnlock()
if !ok {
mutex.Lock()
t, ok = cache[table]
// 再次检查该表是否存在
if !ok {
t = &CacheTable{
name: table,
items: make(map[interface{}]*CacheItem),
}
cache[table] = t
}
mutex

本文详细解读了开源的Go语言缓存库cache2go,介绍了其并发安全的key-value存储、过期时间控制等功能。主要关注CacheTable对象的创建、数据结构、并发控制以及过期处理策略。通过对cache.go、cacheitem.go和cachetable.go三个核心文件的分析,阐述了cache2go如何维护数据、使用锁保证并发安全以及数据过期处理的高效实现。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



