V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tinzing
V2EX  ›  PHP

怎么高效地把几十万 mysql 数据一次性存入 redis?

  •  2
     
  •   tinzing · 2020-08-01 10:26:33 +08:00 · 7591 次点击
    这是一个创建于 1579 天前的主题,其中的信息可能已经有所发展或是发生改变。

    寻求最佳解决办法,

    43 条回复    2020-08-03 12:11:55 +08:00
    Ministor
        1
    Ministor  
       2020-08-01 11:08:47 +08:00
    lastid = first_num;
    map = jdbc.query(select * from table where id >${lastId} limit 1000);
    put2Redis(map)
    dilu
        2
    dilu  
       2020-08-01 11:09:27 +08:00 via Android
    几十万数据不算多吧 就不能批量导入嘛?一次一万,估计三四分钟就导完了
    tinzing
        3
    tinzing  
    OP
       2020-08-01 11:13:39 +08:00
    @Ministor 你这个是 java 的吧
    tinzing
        4
    tinzing  
    OP
       2020-08-01 11:15:57 +08:00
    @dilu 现在是一次导入几千条都要一分钟
    Ministor
        5
    Ministor  
       2020-08-01 11:19:41 +08:00
    @tinzing 你又没说用啥啊
    smallyu
        6
    smallyu  
       2020-08-01 11:21:13 +08:00
    redis 的吞吐量不是每秒 10 万吗?
    tinzing
        7
    tinzing  
    OP
       2020-08-01 11:22:42 +08:00
    @Ministor 就是 php+mysql+redis
    tinzing
        8
    tinzing  
    OP
       2020-08-01 11:24:05 +08:00
    @smallyu 我也奇怪,我是数据库一次查几千条然后循环存入的,还用了 redis 事务,但就是很慢,
    huntcool001
        9
    huntcool001  
       2020-08-01 11:25:21 +08:00   ❤️ 1
    开 100 个线程,每个线程读 2000 条数据. 这样来?

    0-2000 , 2001-4000 , ...
    sss495088732
        10
    sss495088732  
       2020-08-01 11:35:08 +08:00
    0.0 我怎么记得 redis 是单线程的
    gantleman
        11
    gantleman  
       2020-08-01 11:39:28 +08:00
    redis 虽然快但 mysql 慢呀
    @smallyu
    siys
        12
    siys  
       2020-08-01 11:42:37 +08:00
    数据是什么结构呢
    tinzing
        13
    tinzing  
    OP
       2020-08-01 11:45:26 +08:00
    @siys 就是 key value
    tinzing
        14
    tinzing  
    OP
       2020-08-01 11:46:45 +08:00
    @gantleman 查几千条不慢啊 0.0 几秒就出来了
    HolmLoh
        15
    HolmLoh  
       2020-08-01 11:49:59 +08:00 via iPhone
    多线程?一边读一边写?
    siys
        16
    siys  
       2020-08-01 11:58:13 +08:00
    @tinzing redis 有个 mset 批量存啊
    siys
        17
    siys  
       2020-08-01 11:59:27 +08:00
    你循环用 set 插入,搞不好有网络的原因
    DavidNineRoc
        18
    DavidNineRoc  
       2020-08-01 12:02:54 +08:00
    贴你的代码, 你是每一条 lpush 还是 set.
    用 redis 管道
    Leigg
        19
    Leigg  
       2020-08-01 12:24:00 +08:00 via Android
    可能是带宽上限了。
    coderwen
        20
    coderwen  
       2020-08-01 12:25:33 +08:00
    watzds
        21
    watzds  
       2020-08-01 12:39:11 +08:00 via Android
    Redis pipeline 批量写很快
    worldOnlyYou
        22
    worldOnlyYou  
       2020-08-01 12:49:06 +08:00
    可以用 pipeline 的方式,能省不少时间
    594duck
        23
    594duck  
       2020-08-01 12:56:46 +08:00 via iPhone
    redis 到 mysql 的预热受 IO 限制没办法太快的。

    当年新浪微博预热集群 redis 15 分钟呢
    594duck
        24
    594duck  
       2020-08-01 12:57:31 +08:00 via iPhone
    @huntcool001 几十万数据,你先考虑一下他有多大。

    你这个回答还是没考虑到 IO
    winglight2016
        25
    winglight2016  
       2020-08-01 13:31:43 +08:00
    这点数据量,全部放 hashmap 里也没啥问题。可以自己封装一个缓存服务,hashmap 作一级缓存,redis 作二级,用队列慢慢往 redis 搬,搬完了要不要清理一级缓存看你们自己的需求。
    tinzing
        26
    tinzing  
    OP
       2020-08-01 15:10:04 +08:00
    tinzing
        27
    tinzing  
    OP
       2020-08-01 15:13:21 +08:00
    @watzds 了解
    tinzing
        28
    tinzing  
    OP
       2020-08-01 15:13:49 +08:00
    @siys 我也怀疑是不是网络原因 太慢了 本地很快的
    tinzing
        29
    tinzing  
    OP
       2020-08-01 15:14:07 +08:00
    @winglight2016 我试试
    luozic
        30
    luozic  
       2020-08-01 15:14:51 +08:00 via iPhone
    benchmark 一下,实际的系统环境和单个组件的性能指标没啥非常大的联系,你的内部网络,cpu 配置 等等都有可能导致性能不符合预期。
    sunny1688
        31
    sunny1688  
       2020-08-01 15:32:59 +08:00
    大小写不统一,看着真难受!!!
    gitgabige
        32
    gitgabige  
       2020-08-01 15:47:01 +08:00
    分布式大数据方案考虑一下么:具体使用 flinkx
    https://github.com/DTStack/flinkx/blob/1.8_release/docs/offline/reader/mysqlreader.md 多通道读取 mysql
    https://github.com/DTStack/flinkx/blob/1.8_release/docs/offline/writer/rediswriter.md 写入 redis
    开源工具,安装好之后,写下配置文件就可行
    baoshuai33
        33
    baoshuai33  
       2020-08-01 15:49:59 +08:00 via iPhone
    @sss495088732 新闻早说 6 了,6 都出了好几个稳定版了
    tinzing
        34
    tinzing  
    OP
       2020-08-01 16:07:20 +08:00
    @huntcool001 这样系统 会不会撑不住--
    tinzing
        35
    tinzing  
    OP
       2020-08-01 16:07:32 +08:00
    @gitgabige 试一下
    DavidNineRoc
        36
    DavidNineRoc  
       2020-08-01 19:12:25 +08:00
    dreamage
        37
    dreamage  
       2020-08-01 21:50:39 +08:00
    运维,不忙时帮我导一下
    ifsclimbing
        38
    ifsclimbing  
       2020-08-01 22:07:52 +08:00
    说业务,需求
    wakzz
        39
    wakzz  
       2020-08-01 22:47:00 +08:00
    看一下 redis 的 aof 设置,appendfsync 配置的哪个参数。如果 appendfsync 设置的 always,那么就是每次写操作都写一次 aof 日志,对于楼主这种高频写操作,IO 耗时会很大。
    wangyzj
        40
    wangyzj  
       2020-08-02 00:30:24 +08:00
    全读出来
    然后循环塞进去
    594duck
        41
    594duck  
       2020-08-02 10:06:03 +08:00 via iPhone
    直接这么说 60 万的数据 select * 一次多久时间心里不就有数了
    ghostviper
        42
    ghostviper  
       2020-08-03 09:39:24 +08:00
    @gitgabige 兄弟你这个是高射炮打蚊子 :)
    gitgabige
        43
    gitgabige  
       2020-08-03 12:11:55 +08:00
    @ghostviper 哈哈哈,确实是这样
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1202 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 691ms · UTC 23:19 · PVG 07:19 · LAX 15:19 · JFK 18:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.