cache2go 源码解读

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
https://i.loli.net/2020/08/03/6c149khpm5VxqKF.png

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值