交易平台数据实时刷新方案
需求
挂单数据、成交数据、用户余额实时刷新
实现
关键:
WebSocket+Redis
思路:
使用WebSocket
维持长链接,确保数据实时传输。并在Redis中维护一个挂单的价格-数据
列表,以较快的频率推送给用户。同时,在用户挂单时,浏览器主动获取挂单、成交和用户余额数据。
技术细节
以市场 btc_cny 为例。
需要在Redis中维护两个列表,btc_cny_buy
, btc_cny_sell
。
每个列表包含以下key/value对,价格/数据。
列表数据在以下操作时更新:
- 挂单
- 撤销
- 成交
更新操作:
- 判断
btc_cny_buy
是否存在,不存在则创建 - 查找 价格对应的key
- 价格key存在则更新,不存在则直接创建
需要对数量为0的价格key做清除处理
推送给浏览器的数据:
定时推送+浏览器主动获取
- 从Redis中获取
btc_cny_buy
- 过虑掉数量为0的价格key
- 排序
- 截取前N个
用户身份认证
- 建立
WebSocket
连接时浏览器发送cookie中的PHPSESSINOID - 服务器根据sessionid读取session目录下对应的session文件
- 正则解析文件内容,获取用户ID和username。有可能用户处于未登录或登录失败的状态。
页面展示
- 数据差异化处理
技术难点
-
列表的初始化,即创建一个包含所有现有价格key的列表
解决思路:从数据库取出所有唯一性价格及其数量,推入列表。
-
数据一致性,即保证列表中的数据与数据库中的数据一致
要求每次对数据的操作都要精确无误。