• 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方法会自动重新执行回调函数,直到事务成功提交或达到某些终止条件(例如最大尝试次数)。

  • 相关阅读:
    java计算机毕业设计校园酒店管理系统源码+系统+mysql数据库+lw文档
    【前端知识】Three 学习日志(三)—— 光源对物体表面的影响
    论文阅读---REALISE model
    如何为公众号文章加入附件文档下载?
    跨域?同源?一次搞懂什么是跨域
    健身戴什么耳机,盘点几款健身佩戴的耳机推荐
    NetApp FAS2554故障灯常亮case处理过程分享
    前端调取摄像头并实现拍照功能
    [C++] 布隆过滤器的模拟实现
    如何应用Python助你在股票中获利?
  • 原文地址:https://blog.csdn.net/xiao_xiao_w/article/details/138177360