golang实现自定义Cache模型
有时候我们在我们自己的项目中需要实现兼容各种驱动的Cache模型,以便于通过配置更换缓存类型。 缓存模型需要支持不同驱动,例如:memory、file、redis、mysql,实现思路代码如下: cache.go文件,定义缓存对外接口模型代码//可以自定义扩展驱动类型 默认是 memory driver package cache import ( "./driver" ) //cache接口声明 type Cacher interface { GetStorage() driver.Containerer Set(k string, v interface{}) Get(k string) (interface{}, bool) Del(k string) Has(k string) bool } //create memory cache //type "file" or "memory" func Newcache(cacheType string) Cacher { switch cacheType { case "memory": return &driver.CacheImpl{Driver: driver.NewMapContainer()} case "file": { return &driver.CacheImpl{Driver: driver.NewFileContainer()} } case "mysql": { return &driver.CacheImpl{Driver: driver.NewMysqlContainer()} } case "redis": { return &driver.CacheImpl{Driver: driver.NewRedisContainer()} } case "mongodb": { return &driver.CacheImpl{Driver: driver.NewMongoContainer()} } } return nil }driver.go 实现驱动,这里我只利用Map实现了,具体其他驱动可自行实现//可以自定义扩展驱动类型 默认是 memory cache package driver //容器接口声明 type Containerer interface { PushKVPair(k, v interface{}) Containerer EraseKVPair(k interface{}) Containerer PushKVMaps(maps ...map[string]interface{}) Containerer ResetKVPair(k string, v interface{}) Containerer ResetOrAddKVPair(k string, v interface{}) Containerer ResetKVPairs(kvMaps map[string]interface{}) Containerer ResetOrAddKVPairs(kvMaps map[string]interface{}) Containerer Exist(k interface{}) bool GetData() *map[string]interface{} } //基于内存实现的缓存 type CacheImpl struct { Driver Containerer //数据缓存驱动 } func (self *CacheImpl) Exist(k interface{}) bool { return self.Driver.Exist(k) } func (self *CacheImpl) GetStorage() Containerer { return self.Driver } //set func (self *CacheImpl) Set(k string, v interface{}) { self.Driver.PushKVPair(k, v) } //get func (self *CacheImpl) Get(k string) (interface{}, bool) { mapData := *self.Driver.GetData() val, ok := mapData[k] return val, ok } //erase func (self *CacheImpl) Del(k string) { self.Driver.EraseKVPair(k) } //has func (self *CacheImpl) Has(k string) bool { mapData := *self.Driver.GetData() _, ok := mapData[k] return ok } //Map实现的内存驱动 type MapContainer struct { data map[string]interface{} } //创建数据channer func NewMapContainer() *MapContainer { return &MapContainer{data: make(map[string]interface{})} } func (this *MapContainer) PushKVPair(k, v interface{}) Containerer { if key, ok := k.(string); !ok { panic("key必须是string类型!") } else { this.data[key] = v } return this } func (this *MapContainer) Exist(k interface{}) bool { return true } func (this *MapContainer) EraseKVPair(k interface{}) Containerer { if key, ok := k.(string); !ok { panic("key必须是string类型!") } else { delete(this.data, key) } return this } func (this *MapContainer) PushKVMaps(maps ...map[string]interface{}) Containerer { for _, itemMap := range maps { for itemKey, itemValue := range itemMap { this.PushKVPair(itemKey, itemValue) } } return this } func (this *MapContainer) ResetKVPair(k string, v interface{}) Containerer { if _, ok := this.data[k]; ok { this.data[k] = v } return this } func (this *MapContainer) ResetOrAddKVPair(k string, v interface{}) Containerer { this.data[k] = v return this } func (this *MapContainer) ResetKVPairs(kvMaps map[string]interface{}) Containerer { for k, v := range kvMaps { if _, ok := this.data[k]; ok { this.data[k] = v } } return this } func (this *MapContainer) ResetOrAddKVPairs(kvMaps map[string]interface{}) Containerer { for k, v := range kvMaps { this.data[k] = v } return this } func (this *MapContainer) GetData() *map[string]interface{} { return &this.data }
到此一个基础Memory类型的驱动就构建完成 ,我们也可以通过这个模型去构建 redis、mysql等等驱动实现自定义缓存。
COVID19推动物联网在石油和天然气领域的采用Inmarsat的一项调查报告称,74的参与调查者至少部署了一个物联网项目。在从2020年第二季度开始的12个月中,44的人采取了这一步骤。在尚未采用任何物联网项目的26中,所有人
荣耀智慧屏X2体验这就是客厅C位的最佳选择自从荣耀推出智慧屏产品,家庭的智慧生活格局就迎来了全面的升级。智慧屏不仅仅是影音享受的工具,更是成为了家庭的智慧中枢。最近荣耀又带来了全新产品荣耀智慧屏X2,在优秀屏幕素质,越级影
春剑的养护技巧,如何才能养护好并且开花?春剑在每年的5月份左右开始长出叶芽,而花芽形成则在每年的8月中旬左右,等到10月份左右花苞才开始破土而出,花期一般在13月份之间,开花周期大概在一个月左右。春剑喜欢温暖湿润的生长环
杜鹃花的养护技巧杜鹃的生长适温为1225,夏季气温超过30时,杜鹃的枝梢叶片基本上停止生长,整个植株处于半休眠状态。这就是为什么我们看到杜鹃在高温环境下,枝叶反而没有什么变化。所以我们在夏季要注意
蝴蝶兰如何养护才能开花很多?谈起兰花,几乎都是接受不了强光的照射。因为原生于山林间,潜伏在基因里面的生长习性难以改变。蝴蝶兰也无法抵挡强光的照射,那样会损伤根部及叶片。反之,全阴的位置也不利于生长,那样叶片无
vivo子品牌的新一代旗舰机型iQOO8和iQOO8pro热点都在哪里?首先,从处理器性能来看iQOO8是骁龙888芯片LPPDR5UFS3。1组合,iQOO8pro是骁龙888plus芯片LPPDR5UFS3。1组合,两者都具备独立显示的游戏芯片机身
2021年8月新品首发热门手机都有谁入选?当8月即将进入结尾时刻,在百花齐放的手机市场里,目前市场热度较高的新品手机里,基本上也就围绕着这三家展开的荣耀magic3系列,vivo的子品牌iQOO8系列,小米MIX4,那么关
这样选择智能手机都不会吃亏现在的智能手机类目几乎是五花八门,季季都有新款,厂商的不断广告炒作让我们很多人都不知道该怎么选择?有时候被销售员洗脑,买回来才发现,根本就不是那么回事?图片源自网络,仅供参考那么今
有人热议荣耀Magic3系列和华为Mate50有关系?准确的来说,荣耀Magic系列和华为Mate50系列真没有一点关系的亲!因为目前华为Mate50系列还因为制裁而在艰难的探索之中,要不然也不会让荣耀品牌从华为整体剥离了,因为剥离后
清新空气一键搞定思乐智CAPS400A空气净化器链接视频10月国庆一过,浙江沪包邮地区的气温就会有一个断崖式的下跌。除了感受到江南的魔法攻击之外,一家人也逐渐减少了出门的时间。但是随着居家时间的越来越多,室内空气质量又成了我很关
安静又暖心,清凉高颜值洛斐有范儿桌面风扇很多熟悉二毛的朋友对洛斐应该已经不陌生了,二毛已经在给大家分享过多款洛斐的趣味办公用品小浪无线蓝牙键盘小瓣鼠标拾光灯等等产品。可以说在颜值界洛斐称第二,没人敢称第一,而洛斐又不单单