学习一门新的语言最好的方法当然是投入去用,和阅读别人优秀的代码啦,下面的cache2go就是非常适合萌新阅读的代码
caache2go就是一个缓存库,并发安全,有心跳机制
github地址:https://github.com/muesli/cache2go
项目结构如上,其实主要的就是cache.go, cacheitem.go,cachetable.go三个文件
先看cacheitem.go吧,里面主要就是key-value键值对的数据结构设计
可以看到里面的key和data都是一个空接口,因为go中所有数据类型都实现了空接口,所以这个空接口可以接受任何数据的值,对于一个初学者来说还是比较神奇的一种操作
这是保活的一个操作,对于刚接触可能比较疑惑的是加锁操作,我个人理解就是会变化的数据因为要保证并发安全,所以加锁是必须的,如果这数据要读,就加读锁,要读写,就直接整个锁
像下面的lifeSpan是这个数据的生存时间,在整个程序中设置了就不会改动的,自然不需要加锁,而AccesseddOn是最后一次访问时间,每次KeepAlive()就会改动的,你读自然是要加读锁的,比如你在写一个秒杀活动,如果不加锁,并发量大的话可能很多个用户都读到这个一样的数据,就可能会造成误差
下面我们看cachetable.go
这个就是整个类似redis的表啦,就是一个Map,非常的粗暴(简洁)
name就是这个表名字
cleanupTimer相当一个触发清理过期数据的触发器,cleanupInterval就是周期间隔
上面的函数呢就是检查表中有没有过期的元素的,有就删除,没有就更新下一次什么时候有元素过期了,就以这个最短的时间作为下一次的间隔嘛,这个也比较好理解,然后过了这么个间隔再次触发这个函数删除过期元素
下面就是添加元素调用的函数,如果一开始间隔是0的话就开始调用定期清理过期的函数嘛,如果已经不是0,那么也同样要调用,因为有新元素添加进来了,最短的间隔同样要更新嘛,比较不懂的是这个addInternal()为啥不也放在Add()里,这样如果不小心单独调用了addInternal()不是就GG了。。。
剩下的代码也没什么值得说了,可以自行阅读交流~