Redis ORM 正在参加 2020 年度 OSC 中国开源项目评选,请投票支持!
Redis ORM 在 2020 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票让它出道
已投票
授权协议 MIT
开发语言 Google Go
操作系统 跨平台
软件类型 开源软件
开发厂商
地区 国产
提 交 者 TimWangjg
适用人群 未知
收录时间 2019-08-20

软件简介

使用 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:分别查看表数据和索引。
展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (0)

加载中
更多评论
暂无内容
发表于服务端专区
04/12 18:59

到底要不要用 ORM?ORM vs. 非 ORM 对比

我一直很喜欢使用 Go 的 database/sql 包来处理数据库。最近,一些涉及 Gorm 的问题激起了我对 Go 中 使用 ORM vs. 直接使用 database/sql 的好奇心。在 ORM 方面曾有过丰富的经验,所以我决定开始一个实验:利用...

0
0
发表了博客
2019/07/19 19:47

ORM

ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动 ORM是“对象-关系-映射”的简称。(Object Relational Mapping,简称...

0
0
发表了博客
2019/11/04 20:27

orm

[TOC] orm 对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。 这也同时暗示着额外的执行开销;然而,如果ORM作为一种中间件实现,则会有很多机会做优化,而这些在手...

0
0
发表了博客
2019/02/26 18:02

ORM

一、ORM简介 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术,简单的说:ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。 ORM在业务逻辑层和数据库层之间充当了桥梁的作用 二、Django中的ORM 2.1、D...

0
0
发表了博客
2018/11/15 13:03

ORM是什么?如何理解ORM?

一、ORM简介 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。那么,到底如何实现持久化呢?一种简单的方案是采用硬编码方式,为每一种可能...

0
0
2018/08/07 11:01

ORM

对象-关系映射(OBJECT/RELATIONALMAPPING,简称ORM),是随着面向对象的软件开发方法发展而产生的。用来把对象模型表示的对象映射到基于S Q L 的关系模型数据库结构中去。这样,我们在具体的操作实体对象的时候,...

0
0
发表了博客
2018/07/02 10:58

ORM概述及常用ORM框架

一、ORM ORM(Object-relational mapping),即对象关系映射,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。也就是说,ORM是通过使用描述对象和数据库之间映射的元数据(映射文件信息),将程序中的对象自动持久化到关系数据库中。 二、为什么使用ORM 我们知道后台操作数据库,通常是原生的ado.net,需...

0
0
发表了博客
2019/03/18 14:52

什么是ORM?为啥要是用ORM?

了解orm,先了解以下概念: 什么是“持久化” 持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。 什么是 “持久层” 持久层(Persistence Layer),即专注于实现数据持...

0
0
发表了博客
04/30 10:58

轻量级.NET ORM、高性能.NET ORM 之 SqlSugar 开源ORM - ASP.NET

3.0最新API: http://www.cnblogs.com/sunkaixuan/p/5911334.html 1、前言/Preface SqlSugar从去年到现在已经一年了,版本从1.0升到了现在的2.8 ,这是一个稳定版本 ,有数家公司已经项目上线,在这里我将SqlSugar的功能重新整理成一篇新的贴子,希望大家喜欢。 公司团队项目、产品已经完全抛弃EF,SqlSugar定位不是ORM...

0
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
0 评论
9 收藏
分享
返回顶部
顶部