前言
基于某些场景,我们需要对项目内redis操作,进行切面操作,他包括但不限于:
- 高频同key熔断,防止组员死循环写蹦redis集群。
- 错误收集,对
conn.Do("set","uname","tommy","a wrong arg")
类回避错误的写法,能够收集到错误信息。 - 统计实时redis流量
总之,在某些时候,我们需要对redis操作,进行切面化运作。在实现这种场景时,我们必须保障:
- 不侵入或极少侵入业务代码。
- 拓展灵活。
声明
本次的解决方案,仅解决golang下github.com/garyburd/redigo包的切面拓展
解决方案
仓库: github.com/fwhezfwhez/rediy
最佳实践
2.1 高频熔断
- rediy提供实现好的100w/10s 同key高频熔断
- 如果需要自己订制,可以复制一份,自行修改
rediy.Use(rediy.FuseHighFrequency)
2.2 实时错误捕捉
- 本类中间件适合放在最上面Use()
- 即使写法无视错误,该中间件依旧能捕捉到
package main
import (
"fmt"
"github.com/fwhezfwhez/rediy"
)
func main() {
pool := rediy.NewPool("localhost:6379", "", 0)
rediy.Use(reportErr)
conn := pool.Get()
defer conn.Close()
conn.Do("set", "uname", "ft", "wrong-arg") // writing style will ignore error,but will captured in reportErr
}
func reportErr(c *rediy.Context) {
c.Next()
if c.Reply.Err() != nil {
fmt.Println("recv err", c.Reply.Err().Error())
return
}
}