使用Redis作为类关系数据库的ORM框架。产出背景项目的快速迭代,不仅需要敏捷的开发,还需具备较高性能的和稳定性,单纯用关系型数据库有瓶颈,然后在关系型数据库基础上加分布式缓存或者进程内缓存有增加了开发和维护成本,刚好项目中在用Redis,就考虑基于Redis的Hash和SortedSet两个数据结构来设计类似关系型数据库的ORM。经过多个版本的迭代,现在已经实现了ORM的基本功能,在应用中发现维护和查看数据不太方便,又开发了[工作台](https://github.com/weikaishio/redis_orm_workbench).功能列表基于对象的增、删、改、查、统计基于Map的增、删、改、查、统计(方便用在redis_orm_workbench)支持动态创建表、删除表、创建索引、重建索引支持可配置的自动同步到MySql数据库(一般为了更方便的查询统计所用)使用说明模型定义的标签说明TagIdentifier="redis_orm"//定义是否索引,索引名自动生成e.g.fmt.Sprintf("%s%s_%s",KeyIndexPrefix,strings.ToLower(table.Name),strings.ToLower(columnName)),TagIndex="index"//唯一索引hash和走zscore一样都是O(1)针对IndexType_IdMember有效,IndexType_IdScore的索引本来就是唯一的~TagUniqueIndex="unique"/*要支持一种查询条件就得增加一个索引,定义用&连接联合索引中的字段,e.g.Status&Uid组合索引字符串则唯一!集合数据结构决定;除非用int64,44或224或2222来存放Score,即44:前4个字节uint32和后4个字节uint321、id作为score,可以组合但是member唯一,唯一查询可用此情况下的组合索引,直接按顺序拼接即可2、id作为member,同一个member只能有一个score,该字段类型必须是长整型,数值索引可用,可以查询范围此情况下的组合索引,仅仅支持两整型字段,左边32位右边32位,支持范围查询的放左边*/TagCombinedindex="combinedindex"//默认值TagDefaultValue="dft"//是否主键TagPrimaryKey="pk"//自增~应用于主键TagAutoIncrement="autoincr"//配置在主键的tag上,配置了该tag才能生效,同步到数据库TagSync2DB="sync2db"//备注名TagComment="comment"//是否支持自动写创建时间TagCreatedAt="created_at"//是否支持自动写更新时间TagUpdatedAt="updated_at"模型例子typeFaqstruct{Idint64`redis_orm:"pkautoincrsync2dbcomment'ID'"`//主键自增备注是IDUniqueint64`redis_orm:"uniquecomment'唯一'"`//唯一索引Typeuint32`redis_orm:"dft1comment'类型'"`//默认值:1Titlestring`redis_orm:"dft'faqtitle'indexcomment'标题'"`//默认值faqtitle,索引,备注标题Contentstring`redis_orm:"dft'cnt'comment'内容'"`Heartsuint32`redis_orm:"dft10comment'点赞数'"`CreatedAtint64`redis_orm:"created_atcomment'创建时间'"`//入库时自动写创建时间UpdatedAtint64`redis_orm:"updated_atcomment'修改时间'"`TypeTitlestring`redis_orm:"combinedindexType&Titlecomment'组合索引(类型&标题)'"`//组合索引用到Type和Title两字段,字符串类型的索引,所以是唯一索引TypeHeartsint64`redis_orm:"combinedindexType&Heartscomment'组合索引(类型&赞数)'"`//组合索引非唯一索引}需要引用的库、初始化方式等import("github.com/mkideal/log""github.com/go-redis/redis""github.com/weikaishio/redis_orm""github.com/weikaishio/redis_orm/test/models")funcmain(){options:=redis.Options{Addr:"127.0.0.1:6379",Password:"",DB:1,}redisClient:=redis.NewClient(&options)//注:已省略redisClient可用性检测engine:=redis_orm.NewEngine(redisClient)engine.IsShowLog(true)driver:="mysql"host:="127.0.0.1:3306"database:="bg_db"username:="root"password:=""dataSourceName:=fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&&allowOldPasswords=1&parseTime=true",username,password,host,database)dbEngine,err:=xorm.NewEngine(driver,dataSourceName)iferr!=nil{log.Error("NewEngine:%s,err:%v",dataSourceName,err)return}//给redisORM对象设置同步到dbEngine数据库对象,每90秒同步一次engine.SetSync2DB(dbEngine,90)//退出之前会执行同步到DBdeferengine.Quit()faq:=&models.Faq{Type:1,Title:"Title",Unique:111,Content:"Content",}//插入数据engine.Insert(faq)//查询指定Id的数据model:=&models.Faq{Id:1,}has,err:=engine.Get(model)iferr!=nil{log.Error("Get(%d)err:%v",model.Id,err)return}//查询指定条件的数据searchCon:=NewSearchConditionV2(faq.Unique,faq.Unique,111)varary[]model.Faqcount,err:=engine.Find(0,100,searchCon,&ary)iferr!=nil{log.Error("Find(%v)err:%v",searchCon,err)return}//其他请见engine_curd.go、engine_curd_by_map.go里面的方法....更新、删除等功能,也可以看目录下面的测试代码}查看数据 建议使用配套的redis_orm_workbench来管理,可以维护表结构、数据和索引,方便直接在上面新增、修改和删除行数据。也可以直接用redis-cli来查看数据,前缀tb:和ix:分别查看表数据和索引。声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态
评论