当前位置:   article > 正文

go语言 go-redis watch实例

go语言 go-redis watch实例

讲一下对watch的理解

redis中watch是通过加了乐观锁的方法先获取事务执行前key值,如果在开始执行事务时检测到由于并发key被其他客户端修改了,就会终止事务

  1. redis-cli //启动连接redis
  2. WATCH counter//watch监听 counter
  3. MULTI//如果counter 没有变化就开启事务
  4. INCR counter//让counter自增
  5. EXEC//提交事务

如果用go-redis实现就是这样的

  1. var rdb *redis.Client
  2. var ctx = context.Background() //上下文
  3. /*
  4. 这部分代码创建了一个 Redis 客户端实例,连接到本地的 Redis 服务器。在实际应用中,
  5. 你可能需要根据实际情况配置 Redis 的地址、密码和数据库。
  6. */
  7. func init() {
  8. rdb = redis.NewClient(&redis.Options{
  9. Addr: "localhost:6379",
  10. Password: "",
  11. DB: 0,
  12. })
  13. }
  14. // 定义一个回调函数,用于处理事务逻辑
  15. fn := func(tx *redis.Tx) error {
  16. // 先查询下当前watch监听的key的值
  17. v, err := tx.Get(ctx, "key").Int()
  18. if err != nil && err != redis.Nil {
  19. return err
  20. }
  21. // 这里可以处理业务
  22. v++
  23. // 如果key的值没有改变的话,Pipelined函数才会调用成功
  24. _, err = tx.Pipelined(ctx, func(pipe redis.Pipeliner) error {
  25. // 在这里给key设置最新值
  26. pipe.Set(ctx, "key", v, 0)
  27. result, _ := tx.Get(ctx, "key").Result()
  28. fmt.Println(result+" ", v)
  29. return nil
  30. })
  31. return err
  32. }
  33. // 使用Watch监听一些Key, 同时绑定一个回调函数fn, 监听Key后的逻辑写在fn这个回调函数里面
  34. // 如果想监听多个key,可以这么写:client.Watch(ctx,fn, "key1", "key2", "key3")
  35. rdb.Watch(ctx, fn, "key")

其中watch即使对key值的监听,fn回调函数相当于如果key没有发生修改要执行的事务逻辑

下面这段代码为redis的连接实例化一个rdb客户端
  1. var rdb *redis.Client
  2. var ctx = context.Background() //上下文
  3. /*
  4. 这部分代码创建了一个 Redis 客户端实例,连接到本地的 Redis 服务器。在实际应用中,
  5. 你可能需要根据实际情况配置 Redis 的地址、密码和数据库。
  6. */
  7. func init() {
  8. rdb = redis.NewClient(&redis.Options{
  9. Addr: "localhost:6379",
  10. Password: "",
  11. DB: 0,
  12. })
  13. }

watch的执行逻辑

在go-redis中,当你使用Watch函数并传入回调函数时,库的内部实现大致执行了以下步骤:

  1. 监控阶段:调用Watch函数时,它会首先为指定的键设置监视点(WATCH命令)。这个监视确保如果在事务执行前这些键被修改,事务将不会执行。

  2. 执行回调函数:如果在执行事务的过程中监视的键未被修改,则Watch函数会创建一个新的事务(MULTI命令),并执行提供的回调函数。在回调函数内,你可以向事务中添加想要执行的命令。

  3. 事务提交:回调函数执行完后,如果没有出现错误,事务将会被提交(EXEC命令)。如果在执行回调函数的过程中出现了错误,或者监视的键值被修改,则事务将会被取消(DISCARD命令)。

  4. 重试逻辑:如果由于WATCH监视的键被修改而导致事务失败,Watch方法会自动重新执行回调函数,直到事务成功提交或达到某些终止条件(例如最大尝试次数)。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/490696
推荐阅读
相关标签
  

闽ICP备14008679号