beego/cache源码分析---典型的工厂模式
Posted 月牙寂道长
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了beego/cache源码分析---典型的工厂模式相关的知识,希望对你有一定的参考价值。
beego是一个开源的web框架。cache是其中的一个独立模块。这个模块的设计方式在go语言设计中是非常典型的工厂模式。
cache.go:抽象接口部分、注册部分、模块对外的初始化。
memory:memorycache
file:filecache
cache/memcache:封装的是memcache
cache/redis:封装的是redis
cache/ssdb:封装的是ssdb
源码目录为:
一、cache接口与入口部分
github.com/astaxie/beego/cache/cache.go
Cache接口定义了cache的操作方法:Get,GetMulti,Put,Delete,Incr,Decr,IsExist。
另外还定义了两个清理接口,ClearAll,定时自动清理StartAndGc
提供了注册接口
初始化入口:根据注册的cache类型查找,并初始化相关的cache,最后开启定时自动清理。
二、memorycache
github.com/astaxie/beego/cache/memory.go
在init函数中,注册初始化入口
基础的数据结构MemoryItem
MemoryCache结构体,对基础数据结构MemoryItem的封装,通过一个map进行key value对的保存
初始化部分
Get接口,通过读锁,进行map查找,并判断是否过期。
Put接口,写锁,进行MemoryItem的构建,写入map中。这里面并没有判断key是否存在,所以是直接覆盖的。
其他接口就不一一介绍,都挺简单的。
重点介绍下期中的自动定时清理部分。
读取定时清理时间间隔,开启了vaccuum函数的协程
这里用的是time.After来做定时操作。
然后读取过期数据,然后进行清理
收集过期的数据
清理数据
这里面采用的是收集和清理分离的操作。
二、file cache
github.com/astaxie/beego/cache/file.go
init函数中注册
基础数据结构FileCacheItem
FileCache数据结构
初始化部分,这里注意的是,一些参数设置并不在这里,而是在StartAndGc函数中。
提前看下StartAndGc函数,里面解析了一些参数。继续跟踪
Init初始化路径
从代码中可以看到,file cache并没有实现定时自动清理。
Get分析
根据函数流程一个一个分析
这里的key与文件的对应中,做了一层md5的编码。具体过程就不讲了,总之通过key生成对应的文件名
根据文件名来读取文件的内容
数据的内容还经过了一层编码,对内容进行解码。
最后是返回数据
Put分析
构建了基础数据结构FileCacheItem,并初始化,
最重要的是对保持的内容进行了编码
上面是编码函数
从key得到对应的文件路径的函数已经介绍过了。这里略过
继续就是讲编码过的内容写入文件中。
三、redis cache
github.com/astaxie/beego/cache/redis/redis.go
在init中注册
数据结构,其中最重要的是p,是对redis的封装。
初始化函数
do函数,封装了对redis的操作。
Get分析
封装了对redis的GET操作
Put分析
其实就是封装了redis的SETEX操作
在StartAndGc的注释中,可以看到说明,这里面只是做了一些初始化,包括一些参数,还有对redis的连接启动工作。在redis中保持的cache是永久保持,所以没有Gc的操作。
redis的连接初始化
四、memcache cache
github.com/astaxie/beego/cache/memcache/memcache.go
在init中注册
数据结构,其实就是对memcache的封装
初始化
在StartAndGc中,也只是做了一些初始化的工作,并没有实现GC操作,memcahce中已经存在。
Get分析
封装的是对memcache的Get操作
Put分析
封装的是memcache的Set操作,在构建Item中的时候已经设置了过期时间
五、ssdb cache
github.com/astaxie/beego/cache/ssdb/ssdb.go
在init中注册
数据结构,其实是对ssdb的封装
初始化
也是一样的,做了一些初始化工作,并没有提供GC的操作,这是因为GC的操作在ssdb中就已经存在。
Get分析
对ssdb的Get封装
Put分析
这里针对两中情况做了区分。
永久存储的调用的是ssdb的set操作
带有ttl存活时间的调用的是ssdb的setx操作。
六、总结
beego cache模块,模块设计简单,逻辑清晰,是一个很好的工作模式的案例。
龚浩华
月牙寂道长
QQ 29185807
2018年04月02日
以上是关于beego/cache源码分析---典型的工厂模式的主要内容,如果未能解决你的问题,请参考以下文章
设计模式 创建者模式 工厂设计模式 -- 抽象工厂设计模式介绍和实现