悲剧啊,,, 侦听卡死了,数据积存了13天,上千万数据。 现有程序处理不过来,需要写一个多线程来处理。
如题,该如何加锁?希望各位前辈能给一点建议。
顺便说一下,需要处理的表有一个状态字段,用于标识处理与否。
业精于勤,荒于嬉;行成于思,毁于随。
其實這個不是加鎖的問題,而是資料分發的問題。加鎖是為了防止高並發下產生髒數據,而你其實是希望處理過或已被其他線程先拿到的數據不要再處理了,對吧?
如何進行資料分發,提高叢集(或多執行緒)處理效率,這個要結合你們的資料模型來考慮。
例如處理的資料ID中有數字標識,目前你有10台機器或10個線程,那麼可以讓這10台機器各自讀取1/10的數據,這可以透過取餘(%10)做到。例如第1台機器讀取i%10==1的ID的數據,第2台讀取i%10==2的,以此類推。
可以考慮用佇列試試看,掃全表將等待處理的資料放入佇列(單執行緒),然後多執行緒消費。由於出隊本身俱有原子性,可防止重複讀,且性能有保證(特指redis)。此外,如果生產端單執行緒掃表還無法滿足的話,可以考慮多執行緒取模讀取資料放入佇列。
我有點不懂.上千萬資料你不可能一次全部拿到快取裡吧!!!!!
我又看你說表中每一條資料都有一個標記.
在改動這條資料的時候.java端你只需要保證對這條資料的相關資料bean的操作(他可能是1步驟或多步驟) 是原子性的就行了.
資料量大的update操作還是用jdbc的批次操作比較快.
使用隊列RabbitMQ ,生產者消費者模式
其實這個不是加鎖的問題,而是資料分發的問題。加鎖是為了防止高並發下產生髒數據,而你其實是希望處理過或已被其他線程先拿到的數據不要再處理了,對吧?
如何進行資料分發,提高叢集(或多執行緒)處理效率,這個要結合你們的資料模型來考慮。
例如處理的資料ID中有數字標識,目前你有10台機器或10個線程,那麼可以讓這10台機器各自讀取1/10的數據,這可以透過取餘(%10)做到。例如第1台機器讀取i%10==1的ID的數據,第2台讀取i%10==2的,以此類推。
可以考慮用佇列試試看,掃全表將等待處理的資料放入佇列(單執行緒),然後多執行緒消費。由於出隊本身俱有原子性,可防止重複讀,且性能有保證(特指redis)。此外,如果生產端單執行緒掃表還無法滿足的話,可以考慮多執行緒取模讀取資料放入佇列。
我有點不懂.上千萬資料你不可能一次全部拿到快取裡吧!!!!!
我又看你說表中每一條資料都有一個標記.
在改動這條資料的時候.java端你只需要保證對這條資料的相關資料bean的操作(他可能是1步驟或多步驟)
是原子性的就行了.
資料量大的update操作還是用jdbc的批次操作比較快.
使用隊列RabbitMQ ,生產者消費者模式