golang实现自定义驱动的Cache

近期在写 ActivedRouter项目的时候需求一个缓存模型,要求缓存模型支持不同驱动,例如:memory、file、redis、mysql,实现思路代码如下:


cache.go文件,定义缓存对外接口

//ActivedRouter
//Author:usher.yue
//Amail:usher.yue@gmail.com
//TencentQQ:4223665
//缓存驱动接口定义
//可以自定义扩展驱动类型 默认是 memory driverpackage cacheimport ("./driver"
)//cache接口声明
type Cacher interface {GetStorage() driver.ContainererSet(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实现了,具体其他驱动可自行实现

//ActivedRouter
//Author:usher.yue
//Amail:usher.yue@gmail.com
//TencentQQ:4223665
//缓存驱动接口定义
//可以自定义扩展驱动类型 默认是 memory cachepackage driver//容器接口声明
type Containerer interface {PushKVPair(k, v interface{}) ContainererEraseKVPair(k interface{}) ContainererPushKVMaps(maps ...map[string]interface{}) ContainererResetKVPair(k string, v interface{}) ContainererResetOrAddKVPair(k string, v interface{}) ContainererResetKVPairs(kvMaps map[string]interface{}) ContainererResetOrAddKVPairs(kvMaps map[string]interface{}) ContainererExist(k interface{}) boolGetData() *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] = vreturn 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
}













本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【自定义控件】c#winform自定义控件实现标签控件

介绍首先我们设计这个控件的时候要明白控件是怎样交互的, 熟悉b站的小伙伴应该知道 ,我们上传视频的时候会去选择标签 ,我们输入标签文本 按下回车就代表该标签已经添加成功了,效果图如下!控件拆分我们首先拆分一下该控…

ASP.NET 使用Ajax(转)

之前在Ajax初步理解中介绍了对Ajax的初步理解,本文将介绍在ASP.NET中如何方便使用Ajax,第一种当然是使用jQuery的ajax,功能强大而且操作简单方便,第二种是使用.NET封装好的ScriptManager。 $.ajax向普通页面发送get请求 这是最简单…

fir.im 持续集成技术实践

互联网时代,人人都在追求产品的快速响应、快速迭代和快速验证。不论是创业团队还是大中型企业,都在探索属于自己的敏捷开发、持续交付之道。fir.im 团队也在全面实施敏捷,并推出新持续集成服务— flow.ci ,以帮助企业将开发测试流…

宇宙最強的IDE - Visual Studio 25岁生日快乐

每位开发者从入门开始或多或少都会接触过 Visual Studio , 现今的 Visual Studio 除了支持传统的 C , C# , Visual Basic.NET ,F# 的编程语言外,还可以做 Python , Node.js 的开发。在应用场景上也从单一的桌面应用,延伸到 Web , …

有没有一段代码,让你觉得人类的智慧也可以璀璨无比?【转】

转自:https://www.zhihu.com/question/30262900 作者:烧茄子链接:https://www.zhihu.com/question/30262900/answer/48741026来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。当然是这个…

如何使用 abp 创建 module 并应用单独的数据库迁移

最近在学习使用 abp 来做一些小程序。abp 是一个功能丰富的 .NET 开发框架,完全开源,遵循 DDD(领域驱动)设计模式,支持微服务开发,集成了 Identity、角色权限、本地化、动态代理、后台任务、分布式消息、审…

MinGW安装和使用基础教程

MinGW全称Minimalist GNU For Windows,是个精简的Windows平台C/C、ADA及Fortran编译器,相比Cygwin而言,体积要小很多,使用较为方便。MinGW提供了一套完整的开源编译工具集,以适合Windows平台应用开发,且不依…

px,em,rem,vw单位在网页和移动端的应用

px: 是网页设计中最常用的单位,然而1px到底是多大长,恐怕没有人能回答上来 它用来表示屏幕设备物理上能显示的最小的一个点,这个点不是固定宽度的,不同设备上点的长度、比例有可能会不同。 假设:你现在用的…

cs-Panination

ylbtech-Unitity: cs-PaninationPager.cs IPagingOption.cs IPagedList.cs PagingOption.cs PagedList.cs PagingExtensions.cs 1.A,效果图返回顶部 1.B,源代码返回顶部1.B.1,Pager.cs using System; using System.Collections.Generic; using System.Linq; using System.Text…

SignalR的使用

什么是 SignalR?ASP.NET Core SignalR 是一个开放源代码库,可用于简化向应用添加实时 Web 功能。实时 Web 功能使服务器端代码能够将内容推送到客户端。适合 SignalR 的候选项:需要从服务器进行高频率更新的应用。示例包括游戏、社交网络、投…

NHibernate之旅(7):初探NHibernate中的并发控制

本节内容 什么是并发控制? 悲观并发控制(Pessimistic Concurrency)乐观并发控制(Optimistic Concurrency)NHibernate支持乐观并发控制实例分析结语什么是并发控制? 当很多人试图同一时候改动数据库中的数据时,必须实现一个控制系统&#xff0…

期望DP

期望DP的一般做法是从末状态開始递推: Problem DescriptionAkemi Homura is a Mahou Shoujo (Puella Magi/Magical Girl).Homura wants to help her friend Madoka save the world. But because of the plot of the Boss Incubator, she is trapped in a labyrinth …

神奇的[Caller*]属性

前言上次,我们《使用 CallerArgumentExpression 检查弃元参数》,它实际是利用编译器编译时将变量名称传入。其实,.NET中提供了多个[Caller*]属性,帮助我们轻松获取调用者信息。CallerFilePathAttribute允许获取包含调用方的源文件…

java dateTime + long

2019独角兽企业重金招聘Python工程师标准>>> public static void main(String[] args) throws Exception{SimpleDateFormat sdfnew SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // long timeStartsdf.parse("2011-09-20 12:30:45").getTime();l…

.NET Core中异常过滤器ExceptionFilter的使用介绍

介绍实现需要继承IExceptionFilter 或 IAsyncExceptionFilter。可用于实现常见的错误处理策略。使用场景首先讲一下我们为什么要使用异常过滤器 ,如果业务场景复杂,只使用HttpStatusCode,抛出异常后,后期要加很多字段来描述。那么这种就比较不…

程序一启动检查网络,如果没有网络就退出程序

转载于:https://www.cnblogs.com/songxing10000/p/4823812.html

看小说的这些年

从大一开始,就开始看起了小说,不是那种名著类型,而是快餐小说,玄幻、都市、言情、科幻,什么都会看,因为看多了,就会发现,已经没什么可以看的。 谈起快餐小说,已经有很多被…

COMA(一): Learning to Communicate with Deep Multi-Agent Reinforcement Learning 论文讲解

Learning to Communicate with Deep Multi-Agent Reinforcement Learning 论文讲解 论文链接:https://papers.nips.cc/paper/6042-learning-to-communicate-with-deep-multi-agent-reinforcement-learning.pdf (这篇论文是COMA三部曲中的第&#xff08…

C和指针之指针数组和指向数组的指针

1、指针数组 定义一个指针数组,该数组中每个元素是一个指针,每个指针指向哪里就需要程序中后续再定义int *p[10]; 2、指向数组的指针 定义一个数组指针,该指针指向含10个元素的一维数组(数组中每个元素是int型)int (*p…

SSH 远程执行任务

SSH 是 Linux 下进行远程连接的基本工具,但是如果仅仅用它来登录那可是太浪费啦!SSH 命令可是完成远程操作的神器啊,借助它我们可以把很多的远程操作自动化掉!下面就对 SSH 的远程操作功能进行一个小小的总结。远程执行命令如果我…