1,redis配置
@Bean(name = “customJedisPool”)
public JedisPool getCustomJedisPool() {
JedisPoolConfig poolConfig = new JedisPoolConfig();
// 这个配置项可以不用显式指定,jedis pool Config默认给的是-1,这里写出来只是为了解释下-1的含义:对连接池中的所有空闲连接进行检查
poolConfig.setNumTestsPerEvictionRun(-1);
// 5分钟
poolConfig.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
// 10分钟
poolConfig.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
return new JedisPool(poolConfig, host, Integer.parseInt(port), connectionTimeout, password);
}
2,RedissonConfig
@Configuration
public class RedissonConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private String port;
@Value("${spring.redis.password}")
private String password;
@Bean(destroyMethod="shutdown")
public RedissonClient redissonClient() throws IOException {
Config config = new Config();
SingleServerConfig singleServerConfig = config.useSingleServer().setAddress("redis://"+host+":"+port);
if (StringUtils.isNotEmpty(password)) {
singleServerConfig.setPassword(password);
}
System.out.println("redisson: "+config.getTransportMode());
return Redisson.create(config);
}
分布式锁的使用
@Resource
private RedissonClient redissonClient;
RLock lock = redissonClient.getLock("锁的名词");
try {
// 加锁
lock.lock();
// 业务逻辑
} catch (Exception e) {
e.printStackTrace();
}finally {
//释放锁
lock.unlock();
}
3,避免定时任务在多实例等情况下被执行多次
添加定时任务锁
@Configuration
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = “PT10M”)
public class ScheduledLockConfig {
@Value(“${spring.profiles}”)
private String env;
@Bean
public LockProvider lockProvider(RedisConnectionFactory connectionFactory) {
return new RedisLockProvider(connectionFactory,env);
}
@Bean
public ScheduledLockConfiguration scheduledLockConfiguration(LockProvider lockProvider) {
return ScheduledLockConfigurationBuilder.withLockProvider(lockProvider)
.withPoolSize(10)
.withDefaultLockAtMostFor(Duration.ofMinutes(10)).build();
}
}
定时任务使用
@Scheduled(cron = "0/10 * * * * ?")
@SchedulerLock(name = "equipment_num_lock", lockAtLeastForString = "PT20S", lockAtMostForString = "PT1M")
public void checkEquipmentNumTasks() {
// 业务逻辑
}
@SchedulerLock
配置redis 的时候注意格式 不然host会默认连接localhost
注意jedis 的配置格式
spring:
profiles: prod
redis:
host:
port: 6379
password:
connectTimeout: 2000
soTimeout: 2000
jedis:
pool:
max-idle: 30
min-idle: 20
max-wait: -1
max-active: 30
minEvictableIdleTimeMillis: 600000
time-between-eviction-runs: 300000