博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
beego/cache源码分析---典型的工厂模式
阅读量:4030 次
发布时间:2019-05-24

本文共 2082 字,大约阅读时间需要 6 分钟。

本文公众号文章链接:

本文csdn博客文章链接:

 

 

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日

 

 

 

 

 

 

 

第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注

你可能感兴趣的文章
Android下调用收发短信邮件等(转载)
查看>>
Android中电池信息(Battery information)的取得
查看>>
SVN客户端命令详解
查看>>
Android/Linux 内存监视
查看>>
Linux系统信息查看
查看>>
用find命令查找最近修改过的文件
查看>>
Android2.1消息应用(Messaging)源码学习笔记
查看>>
在android上运行native可执行程序
查看>>
Phone双模修改涉及文件列表
查看>>
android UI小知识点
查看>>
Android之TelephonyManager类的方法详解
查看>>
android raw读取超过1M文件的方法
查看>>
ubuntu下SVN服务器安装配置
查看>>
MPMoviePlayerViewController和MPMoviePlayerController的使用
查看>>
CocoaPods实践之制作篇
查看>>
[Mac]Mac 操作系统 常见技巧
查看>>
苹果Swift编程语言入门教程【中文版】
查看>>
捕鱼忍者(ninja fishing)之游戏指南+游戏攻略+游戏体验
查看>>
iphone开发基础之objective-c学习
查看>>
iphone开发之SDK研究(待续)
查看>>