>  기사  >  Java  >  스프링 부트가 redisson을 통합하는 방법

스프링 부트가 redisson을 통합하는 방법

PHPz
PHPz앞으로
2023-05-14 19:46:191697검색

통합 및 주의사항

redisson은 Redis 환경, 독립 실행형, 클러스터, Sentinel, 클라우드 등을 지원합니다.

여기에서는 클러스터 모드에 대해 이야기하겠습니다. 주의해야 할 점은 redisson 시작 시 마스터/슬레이브 노드가 정상인지 감지한다는 것입니다. 일반적으로 샤드 3개, 마스터 3개, 슬레이브 3개이면 문제가 없지만, 테스트 환경이 1개의 샤드 1개의 마스터인 경우 1개의 슬레이브 또는 3개의 마스터를 시작할 수 없습니다.

환경 외에도 비밀번호 유무에 따른 호환성에도 주의가 필요합니다.

재디슨 구성을 수동으로 삽입하세요

일반적인 상황에서 프로덕션 환경에는 비밀번호가 있습니다. 비밀번호가 있는 경우 통합을 돕기 위해 spring boot를 사용하지 않고 redisson 구성을 수동으로 주입하는 것이 좋습니다. 왜냐하면 spring boot가 비밀번호를 인식하지 못할 수 있기 때문입니다.

@Configuration
public class RedissonConfiguration {
    @Value("${spring.redis.cluster.nodes}")
    private String node;
    @Value("${spring.redis.password:}")
    private String password;
    @Bean
    public RedissonClient redissonClient() {
        Config config = new Config();
        String[] nodes = node.split(",");
        ClusterServersConfig clusterServersConfig = config.useClusterServers();
        for (String nodeAddress : nodes) {
            clusterServersConfig.addNodeAddress(prefixAddress(nodeAddress));
        }
        if (StringUtils.isNotBlank(password)) {
            clusterServersConfig.setPassword(password);
        }
        return Redisson.create(config);
    }
    private String prefixAddress(String address) {
        if (!StringUtils.isBlank(address) && !address.startsWith("redis")) {
            return "redis://" + address;
        }
        return address;
    }
}

실제 상황에 따라 일부 구성을 조정할 수 있습니다.

물론, 비밀번호 외에 SSL이 있는지라는 또 하나의 포인트가 있습니다. 제가 현재 사용하고 있는 회사는 Amazon Cloud이고, SSL이 있을 예정입니다

Spring boot는 redis와 호환 가능합니다. yaml 구성에서 설정합니다: Ssl: true, 그러나 redisson의 경우 접두사만 추가하세요:

rediss:// + ip: 포트 또는 도메인 이름

특정 yaml 구성

spring:
  redis:
    cluster:
      nodes: rediss://clustercfg.xxx
    password: 'xxx'
    timeout: 30000
    Ssl: true
    lettuce:
      pool:
        max-idle: 100

잠금의 상호 배제 전략을 사용하세요. 얼핏 보면 이렇게 생겼네요

@Scheduled(cron = "${xxx:0 0 */2 * * ?}")
public void createProcess() {
    RLock lock = redisson.getLock(key);
    try {
        if (lock.tryLock()) {
           // 执行运行程序
        } else {
            log.info("createProcess 获取锁失败");
        }
    } catch (Exception e) {
        log.error("xxx", e);
    } finally {
        // 是否有锁 && 是否当前线程
        if (lock != null && lock.isLocked() && lock.isHeldByCurrentThread()) {
            lock.unlock();
        }
    }
}

아무것도 없습니다 문제인데 이번 재구축은 예정된 작업이 많아서 같은 try catch 코드가 많이 들어가게 됩니다.

주석 방법

중복 코드를 해결하는 방법 중 하나는 주석 측면캡슐화입니다. 주석 방법이 더 유연하다고 생각하면

/**
 * Redisson 同步锁
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RedissonSyncLock {
    String pref();
    /**
     * 锁后缀,一般前缀根据业务来定,后缀是具体的场景
     */
    String keyEL();
    /**
     * 等待时长 【需要区分是互斥还是阻塞,互斥默认0就可以】
     */
    int waitSec() default 0;
}

에는 측면

@Slf4j
@Aspect
@Component
@RequiredArgsConstructor
public class RedissonSyncLockAspect {
    private final Redisson redisson;
    @Around(value = "@annotation(xxx.RedissonSyncLock)")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        RedissonSyncLock redissonSyncLock = signature.getMethod().getAnnotation(RedissonSyncLock.class);
        Object[] args = joinPoint.getArgs();
        String key = SpelUtil.parseSpel(signature.getMethod(), args, redissonSyncLock.keyEL());
        RLock lock = null;
        try {
            if (StringUtils.isNotBlank(key) && !StringUtils.equals(key, "null") 
                lock = redisson.getLock(redissonSyncLock.pref().concat(key));
                if (lock.tryLock(redissonSyncLock.waitSec(), TimeUnit.SECONDS)) {
                    return joinPoint.proceed();
                }
            }
            log.info("RedissonSyncLockAspect 上锁失败 {}", key);
        } finally {
            if (lock != null && lock.isLocked() && lock.isHeldByCurrentThread()) {
                lock.unlock();
            }
        }
    }
}

사용 방법이 필요합니다.

@RedissonSyncLock(pref = KeyConstant.xxx, keyEL = "#bean.accountNo")
private void xxx(Bean bean){
     // 程序执行
}

실제로 사용하고 있어서 더 편해요.

위 내용은 스프링 부트가 redisson을 통합하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제