0
点赞
收藏
分享

微信扫一扫

解决方案(11) redis切面操作

gy2006_sw 2022-11-22 阅读 87


前言

基于某些场景,我们需要对项目内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
}
}


举报

相关推荐

0 条评论