抓取 Binance 的盘口价格 (2)
接入 Binance 开源库
安装依赖 go get github.com/adshao/go-binance
1 | import ( |
这是监听 ws 获取最新 5 levels 的 orderbook 的 channel.
wsPartialDepthHandler 在库中是定义的一个虚方法, 需要在外部实现, 之后可以将价格写入数据库, 或者主动触发一些事情.
errHandler 在出错的时候处理错误, 记录日志的方法.
doneC 和 stopC 是底层定义好的两个 channel, 当需要退出监听时向 stopC 写一个数据, 当需要阻塞主进程, 进入监听死循环的时候从 doneC 读一个数据.
go func() {…} 是开启了一个协程, 阻塞 5 秒之后向 stopC 写一个数据, 进程即退出.
末尾从 doneC 读一个数据, 由于此通道永远不会有数据写入, 所以主进程到这里阻塞住.
JSON 格式化
引入头文件 import "encoding/json"
1 | // JSON 对象 => 字符串 |
参考文档: https://gobyexample.com/json
我们将获取到的买卖价格数据, 组成数组
1 | askbid := []string{event.Bids[0].Price, event.Asks[0].Price} |
将数据写入 Redis 数据库
我们将获取到的盘口价格数据, 存储到 zset 中进行缓存.
数据结构为 zset, score: timestamp 时间戳, member: [ask, bid]
1 | err = client.ZAdd("z_askbid_"+event.Symbol, &redis.Z{Score: float64(time.Now().Unix()), Member: askbidStr}).Err() |
获取最新价格 zrange z_askbid_BTCUSDT -1 -1 WITHSCORES
关于代码换行
在有些语言里面, 通过换行可以让代码更易懂.
但是上面写入 redis 数据库的部分, 有没有太长了一些, 可以按如下的方法将其拆分成多行
1 | err = client.ZAdd( |
但是注意一点是 golang 是无 ;
结尾的语言, 不能在有完整语义的地方进行换行, 例如下面的做法就是错误的
1 | err = client |
因为编译器会认为是这样的
1 | err = client; |