项目中,经常碰见需要在项目初始化时完成从mysql的数据写入到缓存如redis中的操作,例如ssm架构项目中,需要某个类实现一个initializeBean的接口,在这个类里面完成初始化的操作,将mysql的数据写到redis或其他缓存即可
说起来倒不难,但是真正执行的时候要考虑的问题点却很多,比如说,如果你的数据量是百万级甚至千万级的,单纯是项目初始化这个过程可能就要花费很久,可能你说可以利用异步线程来解决,但如果这样做了,假如项目启动完毕了,用户正在访问,这个时候缓存还没有写完,而访问的接口正好又是特别耗时的,那么这个缓存就没什么卵用了;
有没有解决办法呢?
经过仔细的考虑和探索,发现问题的关注点其实是尽可能缩短项目初始化时候将数据写入到redis的这个操作,这样我们就很自然的联想到了线程池;
但问题又来了,大规模数据通过不同的线程去执行,不同的线程好歹需要知道自己线程要处理的数据吧,也就是我这个线程要处理从哪一条到哪一条的数据呢?这就需要我们对表的数据进行切分,这样不同分片的数据交给不同的线程去做,然后提交给线程池,不就可以完美的解决这个问题吗?
有了这个思路,我们来看看具体的代