分布式锁(redis)的应用的坑和解决办法
使用场景:两台服务器集群部署中台对接工程(数据同步工程),每台项目使用spring的定时任务执行,1分钟执行1次扫描。
,扫描推送数据中间表,进行处理。
问题描述:随机会出现部分数据被扫描两次的现象。
问题背景:设计目标:定时扫描执行的代码增加了分布式锁,获取锁之后,将查询到的数据中间表数据的状态由1改成0,此时标识已经在处理了,另一台服务器就不会再去扫描了。
问题分析:分布式锁不生效导致的两台服务器同时执行同一条数据。
关键点:1.待扫描数据转成处理中的过程,是否是独立的
2.分布式锁是否持续有效
经过分析发现如下的写法:
if(CacheUtil.getLock(key,second)){
try{
//扫描待处理数据,并且将数据改成处理中,避免被下个进程扫描到
//处理数据逻辑
}catch(Throwable e){
logger.error(e.getMessage(),e);
}finally{
CacheUtil.unlock(key);
}
}
public static boolean getLock(String key, int expires) {
try {
logger.info("获取锁开始:" + key + " timestamp:" + System.currentTimeMi