假设 50w 数据,db 全量查询,再往 redis 里面塞,内存可能会爆。 db 分页查询,需要先 count ,是个耗时的操作,而且分批次插入,最终结果和数据库不一定一致(中间可能有其他删除修改的操作)。
比如布隆过滤器,一般是怎么导入亿级数据的?
推荐工具
› RoboMongo
推荐书目
› 50 Tips and Tricks for MongoDB Developers假设 50w 数据,db 全量查询,再往 redis 里面塞,内存可能会爆。 db 分页查询,需要先 count ,是个耗时的操作,而且分批次插入,最终结果和数据库不一定一致(中间可能有其他删除修改的操作)。
比如布隆过滤器,一般是怎么导入亿级数据的?
|
hidemyselfMar 7, 2022
1
cursor ? MySQL 和 PG 是可以的
|
|
wqhuiMar 7, 2022
2
分批弄数据进去,导数据过程中发生修改的数据记录一下,这部分数据再刷一下
|
|
git00llMar 7, 2022
3
你只能做到 redis 与 db 中的某个瞬间的数据是一致的,不可能保证恰好与导入完成时数据一致。考虑看业务上能否改。
另外 redis 写时,开 20-30 线程一起写会快很多。 |
|
wellscMar 7, 2022
4
为什么要全量导入啊,增量不行吗?你确定所有数据是热数据?
|
|
hopingtopMar 7, 2022
6
不严谨回答:如果是 mongodb 全量数据,可以考虑采用 mongodb 的内存引擎 你可以了解一下
|
|
runoMar 7, 2022
9
不一直问题可以用线上双写解决吧~
|
|
visitantMar 7, 2022
10
可以试试接 mongoDB 的 binlog ,然后写入 redis ,看你的业务能不能接受最终一致了
|
|
MithrilMar 7, 2022
11
确定一个时间点,比如当前时间,然后把所有 update time 在这之前的数据全拉出来塞到 redis 里。可以想办法跳过序列化和反序列化,直接塞进去。
然后你去查在这时间点以后的 change stream ,按顺序拉到 redis 里。MongoDB 已经给你这功能了,就不要再用 binlog 了。 从此以后用 change stream 同步修改,就可以保证大部分时候都是一致的。 |
|
bthuluMar 8, 2022
12
去掉 mongo, 全部采用 redis 就行了
|
|
15
@hidemyself 用 cursor 感觉很慢啊。
|
|
zmzeng12Mar 8, 2022
19
@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 解决 |
|
fov6363Mar 9, 2022
22
update_time 建索引,用 update_time 来导数据,只导 update_time > last_sync_time 的数据
|