首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与Spring和Redis的Shedlock

与Spring和Redis的Shedlock
EN

Stack Overflow用户
提问于 2020-06-22 21:12:35
回答 1查看 1.6K关注 0票数 2

我使用带Spring Boot的Shedlock和Redis作为锁提供者。

一切似乎都很正常。但是,当我在任务执行过程中手动访问Redis时,我看不到锁的特定密钥。

在Redis CLI上,我执行KEYS *以获取所有密钥。

这是意料之中的,还是我错过了任何配置?

代码语言:javascript
复制
@Bean
public LockProvider lockProvider() {
   return new JedisLockProvider(redisPoolPrimary.getPool(), RedisPoolPrimary.ENV_ID);
}
代码语言:javascript
复制
@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;
    }

}
代码语言:javascript
复制
@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?
}

使用的依赖项

代码语言:javascript
复制
        <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>
EN

回答 1

Stack Overflow用户

发布于 2020-10-23 15:58:53

我没有用过jedis,只用过普通的spring包装器shedlock-provider-redis-spring。如果您的配置工作正常,那么您应该能够通过使用redis-cli查询keys *来获取。如果没有,尝试手动形成密钥并签入redis,shedlock在JedisLockProvider.java中使用下面的方法来形成一个进入redis的密钥。

代码语言:javascript
复制
 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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62515289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档