跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 多线程读取表数据,如何保证不重复读
未分類
1 10 月 2020

多线程读取表数据,如何保证不重复读

多线程读取表数据,如何保证不重复读

資深大佬 : pming1 7

一个表里有 100 条记录,5 个线程同时去随机读,如何保证这 100 条记录比较平均地被这 5 个线程读取,而且互相不重复?(前提,不增加 redis 等额外基础设施或工具)

大佬有話說 (21)

  • 資深大佬 : winnie2012

    我也想知道

  • 資深大佬 : winnie2012

    PG 好像有读取行锁

  • 資深大佬 : lxk11153

    row number % 5 ???

  • 資深大佬 : dddd1919

    用表读锁 /行读锁

  • 資深大佬 : firethehole

    表里的数据在读的时候,会增加吗,还是已经固定了

  • 資深大佬 : wakzz

    要看你的耗时逻辑是读取本身,还是读取后数据的处理逻辑。常见的处理方法是生产消费模式,即由一个生产者从表中获取记录 ID (偏移量)推送到队列中,然后由几个消费者线程竞争消费队列中的推送记录,然后通过记录 ID (偏移量)读取记录后再逻辑处理。

  • 資深大佬 : egglin

    saturn 分片

  • 資深大佬 : Aliencn

    再开一个线程去调度

  • 資深大佬 : InkAndBanner

    @wakzz 你说的这个方案是是针对耗时发生在处理上 的解决方案是嘛?

  • 資深大佬 : kop1989

    如果从程序层面解决的话,可以把 5 线程,分别取 5 随机行转换为单线程(或 5 线程的队列)取随机 25 行,然后分发。
    但这有个前提,即你 5 个线程的读取时机要严格同步。(不过如果不同步,又要取没有交集的数据,好像有点奇怪)

  • 資深大佬 : boyhailong

    逻辑层去分配,划分下任务比如第一个线程 1-20,以此类推,当然逻辑层也要做去重。

  • 資深大佬 : wysnylc

    别读同个分区的数据,分区规则自己定义

  • 資深大佬 : jptx

    一个很传统而且简易的方式是按 id 取模,假如表里有 id 之类的纯数字,那么第一个线程扫数据库的时候条件加上 where id % 5 = 0,第二个线程是 where id % 5 = 1,以此类推。但这种方法局限性很大,比如查询效率低,每个线程需要知道自己的编号,无法动态快速扩容,分布不一定均匀等。但如果想简单的话,这种方式的确很有效

  • 資深大佬 : Xusually

    select … for update
    试试看?

  • 資深大佬 : xsm1890

    随机生成 100 个 id,分成四组?

  • 資深大佬 : wakzz

    @InkAndBanner 对,是针对耗时发生在业务处理上的解决方案

  • 主 資深大佬 : pming1

    @firethehole 会增加。

  • 主 資深大佬 : pming1

    @jptx 表数据是会增加的,线程数并非固定,具体看数据量而动态变化的,甚至可能 1 个程序 5 个线程,然后部署多个这样的程序。

  • 資深大佬 : lower

    读完 设置 一个 已读的状态,线程每次只从过滤 状态后的数据取?

  • 資深大佬 : lower

    @lower 行记录上加个 状态 列字段……

  • 資深大佬 : bleoo

    forupdate 锁一下?

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具