groupcache源码走读(一):实现一个简单缓存
2018-01-02 00:00
169 查看
摘要: 本地被动过期
最近在研究golang的一些优秀开源项目,然后看到了groupcache。该开源库实现了一个分布式缓存库,在分析groupcache的原理和实现之前,我们先来看看正常业务中会怎么实现简单的缓存功能。
该缓存采用的是被动缓存的策略,即如果发现get的key过期了才会删除该key,因此每次set的数据是一个map类型,包含该key的值以及失效的时间戳。
可以看下下面的测试代码:
最近在研究golang的一些优秀开源项目,然后看到了groupcache。该开源库实现了一个分布式缓存库,在分析groupcache的原理和实现之前,我们先来看看正常业务中会怎么实现简单的缓存功能。
PS: 如果想直接看groupcache相关的内容,请移步到groupcache的特性以及使用案例
一个缓存最核心的功能其实是针对kv对的get和set,如果参照mc和redis,可能还有delete以及过期键删除。下面看下笔者实现的代码://简单缓存模型 var Cache = &CachePool{ items: make(map[string]interface{}), } //new一个全局缓存池 func NewCache() *CachePool { return &CachePool{ items: make(map[string]interface{}), } } type CachePool struct { items map[string]interface{} sync.RWMutex } /** * put a value to CachePool * value = map[string]interface{}{ * "content":"", * "expired":1442342332, * } */ func (cache *CachePool) Put(key string, data map[string]interface{}) { cache.Lock() defer cache.Unlock() cache.items[key] = data } func (cache *CachePool) Get(key string) interface{} { cache.RLock() if val, ok := cache.items[key]; ok { if value, ok := val.(map[string]interface{}); ok { cache.RUnlock() if time.Now().Unix() < value["expires"].(int64) { return value["content"] } else { //过期键需要删除 cache.Lock() delete(cache.items, key) cache.Unlock() return nil } } } cache.RUnlock() return nil } func (cache *CachePool) Del(key string) bool { cache.Lock() defer cache.Unlock() if _, ok := cache.items[key]; ok { delete(cache.items, key) return true } return false }
该缓存采用的是被动缓存的策略,即如果发现get的key过期了才会删除该key,因此每次set的数据是一个map类型,包含该key的值以及失效的时间戳。
可以看下下面的测试代码:
func TestCache(t *testing.T) { user1 := make(map[string]interface{}) user1["content"] = "my name is chris" user1["expires"] = time.Now().Add(60 * time.Second).Unix() //计算过期时间 Cache.Put("user1", user1) user2 := map[string]interface{}{"content": "my name is richard", "expires": time.Now 3ff0 ().Unix() + 5} Cache.Put("user2", user2) fmt.Println("user1 is: ", Cache.Get("user1")) fmt.Println("user2 is: ", Cache.Get("user2")) //等5秒,等待user2过期 <-time.After(5 * time.Second) fmt.Println(*Cache) fmt.Println("user2 is:", Cache.Get("user2")) fmt.Println(*Cache) }
相关文章推荐
- 利用读写锁简单实现一个缓存demo
- 一个简单的PHP缓存思路的实现
- 一个简单的JavaScript数据缓存系统实现代码
- 一个简单的JavaScript数据缓存系统实现代码
- 读写锁接口实例-通过ReadWriteLock实现一个简单的缓存
- Java实现一个简单的缓存方法
- 使用go语言的list实现一个简单的LRU缓存
- Java实现一个简单的缓存
- DNS服务器概念的简单的介绍,与搭建一个简单的DNS名称缓存服务器,实现域名解析(一)
- 一个简单的JAVA 缓存实现
- Java实现一个简单的缓存方法
- 一个简单的java缓存实现
- [转载]一个简单的内存缓存实现--一段漂亮的代码
- java 多线之用ReadWriteLock实现 一个简单缓存
- 简单实现SQL Server2000数据库缓存
- 使用Twisted实现一个简单Web服务器
- 使用Ehcache缓存在用户输错n次账户密码之后冻结m小时的简单实现
- 一个简单的Java web服务器实现
- 一个简单的例子,实现UILabel阴影效果
- 使用正则表达式实现一个简单的QQ登录验证