美文网首页
利用channel并发从数据库获取多个数据

利用channel并发从数据库获取多个数据

作者: yellowone | 来源:发表于2020-04-03 10:57 被阅读0次

我们在获取用户信息的时候,经常是需要从多个数据源中获取数据,比如获取用户的余额,用户状态,用户拥有物品时,需要拉取多个数据库,如果顺序执行的话,速度不够快,这里分享一种写法。

type dataChan struct {
    data interface{}
    err  error
}

func getMysqlDataByUin(uin int, getDataFunc func(int) (interface{}, error), context context.Context) chan *dataChan {
   result := make(chan *dataChan, 1)
   go func() {
      dataInfo, err := getDataFunc(uin)
      select {
      case <-context.Done():
         close(result)
      default:
         result <- &dataChan{
            data: dataInfo,
            err:  err,
         }
      }
   }()
   return result
}

将获取数据的chan作为结果返回并且并发调用获取数据方法来获取数据

func GatPlayerData(uin int) (*PlayerSaveData, error) {
    ctx, cancel := context.WithCancel(context.Background())
    chanCount := 0
    goldChan := getMysqlDataByUin(uin, readMysql.GetUserGoldInfo, ctx)
    chanCount++
    buffChan := getMysqlDataByUin(uin, readMysql.GetBuffInfo, ctx)
    chanCount++
    resultData := &PlayerSaveData{}
    for i := 0; i < chanCount; i++ {
        select {
        case goldData := <-goldChan:
            if goldData.err != nil {
                cancel()
                return nil, errors.WithMessage(goldData.err, "获取金币信息失败")
            }
            goldInfo, ok := goldData.data.([]*MysqlGoldCoin)
            if !ok {
                cancel()
                return nil, errors.New("类转化失败")
            }
            resultData.MyMoney = goldInfo
        case buffData := <-buffChan:
            if buffData.err != nil {
                cancel()
                return nil, errors.WithMessage(buffData.err, "获取buff信息失败")
            }
            info, ok := buffData.data.([]*MysqlBuff)
            if !ok {
                cancel()
                return nil, errors.New("类转化失败")
            }
            resultData.Buffs = info
        }
    }
    return resultData, nil
}

相关文章

  • 利用channel并发从数据库获取多个数据

    我们在获取用户信息的时候,经常是需要从多个数据源中获取数据,比如获取用户的余额,用户状态,用户拥有物品时,需要拉取...

  • Go-高并发之管道模型

    即多个函数同时从同一个channel里读取数据。直至channel被关闭可以更好的利用多核这里演示案例是从mysq...

  • 数据库-并发调度(未完结)

    数据库 • 数据库的并发调度 由于数据库中的数据具备共享性,所以数据库中的数据就支持了多个用户的访问 • 并发调度...

  • 3-客户端API的注意事项

    一. Channel 在多个线程之间共享channel, 然后并发的pubish数据是不可行的.原因是同一个cha...

  • 【从入门到放弃-Java】并发编程-NIO-Buffer

    前言 上篇【从入门到放弃-Java】并发编程-NIO-Channel中我们学习到channel是双向通道,数据通过...

  • 数据库封锁技术

    数据库通常允许多个用户共享数据信息资源,所以必须对并发的事务进行控制,防止多用户并发使用数据库时造成数据错误,以保...

  • 面试官问:请介绍一下MySQL数据库的锁机制?

    为什么要加锁 问题背景 当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作...

  • mysql锁机制

    为什么要锁 当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可...

  • 乐观锁,悲观锁详解

    并发控制 并发控制:当多个连接对记录进行修改的时保证数据的一致性。 悲观锁,乐观锁 确保在多个事务同时存取数据库中...

  • 线程同步经典问题之读者-作者问题

    问题描述:假设一个数据库为多个并发线程所共享。有的线程只读,有的线程需要写数据库。因此要求:①允许多个读者可以同时...

网友评论

      本文标题:利用channel并发从数据库获取多个数据

      本文链接:https://www.haomeiwen.com/subject/feacphtx.html