zoukankan      html  css  js  c++  java
  • cache2go源码最后一讲

     先看一下我们讲到哪里了:

    cache2go的源码前面我们已经讲完了cacheitem和cachetable的实现,今天cahce和examples会一起讲完~

    1、cache.go源码

    ​        前面的代码看完之后现在看cache.go就太简单了,上代码吧~

     1var (
    2    cache = make(map[string]*CacheTable)
    3    mutex sync.RWMutex
    4)
    5
    6// Cache returns the existing cache table with given name or creates a new one
    7// if the table does not exist yet.
    8//【表存在则返回表,表不存在的时候创建一个不包含items的空表,然后返回之】
    9func Cache(table string) *CacheTable {
    10    mutex.RLock()
    11    //【注意cache的类型,这是一个用于存CacheTable的map】
    12    t, ok := cache[table]
    13    mutex.RUnlock()
    14
    15    if !ok {
    16        mutex.Lock()
    17        //【表不存在的时候需要创建一个空表,这时候做了一个二次检查,为的是并发安全】
    18        t, ok = cache[table]
    19        // Double check whether the table exists or not.
    20        if !ok {
    21            t = &CacheTable{
    22                name:  table,
    23                items: make(map[interface{}]*CacheItem),
    24            }
    25            cache[table] = t
    26        }
    27        mutex.Unlock()
    28    }
    29
    30    return t
    31}

    2、example

      如上图,项目中还有一个examples目录,大家肯定已经猜到了里面的内容了,没错,就是上面介绍的一堆代码组成的缓存库,怎么玩?

      下面我们一个一个来看这3个示例吧~

    1、callbacks.go

     1func main() {
    2    //【创建一个名为myCache的缓存表】
    3    cache := cache2go.Cache("myCache")
    4
    5    // This callback will be triggered every time a new item
    6    // gets added to the cache.
    7    //【每次有新item被加入到这个缓存表的时候会被触发的回调函数】
    8    //【这个函数只做了一个输出的动作】
    9    cache.SetAddedItemCallback(func(entry *cache2go.CacheItem) {
    10        fmt.Println("Added:", entry.Key(), entry.Data(), entry.CreatedOn())
    11    })
    12    // This callback will be triggered every time an item
    13    // is about to be removed from the cache.
    14    //【当一个item被删除时被触发执行的回调函数,同样只有一个打印功能】
    15    cache.SetAboutToDeleteItemCallback(func(entry *cache2go.CacheItem) {
    16        fmt.Println("Deleting:", entry.Key(), entry.Data(), entry.CreatedOn())
    17    })
    18
    19    // Caching a new item will execute the AddedItem callback.
    20    //【缓存中添加一条记录】
    21    cache.Add("someKey"0"This is a test!")
    22
    23    // Let's retrieve the item from the cache
    24    //【读取刚才存入的数据】
    25    res, err := cache.Value("someKey")
    26    if err == nil {
    27        fmt.Println("Found value in cache:", res.Data())
    28    } else {
    29        fmt.Println("Error retrieving value from cache:", err)
    30    }
    31
    32    // Deleting the item will execute the AboutToDeleteItem callback.
    33    //【删除someKey对应的记录】
    34    cache.Delete("someKey")
    35
    36    // Caching a new item that expires in 3 seconds
    37    //【添加设置了3s存活时间的记录】
    38    res = cache.Add("anotherKey"3*time.Second, "This is another test")
    39
    40    // This callback will be triggered when the item is about to expire
    41    //【一旦触发了删除操作就会调用到下面这个回调函数,在这里也就是3s到期时被执行
    42    res.SetAboutToExpireCallback(func(key interface{}) {
    43        fmt.Println("About to expire:", key.(string))
    44    })
    45
    46    //【为了等上面的3s时间到】
    47    time.Sleep(5 * time.Second)
    48}

    2、dataloader.go

     1func main() {
    2    cache := cache2go.Cache("myCache")
    3
    4    // The data loader gets called automatically whenever something
    5    // tries to retrieve a non-existing key from the cache.
    6    //【当从cache中访问一个不存在的key时会触发这个回调函数】
    7    cache.SetDataLoader(func(key interface{}, args ...interface{}) *cache2go.CacheItem {
    8        // Apply some clever loading logic here, e.g. read values for
    9        // this key from database, network or file.
    10        //【这里可以做一些机智的处理,比如说从数据库,网络或者文件中读取数据,这当然也是缓存的意义】
    11        //key.(string)是类型断言,将interface{}类型的数据转回到string类型
    12        val := "This is a test with key " + key.(string)
    13
    14        // This helper method creates the cached item for us. Yay!
    15        //【很棒,这样就构造了一个value,然后构造出item】
    16        item := cache2go.NewCacheItem(key, 0, val)
    17        return item
    18    })
    19
    20    // Let's retrieve a few auto-generated items from the cache.
    21    //【试着检索一些自动生成的items】
    22    for i := 0; i < 10; i++ {
    23        //【将i转换为字符串,拼接成someKey_1的形式】
    24        res, err := cache.Value("someKey_" + strconv.Itoa(i))
    25        if err == nil {
    26            fmt.Println("Found value in cache:", res.Data())
    27        } else {
    28            fmt.Println("Error retrieving value from cache:", err)
    29        }
    30    }
    31}

    3、mycachedapp.go

     1// Keys & values in cache2go can be of arbitrary types, e.g. a struct.
    2//【这个例子中要存储的数据是如下结构体类型】
    3type myStruct struct {
    4    text     string
    5    moreData []byte
    6}
    7
    8func main() {
    9    // Accessing a new cache table for the first time will create it.
    10    //【创建缓存表myCache】
    11    cache := cache2go.Cache("myCache")
    12
    13    // We will put a new item in the cache. It will expire after
    14    // not being accessed via Value(key) for more than 5 seconds.
    15    //【构造一个数据】
    16    val := myStruct{"This is a test!", []byte{}}
    17    //【存入数据,设置存活时间为5s】
    18    cache.Add("someKey"5*time.Second, &val)
    19
    20    // Let's retrieve the item from the cache.
    21    //【试着读取】
    22    res, err := cache.Value("someKey")
    23    if err == nil {
    24        fmt.Println("Found value in cache:", res.Data().(*myStruct).text)
    25    } else {
    26        fmt.Println("Error retrieving value from cache:", err)
    27    }
    28
    29    // Wait for the item to expire in cache.
    30    //【等待6s之后,明显是该过期了】
    31    time.Sleep(6 * time.Second)
    32    res, err = cache.Value("someKey")
    33    if err != nil {
    34        fmt.Println("Item is not cached (anymore).")
    35    }
    36
    37    // Add another item that never expires.
    38    //【再存入一个永不过期的数据】
    39    cache.Add("someKey"0, &val)
    40
    41    // cache2go supports a few handy callbacks and loading mechanisms.
    42    //【设置回调函数,删除数据的时候被调用】
    43    cache.SetAboutToDeleteItemCallback(func(e *cache2go.CacheItem) {
    44        fmt.Println("Deleting:", e.Key(), e.Data().(*myStruct).text, e.CreatedOn())
    45    })
    46
    47    // Remove the item from the cache.
    48    //【手动执行删除操作,当然,上面设置的函数将被调用】
    49    cache.Delete("someKey")
    50
    51    // And wipe the entire cache table.
    52    //【抹去整个cache中的数据】
    53    cache.Flush()
    54}

      终于全部讲完了~

      如上,整个项目除了测试代码外,实现逻辑部分全部分析完了,cache2go算是非常简短的go开源项目了,很适合作为第一个读源码项目,下面要分析的groupcache也是和cache相关,但是相比cache2go要复杂很多,groupcache是大名鼎鼎的memcache的go语言版,我们下周开始分析!

     

  • 相关阅读:
    celery异步任务
    redis过期策略与内存淘汰机制分析
    爬虫数据去重-布隆过滤器
    scrapy-redis数据去重与分布式框架
    redis哨兵机制
    C#从零单排上王者系列---元组
    玩转VSCode插件之Remote-SSH
    C#从零单排上王者系列---数据类型
    Cassandra之Docker环境实践
    centos7安装nginx并配置前端环境
  • 原文地址:https://www.cnblogs.com/cloudgeek/p/9216697.html
Copyright © 2011-2022 走看看