Rumah  >  Artikel  >  Java  >  Bagaimana but musim bunga menyepadukan redisson

Bagaimana but musim bunga menyepadukan redisson

PHPz
PHPzke hadapan
2023-05-14 19:46:191700semak imbas

Integrasi dan Nota

Redisson menyokong persekitaran redis, berdiri sendiri, kelompok, sentinel, awan, dll.

Di sini kita akan bercakap tentang Mod kluster Apa yang perlu diberi perhatian, redisson akan mengesan sama ada nod induk/hamba adalah normal apabila ia dimulakan secara umumnya, tiada masalah dengan 3 serpihan, 3 tuan dan 3 hamba Walau bagaimanapun, jika persekitaran ujian mempunyai 1 serpihan, 1 tuan, 1 hamba, atau 3 tuan, ia tidak boleh dimulakan.

Selain persekitaran, anda juga perlu memberi perhatian kepada keserasian dengan atau tanpa kata laluan.

Secara manual menyuntik konfigurasi redisson

Secara amnya, persekitaran pengeluaran adalah dengan kata laluan. Jika terdapat kata laluan, adalah disyorkan untuk menyuntik konfigurasi redisson secara manual tanpa menggunakan but spring untuk membantu anda menyepadukannya, kerana but spring mungkin tidak dapat mengecam kata laluan.

@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;
    }
}

Anda boleh melaraskan beberapa konfigurasi berdasarkan situasi sebenar anda.

Sudah tentu, sebagai tambahan kepada kata laluan, terdapat satu lagi perkara yang perlu diberi perhatian Sama ada terdapat SSL ialah Amazon Cloud be SSL

but spring serasi dengan redis Anda boleh Tianji dalam konfigurasi yaml: Ssl: true, tetapi untuk redisson, cuma tambah awalan:

rediss:// + ip: port atau. nama domain

Konfigurasi yaml khusus

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

Menggunakan strategi pengecualian bersama kunci, tiada masalah dengan

@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();
        }
    }
}

pada pandangan pertama, tetapi pembinaan semula ini mempunyai banyak tugas berjadual, jadi ia akan melibatkan Banyak cubaan tangkapan dengan kod yang sama.

Kaedah anotasi

Salah satu cara untuk menyelesaikan kod pendua ialah enkapsulasi, iaitu aspek anotasi Saya rasa kaedah anotasi lebih fleksibel

Jadi

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

perlukan sekeping

@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();
            }
        }
    }
}

Cara guna:

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

memang lebih senang digunakan.

Atas ialah kandungan terperinci Bagaimana but musim bunga menyepadukan redisson. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam