Redission实现分布式锁,执行定时任务
package com.yupi.yupaobackend.job;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yupi.yupaobackend.model.domain.User;
import com.yupi.yupaobackend.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import static com.yupi.yupaobackend.constant.RedisConstant.USER_SEARCH_KEY;
@Component
@Slf4j
public class PreCashJob {
@Resource
RedisTemplate redisTemplate;
@Resource
UserService userService;
@Resource
RedissonClient redissonClient;
@Scheduled(cron = "0 30 23 * * ?")
public void doCashRecommendTask() {
RLock lock = redissonClient.getLock("yupao:prechchsjob:docache:lock");
try {
if (lock.tryLock(0, -1, TimeUnit.MILLISECONDS)) {
List<Long> mainUserList = new ArrayList<>();
QueryWrapper<User> queryWrapper1 = new QueryWrapper<>();
Page<User> userPage1 = userService.page(new Page<>(1, 20), queryWrapper1);
for (User user : userPage1.getRecords()) {
mainUserList.add(user.getId());
}
for (Long userId : mainUserList) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
Page<User> userPage = userService.page(new Page<>(1, 20), queryWrapper);
String key = USER_SEARCH_KEY + userId;
try {
redisTemplate.opsForValue().set(key, userPage, 12, TimeUnit.HOURS);
} catch (Exception e) {
log.error("redis set key error");
}
}
}
} catch (InterruptedException e) {
log.error("redis set key error");
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}
}