使用 Redis 作为关系数据库的 ORM 框架 Redis ORM

MIT
Google Go
跨平台
2019-08-20
TimWangjg

使用 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个字节uint32
    			1、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"
  • 模型例子
type Faq struct {
	Id         int64  `redis_orm:"pk autoincr sync2db comment 'ID'"` //主键 自增 备注是ID
	Unique     int64  `redis_orm:"unique comment '唯一'"` //唯一索引
	Type       uint32 `redis_orm:"dft 1 comment '类型'"` //默认值:1
	Title      string `redis_orm:"dft 'faqtitle' index comment '标题'"` //默认值 faqtitle, 索引,备注 标题
	Content    string `redis_orm:"dft 'cnt' comment '内容'"`
	Hearts     uint32 `redis_orm:"dft 10 comment '点赞数'"`
	CreatedAt  int64  `redis_orm:"created_at comment '创建时间'"` //入库时自动写创建时间
	UpdatedAt  int64  `redis_orm:"updated_at comment '修改时间'"`
	TypeTitle  string `redis_orm:"combinedindex Type&Title comment '组合索引(类型&标题)'"` //组合索引 用到Type和Title两字段,字符串类型的索引,所以是唯一索引 
	TypeHearts int64  `redis_orm:"combinedindex Type&Hearts comment '组合索引(类型&赞数)'"` //组合索引 非唯一索引
}
  • 需要引用的库、初始化方式等
import (   
	"github.com/mkideal/log"
	"github.com/go-redis/redis" 
	"github.com/weikaishio/redis_orm"
	"github.com/weikaishio/redis_orm/test/models"
) 

func main() {
	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)
	if err != nil {
		log.Error("NewEngine:%s,err:%v", dataSourceName, err)
		return
    }
	//给redisORM对象设置同步到dbEngine数据库对象,每90秒同步一次
    engine.SetSync2DB(dbEngine, 90)
	//退出之前会执行同步到DB
	defer engine.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)
   	if err != nil {
   		log.Error("Get(%d) err:%v", model.Id, err)
   		return
    }
    	
	//查询指定条件的数据
	searchCon := NewSearchConditionV2(faq.Unique, faq.Unique, 111)
	var ary []model.Faq
	count, err := engine.Find(0, 100, searchCon, &ary)
	if err != 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:分别查看表数据和索引。
的码云指数为
超过 的项目
加载中

评论(0)

暂无评论

暂无资讯

暂无问答

一个支持分布式缓存的orm

给Orm 追加了分布式redis的支持, 目的是为了解决游戏服务器开发时, 数据变更的快速处理。 感兴趣的同学可以看一下。 go get github.com/ablegao/orm...

2015/01/22 00:20
207
0
xorm操作PostgreSQL数据库(增删改查实例)

一、xorm介绍 xorm是一个简单而强大的Go语言ORM库.通过它可以使数据库操作非常简便。xorm的目标并不是让你完全不去学习SQL,我们认为SQL并不会为ORM所替代,但是ORM将可以解决绝大部分的简单...

2018/11/27 15:44
230
0
nodejs ORM框架sequelize

| star比较多的ORM框架 ORM框架选型标准,支持原生SQL语句,支持连接池,支持事务 name star sequelize 19.9k mongoose 19.4k knex 10.5k Bookshelf 5.7k waterline 5.1k 以上数据截止2019....

09/18 17:53
17
0
Spring data redis应用示例

1、什么是SDR 就跟orm有hibernate和mybatis一样,redis也有众多的Java客户端,例如jedis,jredis,jdbc-redis和rcj等,当然他们肯定没法兼容,如果你在项目中使用了某种客户端,那当你因为某...

2016/10/09 09:57
24
0
JeeSpringCloudV3.0 互联网云快速开发平台

JeeSpringCloudV3.0 - 互联网云快速开发框架 码云GVP (一款免费开源的JAVA互联网云快速开发平台) 当前最新版本: 2.5(发布日期:20180829) 当前最新版本: 3.0(发布日期:20181015) 一...

2018/08/29 10:19
712
3
Golang 开源库

PostgreSQL链接库; https://github.com/bmizerany/pq MarkDown解析库 https://github.com/russross/blackfriday Redis链接库 https://github.com/alphazero/Go-Redis 配置文件读取库 https:...

2013/03/30 09:23
551
0
ThinkGo:一个轻量级的 Go 语言 MVC 框架

ThinkGo 是一个轻量级的 Go 语言 MVC 框架,目前支持路由、中间件、控制器、请求、响应、Session、视图、日志、缓存、ORM等 web 框架应该具备的基本功能,ThinkGo致力于让代码简洁且富于表达...

02/14 13:34
5
0
PHP攻城狮培养计划 PHP高级应用及Laravel5初识

qq-3589905092 团购联系 步骤1: PHP的Redis应用及HTTP协议 认识Redis缓存,学会使用Redis相关操作函数,实现网站优化;并使用Redis实现消息队列,减轻数据高峰时的服务器压力,熟悉HTTP协议工...

2018/07/27 21:16
100
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部