redis_orm
Object Relational Mapping use redis as a relational database。
产出背景
项目的快速迭代,不仅需要敏捷的开发,还需具备较高性能的和稳定性,单纯用关系型数据库有瓶颈,然后在关系型数据库基础上加分布式缓存或者进程内缓存有增加了开发和维护成本,
刚好项目中在用Redis,就考虑基于Redis的Hash和SortedSet两个数据结构来设计类似关系型数据库的ORM。经过多个版本的迭代,现在已经实现了ORM的基本功能,在应用中发现维护和查看数据
不太方便,又开发了[工作台](https://github.com/weikaishio/redis_orm_workbench).
功能列表
- 基于对象的增、删、改、查、统计
- 基于Map的增、删、改、查、统计(方便用在redis_orm_workbench)
- 支持动态创建表、删除表、创建索引、重建索引
- 支持可配置的自动同步到MySql数据库(一般为了更方便的查询统计所用)
使用说明
TagIdentifier = "redis_orm"
TagIndex = "index"
TagUniqueIndex = "unique"
TagCombinedindex = "combinedindex"
TagDefaultValue = "dft"
TagPrimaryKey = "pk"
TagAutoIncrement = "autoincr"
TagSync2DB = "sync2db"
TagComment = "comment"
TagCreatedAt = "created_at"
TagUpdatedAt = "updated_at"
type Faq struct {
Id int64 `redis_orm:"pk autoincr sync2db comment 'ID'"`
Unique int64 `redis_orm:"unique comment '唯一'"`
Type uint32 `redis_orm:"dft 1 comment '类型'"`
Title string `redis_orm:"dft 'faqtitle' index comment '标题'"`
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 '组合索引(类型&标题)'"`
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)
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
}
engine.SetSync2DB(dbEngine, 90)
defer engine.Quit()
faq := &models.Faq{
Type: 1,
Title: "Title",
Unique: 111,
Content: "Content",
}
engine.Insert(faq)
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 []models.Faq
count, err := engine.Find(0, 100, searchCon, &ary)
if err != nil {
log.Error("Find(%v) err:%v", searchCon, err)
return
}
}
建议使用配套的redis_orm_workbench来管理,可以维护表结构、数据和索引,方便直接在上面新增、修改和删除行数据。
也可以直接用redis-cli来查看数据,前缀tb:和ix:分别查看表数据和索引。