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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐