## 技术方面 ### 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关联均失败