如何极致的反复获取多个用户的信息

最近在考虑一个有趣的问题。

如果有一个用户信息表,信息表的主要字段有三个,一个是用户id,一个是token,一个是具体信息info

id token info
10023 G_KHFDFFDFDFADSF *****
10024 K_TEREETETETTTET *****
**** **** *****
还有一个获取用户信息的接口
1
2
3
req:https://xxx.com?id=xxx&token=xxx
rsp: {"code":0, "info":"xxxxx"}

问题:如何尽快地维护这个表中info信息的更新?

方案1:串行同步模型

1
2
3
4
5
while(true) {
// 1. 从 mysql 获取待刷新的有效表记录信息 (当数量比较多的时候需要分页)
// 2. 调用接口 https://xxx.com?id=xxx&token=xxx 获取信息
// 3. 更新信息到 mysql
}

优点:模型简单
缺点:当表中的数据越来越多的时候,用户的更新间隔会越来越大

方案2:并行异步模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
## 投递逻辑
当增加或者删除表记录的时候,操作 Redis 队列信息和是否存在的标记位
当增加用户A的时候 A -> rush_list flag_A: true
当增加用户B的时候 B -> rush_list flag_B: true
当删除用户C的时候 flag_C: true

## 消费逻辑
多进程或者多线程
while (true) {
// 1. 从redis队列里面获取待消费的元素
// 2. 更新信息
// 3. if (flag_X) {
重新将X扔回队列
}
}

## 检查逻辑
如果消费逻辑重启的时候可能会掉数据,要用一个定时脚本来补充数据到队列中。

优点:具备扩展性,可以开多机器增多进程来消费。性能高
缺点:最后还是要频繁的更新数据表(是否可以批量更新)