Redis ORM

使用 Redis 作为关系数据库的 ORM 框架
授权协议 MIT
开发语言 Google Go
所属分类 程序开发、 ORM/持久层框架
软件类型 开源软件
地区 国产
投 递 者 郑西岭
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

使用 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:分别查看表数据和索引。
  • nodejs实现redis ORM。即操作数据库的方式操作redis。 实现思路: 需要保存一条用户数据 name='test',age=22,sex=0 1.获取自增ID,自增ID=1 2.redis key=redis_proxy_user_1,生成规则为前缀+表名+自增ID,保存为redis的hash数据类型,即: hmset redis_proxy_user_1 name "test" a

  • 一、session持久化redis # 把session持久化到redis (需要导入flask-session依赖) #定义session Key app.config['SECRET_KEY'] = str(uuid4()) #选择session持久化的位置 (需要导入redis依赖) app.config['SESSION_TYPE'] = 'redis'

  • 需要引用的库、初始化方式等 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{ Ad

  • 我们的应用处理许多数据,这些数据的变动速度非常快。我们的主数据库(MySQL)根本无法跟上,因此我们在Redis中存储了很多“当前状态”数据。 现在,我们使用JSON对对象进行反序列化并存储整个对象。这导致了几个问题,因此我们将切换为单独存储每个字段。用于管理所有这些字段的代码很快就会变得棘手,因此我正在考虑为Redis构建通用ORM。其中一些已经存在,但没有我需要的所有功能(例如,具有管道的事务

  • ORM 对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping)。 通常指,数据库到程序内类对象的映射。 程序中使用ORM的好处 使用ORM,字段更改,编译器能做编译错误检查 直接使用数据库命令字符串,做修改,需要人工排查 使用ORM,隐藏背后数据库操作策略 能比较容易做到,直接调用Load()、Save()这样的简单函数,使用数

  • Redigo Redigo本质上也是一个Redis ORM库。 大部分人可能仅简单的使用了下它的pool、do等接口。 如果你认真阅读Redigo官方的帮助文档,你会发现不少意想不到的惊喜。 Redigo官方例子(1) c, err := dial() if err != nil { fmt.Println(err) return } defer c.Close() var p1

  • XXX模块 这是一个项目工程模板可以直接拿来用,使用Tortois-orm操作数据库,aerich进行数据库版本管理, 使用Docker部署,搭配gunicorn,uvicorn, 运行前, 简介 Python3.7 + FastAPI + MySQL + Redis + Tortoise-orm + aerich 参考各种教程自己搭建的一个项目模板 正好公司有个项目,就拿来实战演练了,喜欢的请点

 相关资料
  • 问题内容: 我想将Redis用作数据库,而不是缓存。根据我的(有限的)理解,Redis是一个内存数据存储。使用Redis有什么风险,如何减轻它们? 问题答案: 您可以通过多种不同方式将Redis用作权威存储: 打开 AOF (仅附加文件存储),请参阅AOF文档。这将实时记录针对您的数据集执行的所有Redis命令的日志。 使用主从复制运行Redis,请参阅复制文档。如果您的一个实例发生故障,这将使您

  • 问题内容: 我需要使用php创建一个具有大量数据的mysql数据库的解决方案。我的程序将有许多要求,我认为如果我使用缓存和OO数据库,我会得到很好的结果,但是我没有经验。 我认为,例如,如果我将保存在mysql中的信息缓存到redis数据库中,性能将会提高,但是我不知道这是否是个好主意,因此我希望有人来帮助我选择。 抱歉,如果我的英语不太好,我来自巴西。 问题答案: 是的,redis对此很有帮助。

  • 问题内容: 我想使用Yii2和redis作为数据库。 到目前为止,我从这里获得了Yii2的Redis ActiveRecord类。 链接1 链接2 但是,我遇到了问题。为什么该类在REDIS中添加为哈希? 除此之外,我找不到插入数据的模式。我添加了一个用户,它将在名称空间下添加一个用户,并在其下添加另一条记录,依此类推,但是主题都没有我在属性中定义的任何字段!仅包含ID。 我知道键值类型数据库和R

  • 问题内容: 在数据库中建立适当的关系对数据完整性以外的其他功能没有帮助吗? 它们会改善还是阻碍性能? 问题答案: 我不得不说,适当的关系将比省略它们更好地帮助人们理解数据(或数据的意图),特别是因为维护它们的总成本非常低。 它们的存在不会影响性能,除非是在体系结构方面(正如其他人指出的那样,数据完整性有时会导致外键冲突,这可能会产生某些影响),但是IMHO的许多好处(如果正确使用,则不胜枚举)。

  • 问题内容: 按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我有一个Django应用程序,该应用程序当前托管在Amazon的EC2服务上。我有两台计算机,一台使用Django应用程序,另一台使用我的PostgreSQL

  • 我正在与Laravel 5.4合作。我正在使用雄辩的ORM。我已经创建了以国家和州为单位的表格。二者的描述如下: 国家表: 国家表: 现在,我编写了两个方法来设置状态和国家表之间的关系。 国家型号: 状态模型: 现在,我将创建编辑功能,以便无法获取国家名称。 我已将查询写成 在这里,我得到的只有州数据和国家数据为空。 那么,为了获得州和国家数据,我应该做些什么改变呢?

  • 本文向大家介绍Hive与关系型数据库的关系?相关面试题,主要包含被问及Hive与关系型数据库的关系?时的应答技巧和注意事项,需要的朋友参考一下 没有关系,hive是数据仓库,不能和数据库一样进行实时的CURD操作。 是一次写入多次读取的操作,可以看成是ETL工具。

  • 主要内容:1. MySQL,2. SQL Server,3. Oracle,4. Access关系型数据库管理系统(RDBMS)有很多种,它们都有各自的优缺点,下表是由 DB-Engines 发布的 2020 年 11月份数据库排名榜单。 2020 年 11 月份 DB-Engines 榜单(前十名) 排名 数据库 类型 得分 1 Oracle 关系型数据库 1345.00 2 MySQL 关系型数据库 1241.64 3 Microsoft SQL Server 关系型数据库 1037.