Redis

Example

项目地址Redis - 图1 (opens new window)

Redis配置

  1. type config struct {
  2. Addrs []string // Addrs 实例配置地址
  3. Addr string // Addr stubConfig 实例配置地址
  4. Mode string // Mode Redis模式 cluster|stub|sentinel
  5. MasterName string // MasterName 哨兵主节点名称,sentinel模式下需要配置此项
  6. Password string // Password 密码
  7. DB int // DB,默认为0, 一般应用不推荐使用DB分片
  8. PoolSize int // PoolSize 集群内每个节点的最大连接池限制 默认每个CPU10个连接
  9. MaxRetries int // MaxRetries 网络相关的错误最大重试次数 默认8次
  10. MinIdleConns int // MinIdleConns 最小空闲连接数
  11. DialTimeout time.Duration // DialTimeout 拨超时时间
  12. ReadTimeout time.Duration // ReadTimeout 读超时 默认3s
  13. WriteTimeout time.Duration // WriteTimeout 读超时 默认3s
  14. IdleTimeout time.Duration // IdleTimeout 连接最大空闲时间,默认60s, 超过该时间,连接会被主动关闭
  15. Debug bool // Debug开关, 是否开启调试,默认不开启,开启后并加上export EGO_DEBUG=true,可以看到每次请求,配置名、地址、耗时、请求数据、响应数据
  16. ReadOnly bool // ReadOnly 集群模式 在从属节点上启用读模式
  17. SlowLogThreshold time.Duration // 慢日志门限值,超过该门限值的请求,将被记录到慢日志中
  18. OnFail string // OnFail panic|error
  19. EnableMetricInterceptor bool // 是否开启监控,默认开启
  20. EnableAccessInterceptor bool // 是否开启,记录请求数据
  21. EnableAccessInterceptorReq bool // 是否开启记录请求参数
  22. EnableAccessInterceptorRes bool // 是否开启记录响应参数
  23. }

用户配置

  1. # 常用的stub单实例配置示例
  2. [redis.stub]
  3. debug = true # ego增加redis debug,打开后可以看到,配置名、地址、耗时、请求数据、响应数据
  4. mode = "stub" # 默认为stub单实例模式,可选"stub|cluster|sentinel"
  5. addr = "127.0.0.1:6379"
  6. # cluster集群模式配置示例
  7. [redis.cluster]
  8. debug = true
  9. mode = "cluster" # 设置为"cluster"模式,该模式下必须配置"addrs"
  10. addrs = ["127.0.0.1:6379", "127.0.0.1:6380", "127.0.0.1:6381"] # cluster模式下必须配置"addrs"
  11. # sentinel哨兵模式配置示例
  12. [redis.sentinel]
  13. debug = true
  14. mode = "sentinel" # 设置为"sentinel"模式,该模式下必须配置"addrs"和"masterName"
  15. addrs = ["127.0.0.1:26379", "127.0.0.1:26380", "127.0.0.1:26381"] # sentinel模式下必须配置"addrs"
  16. masterName = "my-sentinel-master-name" # sentinel 模式下必须配置"masterName"

优雅的Debug

通过开启 debug 配置和命令行的 export EGO_DEBUG=true,我们就可以在测试环境里看到请求里的配置名、地址、耗时、请求数据、响应数据

image

用户代码

TIP

客户端组件均使用go mod子包管理,使用该组件,一定要使用下面的go get命令

  1. go get github.com/gotomicro/ego-component/eredis

配置创建一个 redis 的配置项,其中内容按照上文配置进行填写。以上这个示例里这个配置key是redis.test

代码中创建一个 redis 实例 eredis.Load("key").Build(),代码中的 key 和配置中的 key 要保持一致。创建完 redis 实例后,就可以直接使用他对 redis 进行 crud

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gotomicro/ego"
  5. "github.com/gotomicro/ego-component/eredis"
  6. "github.com/gotomicro/ego/core/elog"
  7. )
  8. // export EGO_DEBUG=true && go run main.go --config=config.toml
  9. func main() {
  10. err := ego.New().Invoker(
  11. invokerRedis,
  12. testRedis,
  13. ).Run()
  14. if err != nil {
  15. elog.Panic("startup", elog.FieldErr(err))
  16. }
  17. }
  18. var eredisStubClient *eredis.Component
  19. var eredisClusterClient *eredis.Component
  20. var eredisSentinelClient *eredis.Component
  21. func invokerRedis() error {
  22. // 读取"redis.stub"配置,并初始化redis stub component实例
  23. eredisStubClient = eredis.Load("redis.stub").Build()
  24. // 读取"redis.cluster"配置,并初始化redis cluster component实例
  25. eredisClusterClient = eredis.Load("redis.cluster").Build()
  26. // 读取"redis.sentinel"配置,并初始化redis sentinel component实例
  27. eredisSentinelClient = eredis.Load("redis.sentinel").Build()
  28. return nil
  29. }
  30. func testRedis() error {
  31. // 使用redis stub component进行set、get操作
  32. err := eredisStubClient.Set("hello", "world", 0)
  33. if err != nil {
  34. log.Println(err)
  35. }
  36. str, err := eredisStubClient.GetString("hello")
  37. if err != nil {
  38. log.Println(err)
  39. }
  40. fmt.Println(str)
  41. // 使用redis cluster component进行set、get操作
  42. err := eredisClusterClient.Set("hello", "world", 0)
  43. if err != nil {
  44. log.Println(err)
  45. }
  46. str, err := eredisClusterClient.GetString("hello")
  47. if err != nil {
  48. log.Println(err)
  49. }
  50. fmt.Println(str)
  51. return nil
  52. // 使用redis sentinel component进行set、get操作
  53. err := eredisSentinelClient.Set("hello", "world", 0)
  54. if err != nil {
  55. log.Println(err)
  56. }
  57. str, err := eredisSentinelClient.GetString("hello")
  58. if err != nil {
  59. log.Println(err)
  60. }
  61. fmt.Println(str)
  62. return nil
  63. }