|
|
|
@ -0,0 +1,72 @@ |
|
|
|
## 技术方面 |
|
|
|
|
|
|
|
### gredis |
|
|
|
|
|
|
|
配置 |
|
|
|
|
|
|
|
```yaml |
|
|
|
redis: |
|
|
|
default: |
|
|
|
address: 端口+地址 |
|
|
|
db: 数据库编号 |
|
|
|
pass: 密码 |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
String : Set/Get |
|
|
|
|
|
|
|
```go |
|
|
|
var,err:=g.Redis().Set(ctx,"key","value")//设置string类型数据 |
|
|
|
value,err:=g.Redis().Get(ctx,"key")//获取string类型数据,value为*gvar.Var格式 |
|
|
|
err:=g.Redis().SetEx(ctx,"key","value",ttl)//设置值并设定ttl |
|
|
|
|
|
|
|
g.Redis().Do(ctx,"SET",key,value)//根据传入的参数顺序拼接redis语句,按每个关键词/值进行拆分 |
|
|
|
|
|
|
|
//获取redis长链接 |
|
|
|
conn,_:=g.Redis().conn(ctx) |
|
|
|
defer conn.Close() |
|
|
|
|
|
|
|
conn.Do()//执行命令 |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### gdb钩子 |
|
|
|
|
|
|
|
```go |
|
|
|
//钩子类型: |
|
|
|
Select Insert Update Delete |
|
|
|
type HookHandler struct{ |
|
|
|
Select HookFuncSelect |
|
|
|
Insert HookFuncInsert |
|
|
|
Update HookFuncUpdate |
|
|
|
Delete HookFuncDelete |
|
|
|
} |
|
|
|
|
|
|
|
//注册方法: |
|
|
|
func (m *Model)Hook(hook HookHandler) *Model{} |
|
|
|
|
|
|
|
//使用方法: |
|
|
|
1.初始化钩子 |
|
|
|
hook:=gdb.HookHandler{ |
|
|
|
Select:func (ctx context.Context,in *gdb.HookSelectInput)(result gdb.Result,err error){ |
|
|
|
//这里写相应的处理逻辑 |
|
|
|
result,err:=in.Next(ctx)//此处之前是Before钩子,此处之后是After钩子 |
|
|
|
} |
|
|
|
} |
|
|
|
2.绑定钩子 |
|
|
|
g.Model("table").Hook(hook)//一次性使用 |
|
|
|
func init(){ |
|
|
|
g.DB().Model("table").Hook(hook)//全局使用 |
|
|
|
} |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
在demo项目中添加了新的课程查询功能,在查询时加入了redis做缓存中间件,查询时先看redis内有没有数据,有则直接返回缓存数据,没有再请求数据库 |
|
|
|
|
|
|
|
添加了数据库钩子,在增删改操作中绑定了全局钩子,如果进行了增删改操作则删除redis中缓存的课程List,保证不会读到未修改的脏数据 |
|
|
|
|
|
|
|
现想添加课程-用户的多对多联合查询,但目前尝试了ScanList和With关联均失败 |
|
|
|
|