java - 使用 Spring 和 Redis 的 Shedlock

标签 java spring-boot caching redis

我将 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 中维护锁信息。

https://github.com/lukas-krecan/ShedLock/blob/05d72cefa931634eaebabf2a7cdd400f1da416d7/providers/redis/shedlock-provider-redis-jedis/src/main/java/net/javacrumbs/shedlock/provider/redis/jedis/JedisLockProvider.java#L154

关于java - 使用 Spring 和 Redis 的 Shedlock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62515289/

相关文章:

java - 使用 Spring 注入(inject) Google Guava Hashmultimap

java - Spring 启动: Cannot load configuration class

spring-boot 自定义 Jetty SSLContextFactory

java - 如何频繁地重新加载存储数据库信息的类?

c# - ASP.NET 缓存

Java - 从csv文件读取获取空值

Java 8 LocalDateTime 和奇怪的区域行为

java - 重载的精度高于覆盖

java - Spring Cloud 库。在没有 Vault 的环境中 VaultPropertySource 出现问题

android - volley如何离线加载图片,volley是自动缓存图片还是需要缓存图片?