定义一个单例模式的对象,声明一个原子计数对象:
public class Singleton {
//定义自增变量
public static AtomicInteger count = new AtomicInteger(0);
//累加
public static void increase() {
count.incrementAndGet();
}
private static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (instance) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
在统计的service层调用该单例模式的累加方法,进行累加:
public void asyncOpenTimes() {
Singleton.increase();
}
因为不想实时操作数据库,所以设置定时任务3分钟,更新一下数据库,进行次数累加,每次更新完数据库的值,重置AtomicInteger对象的count值
@Component
public class SyncData {
@Autowired
private TimesDao timesDao;
@Scheduled(cron = "0 0/3 * * * ? ")
public void syncData() {
//查询数据库数据
Map<String, Object> param = new HashMap<>();
List<TimesDO> list = timesDao.list(param);
if (CollectionUtils.isEmpty(list)) {
//新增一条数据
TimesDO timesDo = new TimesDO();
AtomicInteger count = Singleton.count;
timesDo.setOpenTimes(count.intValue());
timesDao.save(timesDo);
Singleton.count = new AtomicInteger(0);
}else{
TimesDO timesDo = list.get(0);
AtomicInteger count = Singleton.count;
timesDo.setOpenTimes(count.intValue()+timesDo.getOpenTimes().intValue());
//更新数据库数据
timesDao.update(timesDo);
Singleton.count = new AtomicInteger(0);
}
}
}
可以考虑使用:AtomicLong、LongAdder、LongAccumulator(后两者效率高)