84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
悲剧啊,,,侦听卡死了,数据积存了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 ,生产者消费者模式