前言
因公司项目要求需要定时批量客户进行推送消息,此小项目为单体架构,非分布式项目,但是基于spring-session-data-redis做了session共享进行了多部署,客户的消息推送只能推一次。
可以将推送过的客户存入redis每次验证当前用户是否已经推送过,但是多项目定时任务中业务需要需要大量查询,所以为了减轻数据库的压力,使用redis做排它锁
redis排它锁:在多项目部署时,定时任务执行的时候只能由一个定时任务获取锁,其它定时任务等待,获取锁的执行完成后进行标记执行完毕,其它定时任务则跳过执行;
setIfAbsent:设置一个带有过期时间的key,如果设置成功,则获得了分布式锁,如果key已存在则等待,直到key过期。
1、创建redis工具类
@Component
public class RedisLockUtils {
@Autowired
private StringRedisTemplate redisTemplate;
public boolean getLock(String lockKey, String dateTime,long millisecond) {
//获取到锁
Boolean success = redisTemplate.opsForValue().setIfAbsent(lockKey, "lock",millisecond, TimeUnit.MILLISECONDS);
//判断标识是否存在,存在标识已经执行成功,删除锁
if(redisTemplate.hasKey(lockKey+dateTi