一:使用场景,我现在有一个发送程序,负责分发不同的渠道,每隔30s会执行一次扫描表的,把未发送的记录取出来然后开n个线程发送出去,领导担心万一这台机器down机发送不出去,数据库待发送记录太多发送太慢,虽然多核服务器可以并发发送,每个时刻也能真正有m个任务在同时执行(多核cpu)但是在大量待发送记录的情况下 发送效率还是不高,所以用redis做了分布式部署,在多台机器上部署了发送程序,这样执行效率高很多,解决了领导担心的问题,但是引发了新的问题,多机器执行很可能一条记录被几台机器并行执行发送多次,显然这不是我们想要的结果,原因是改造中,使用了redis存储记录的id,每台机器执行每条记录前都会判断该条记录是否在redis中存在,如果不存在那么就把id加入到redis中,再执行发送,发送完毕后再从redis中移除,这样当其它机器拿到这条记录时如果判断已经在redis中存在就认为已经在发送不再执行,这样就没问题了吗?看下图。
在判断redis中是否存在和加入id到redis中sleep一下,睡眠时间大于等于quartz每次扫描DB的时间间隔,那么就会出现了一条记录两次发送的情况。
我做了进一步改造在加入redis和判断id是否存在合并为一步,使用分布式锁,jedis已经实现了这个操作