扫描redis集合中的特定值,并在队列中创建和执行操作
我相信使用Redis是做我需要做的事情的最好方法,但是如果我错了,请纠正我 我打开一个交易所的插座,收到稳定的股票价格流,大约每“交易对”每秒1股 我有一些用户在MYSQL中设置了警报,当价格达到某个价位时会收到通知 我的第一个天真想法是对交易对的警报进行排序,当我从套接字收到新的价格时,在mysql中循环浏览警报列表,并通知任何需要通知的用户 这显然是行不通的,因为对于可怜的MYSQL来说,这将是一个巨大的工作量。所以我的想法是使用redis,并在redis中保存警报 不过,我在Redis开发方面并没有丰富的经验,我正在努力寻找解决方案。起初我需要某种排序的列表或散列,但我只能在一个列表中存储1条信息 我相信我需要在数据库中保存3条信息: 1) “交易对”(名单名称) 2) 代价 3) MYSQL中观察者记录的id,以便我可以通知他们 所以我可以为每个观察者创建一张地图扫描redis集合中的特定值,并在队列中创建和执行操作,redis,Redis,我相信使用Redis是做我需要做的事情的最好方法,但是如果我错了,请纠正我 我打开一个交易所的插座,收到稳定的股票价格流,大约每“交易对”每秒1股 我有一些用户在MYSQL中设置了警报,当价格达到某个价位时会收到通知 我的第一个天真想法是对交易对的警报进行排序,当我从套接字收到新的价格时,在mysql中循环浏览警报列表,并通知任何需要通知的用户 这显然是行不通的,因为对于可怜的MYSQL来说,这将是一个巨大的工作量。所以我的想法是使用redis,并在redis中保存警报 不过,我在Redis开发
watcher_(watcherID)
like:
watcher_3
price : 8000
然后创建一个具有观察者ID的集合,如:
3,5,6
并使用“按外部键排序”调用排序
然后使用SCAN和MATCH循环,直到我得到一个小于或等于当前价格的价格,并将其移动到一个新队列
如果我可以反复询问相同的问题,那么排序甚至没有必要
即使只是简单地通过使用Redis来思考这个问题,也会让我感到非常痛苦,我甚至不确定我是否正确地处理了这个问题
有谁能告诉我上述方法是否有效,或者是否有更好的方法 看起来您可以使用排序集和发布订阅。请使用您的对名称和lt/gt作为密钥的一部分。价格是物品的分数,观察者id是物品的数据。然后,当一个报价出现时,您可以调用
ZRANGEBYSCORE
,以获取应该调用哪个观察者
例如,你有这些观察者(>=100,>=150,如果观察者说“价格高于500时通知”,然后是501报价,然后是502报价,它会通知两次吗?
127.0.0.1:6370> zadd watchers:usdeur:gt 100 1
(integer) 1
127.0.0.1:6370> zadd watchers:usdeur:gt 150 2
(integer) 1
127.0.0.1:6370> zadd watchers:usdeur:lt 200 3
(integer) 1
127.0.0.1:6370> ZRANGEBYSCORE watchers:usdeur:lt 130 +inf
1) "3"
127.0.0.1:6370> ZRANGEBYSCORE watchers:usdeur:gt -inf 130
1) "1"