我将 Shedlock 与 Spring Boot 和 Redis 一起用作锁提供程序。
似乎一切正常。但是当我在执行任务期间手动转到 Redis 时,我看不到锁的特定 KEY。
在 Redis CLI 上,我执行 KEYS *
以获取所有 key 。
这是预期的还是我错过了任何配置?
@Bean
public LockProvider lockProvider() {
return new JedisLockProvider(redisPoolPrimary.getPool(), RedisPoolPrimary.ENV_ID);
}
@Component
@Slf4j
public class RedisPoolPrimary {
public static final String ENV_ID = "MyAppId";
private JedisPool pool;
public RedisPoolPrimary(@Value("${spring.redis.url}") String redisCloudUrl,
@Value("${meetical.redis.jedis.JEDIS_POOL_MAX_TOTAL}") int jedisPoolMaxTotal,
@Value("${meetical.redis.jedis.JEDIS_POOL_MAX}") int jedisPoolMax,
@Value("${meetical.redis.jedis.JEDIS_POOLMAX_IDLE}") int jedisPoolMaxIdle
) {
URI redisUrl = URI.create(redisCloudUrl);
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(jedisPoolMaxTotal);
poolConfig.setMinIdle(jedisPoolMax);
poolConfig.setMaxIdle(jedisPoolMaxIdle);
pool = new JedisPool(poolConfig, redisUrl);
}
public JedisPool getPool() {
return pool;
}
}
@Scheduled(cron = "${cache.scheduler.cron.expression}")
@SchedulerLock(name = "refreshUserCachesLock", lockAtLeastForString = FIVE_MINUTES, lockAtMostForString = SIXTY_MINUTES)
public void refreshCacheOfAllInstances() {
// should be only run once every x hours for all spring boot app nodes
// however during execution of the task no KEY seems to be in Redis - does the lock mechanism work?
}
使用的依赖
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-spring</artifactId>
<version>4.12.0</version>
</dependency>
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-redis-jedis</artifactId>
<version>4.12.0</version>
</dependency>
最佳答案
我没有使用过 jedis,而是使用了普通的 spring 包装器 shedlock-provider-redis-spring
。如果您的配置工作正常,那么您应该能够通过使用 redis-cli 查询 keys *
来获取。如果不尝试手动形成 key 并 checkin redis,shedlock 使用 JedisLockProvider.java
中的以下方法来形成进入 redis 的 key 。
static String buildKey(String lockName, String env) {
return String.format("%s:%s:%s", KEY_PREFIX, env, lockName);
}
检查 JedisLockProvider.java
中的下面一行,它实际上在 Redis 中维护锁信息。
关于java - 使用 Spring 和 Redis 的 Shedlock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62515289/