使用Redis作为类关系数据库的ORM框架。
产出背景项目的快速迭代,不仅需要敏捷的开发,还需具备较高性能的和稳定性,单纯用关系型数据库有瓶颈,然后在关系型数据库基础上加分布式缓存或者进程内缓存有增加了开发和维护成本,刚好项目中在用Redis,就考虑基于Redis的Hash和SortedSet两个数据结构来设计类似关系型数据库的ORM。经过多个版本的迭代,现在已经实现了ORM的基本功能,在应用中发现维护和查看数据不太方便,又开发了[工作台](https://github.com/weikaishio/redis_orm_workbech).功能列表基于对象的增、删、改、查、统计基于Map的增、删、改、查、统计(方便用在redis_orm_workbech)支持动态创建表、删除表、创建索引、重建索引支持可配置的自动同步到MySql数据库(一般为了更方便的查询统计所用)使用说明模型定义的标签说明TagIdetifier="redis_orm"//定义是否索引,索引名自动生成e.g.fmt.Spritf("%s%s_%s",KeyIdexPrefix,strigs.ToLower(table.Name),strigs.ToLower(columName)),TagIdex="idex"//唯一索引hash和走zscore一样都是O(1)针对IdexType_IdMember有效,IdexType_IdScore的索引本来就是唯一的~TagUiqueIdex="uique"/*要支持一种查询条件就得增加一个索引,定义用&连接联合索引中的字段,e.g.Status&Uid组合索引字符串则唯一!集合数据结构决定;除非用it64,44或224或2222来存放Score,即44:前4个字节uit32和后4个字节uit321、id作为score,可以组合但是member唯一,唯一查询可用此情况下的组合索引,直接按顺序拼接即可2、id作为member,同一个member只能有一个score,该字段类型必须是长整型,数值索引可用,可以查询范围此情况下的组合索引,仅仅支持两整型字段,左边32位右边32位,支持范围查询的放左边*/TagCombiedidex="combiedidex"//默认值TagDefaultValue="dft"//是否主键TagPrimaryKey="pk"//自增~应用于主键TagAutoIcremet="autoicr"//配置在主键的tag上,配置了该tag才能生效,同步到数据库TagSyc2DB="syc2db"//备注名TagCommet="commet"//是否支持自动写创建时间TagCreatedAt="created_at"//是否支持自动写更新时间TagUpdatedAt="updated_at"模型例子typeFaqstruct{Idit64`redis_orm:"pkautoicrsyc2dbcommet'ID'"`//主键自增备注是IDUiqueit64`redis_orm:"uiquecommet'唯一'"`//唯一索引Typeuit32`redis_orm:"dft1commet'类型'"`//默认值:1Titlestrig`redis_orm:"dft'faqtitle'idexcommet'标题'"`//默认值faqtitle,索引,备注标题Cotetstrig`redis_orm:"dft'ct'commet'内容'"`Heartsuit32`redis_orm:"dft10commet'点赞数'"`CreatedAtit64`redis_orm:"created_atcommet'创建时间'"`//入库时自动写创建时间UpdatedAtit64`redis_orm:"updated_atcommet'修改时间'"`TypeTitlestrig`redis_orm:"combiedidexType&Titlecommet'组合索引(类型&标题)'"`//组合索引用到Type和Title两字段,字符串类型的索引,所以是唯一索引TypeHeartsit64`redis_orm:"combiedidexType&Heartscommet'组合索引(类型&赞数)'"`//组合索引非唯一索引}需要引用的库、初始化方式等import("github.com/mkideal/log""github.com/go-redis/redis""github.com/weikaishio/redis_orm""github.com/weikaishio/redis_orm/test/models")fucmai(){optios:=redis.Optios{Addr:"127.0.0.1:6379",Password:"",DB:1,}redisCliet:=redis.NewCliet(&optios)//注:已省略redisCliet可用性检测egie:=redis_orm.NewEgie(redisCliet)egie.IsShowLog(true)driver:="mysql"host:="127.0.0.1:3306"database:="bg_db"userame:="root"password:=""dataSourceName:=fmt.Spritf("%s:%s@tcp(%s)/%s?charset=utf8mb4&&allowOldPasswords=1&parseTime=true",userame,password,host,database)dbEgie,err:=xorm.NewEgie(driver,dataSourceName)iferr!=il{log.Error("NewEgie:%s,err:%v",dataSourceName,err)retur}//给redisORM对象设置同步到dbEgie数据库对象,每90秒同步一次egie.SetSyc2DB(dbEgie,90)//退出之前会执行同步到DBdeferegie.Quit()faq:=&models.Faq{Type:1,Title:"Title",Uique:111,Cotet:"Cotet",}//插入数据egie.Isert(faq)//查询指定Id的数据model:=&models.Faq{Id:1,}has,err:=egie.Get(model)iferr!=il{log.Error("Get(%d)err:%v",model.Id,err)retur}//查询指定条件的数据searchCo:=NewSearchCoditioV2(faq.Uique,faq.Uique,111)varary[]model.Faqcout,err:=egie.Fid(0,100,searchCo,&ary)iferr!=il{log.Error("Fid(%v)err:%v",searchCo,err)retur}//其他请见egie_curd.go、egie_curd_by_map.go里面的方法....更新、删除等功能,也可以看目录下面的测试代码}查看数据 建议使用配套的redis_orm_workbech来管理,可以维护表结构、数据和索引,方便直接在上面新增、修改和删除行数据。也可以直接用redis-cli来查看数据,前缀tb:和ix:分别查看表数据和索引。点击空白处退出提示
评论