假设 50w 数据,db 全量查询,再往 redis 里面塞,内存可能会爆。 db 分页查询,需要先 count ,是个耗时的操作,而且分批次插入,最终结果和数据库不一定一致(中间可能有其他删除修改的操作)。
比如布隆过滤器,一般是怎么导入亿级数据的?
1
hidemyself 2022-03-07 16:54:39 +08:00
cursor ? MySQL 和 PG 是可以的
|
2
wqhui 2022-03-07 17:46:38 +08:00
分批弄数据进去,导数据过程中发生修改的数据记录一下,这部分数据再刷一下
|
3
git00ll 2022-03-07 20:26:04 +08:00
你只能做到 redis 与 db 中的某个瞬间的数据是一致的,不可能保证恰好与导入完成时数据一致。考虑看业务上能否改。
另外 redis 写时,开 20-30 线程一起写会快很多。 |
4
wellsc 2022-03-07 20:27:30 +08:00
为什么要全量导入啊,增量不行吗?你确定所有数据是热数据?
|
6
hopingtop 2022-03-07 20:39:14 +08:00
不严谨回答:如果是 mongodb 全量数据,可以考虑采用 mongodb 的内存引擎 你可以了解一下
|
7
git00ll 2022-03-07 21:31:48 +08:00
@wellsc 与哪个版本的 redis 没有关系,因为应用与 redis 网络交互 RTT 的存在,单线程写很难达到 1000 次 /s 。
|
9
q1angch0u 2022-03-07 22:11:59 +08:00
不一直问题可以用线上双写解决吧~
|
10
visitant 2022-03-07 23:23:20 +08:00
可以试试接 mongoDB 的 binlog ,然后写入 redis ,看你的业务能不能接受最终一致了
|
11
Mithril 2022-03-07 23:36:35 +08:00
确定一个时间点,比如当前时间,然后把所有 update time 在这之前的数据全拉出来塞到 redis 里。可以想办法跳过序列化和反序列化,直接塞进去。
然后你去查在这时间点以后的 change stream ,按顺序拉到 redis 里。MongoDB 已经给你这功能了,就不要再用 binlog 了。 从此以后用 change stream 同步修改,就可以保证大部分时候都是一致的。 |
12
bthulu 2022-03-08 08:17:59 +08:00
去掉 mongo, 全部采用 redis 就行了
|
15
leebs OP @hidemyself 用 cursor 感觉很慢啊。
|
19
zmzeng12 2022-03-08 22:42:59 +08:00
@leebs
redis bulk 写入有两个重要的优化,应该先试试: 1. redis pipeline 2. 多线程 /进程并发写入 redis ,redis server 端采用 IO 多路复用设计,加上纯内存操作,因此性能很高,因此 client 端要上多线程才能榨出 QPS 上限,规格不是很小的话,写入数万 QPS 都是很正常的,可以参考华为云给的性能白皮书 https://support.huaweicloud.com/pwp-dcs/dcs-pwp-0606002.html 如果只是做数据存在 /重复校验,不需要导入全量数据到 redis ,可以参考: 1. 按 @wellsc 的回答用布隆过滤器解决,看 https://redis.com/redis-best-practices/bloom-filter-pattern/ 2. 如果数据 primary key 能比较好地一一映射成数字,也可以通过 bitmap 解决 |
20
leebs OP |
22
fov6363 2022-03-09 12:06:51 +08:00
update_time 建索引,用 update_time 来导数据,只导 update_time > last_sync_time 的数据
|