最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring boot優(yōu)雅集成redisson詳解

 更新時間:2022年11月01日 15:52:09   作者:你行你上啊  
這篇文章主要為大家介紹了spring boot優(yōu)雅集成redisson詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

集成及注意事項

上一篇文章大白話說了一下redisson的可重入、可續(xù)約、阻塞、時間輪、紅鎖、聯(lián)鎖、加鎖邏輯和解鎖邏輯,如果大家有興趣先看上一篇,直通車

拔劍起蒿萊????????

redisson支持redis環(huán)境,單機、集群、哨兵、云等。

這里就講一下集群模式需要注意的地方,redisson啟動會檢測master/slave節(jié)點是否正常,一般來說3分片3主3從是沒有什么問題的,但是如果測試環(huán)境1分片1主1從或者3主都是啟動不了的。

除了環(huán)境需要注意,還有注意兼容有無密碼的情況。

手動注入redisson配置

一般情況下,生產(chǎn)環(huán)境都是有密碼的。有密碼的話,建議手動注入redisson配置,不用spring boot來幫你集成,因為可能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;
    }
}

上面可以根據(jù)自己實際情況調(diào)優(yōu)一些配置。見官網(wǎng)

當然除了密碼需要注意,還有一點就是是否有ssl,目前所在company是用的亞馬遜云,會有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()) {
           // 執(zhí)行運行程序
        } else {
            log.info("createProcess 獲取鎖失敗");
        }
    } catch (Exception e) {
        log.error("xxx", e);
    } finally {
        // 是否有鎖 && 是否當前線程
        if (lock != null && lock.isLocked() && lock.isHeldByCurrentThread()) {
            lock.unlock();
        }
    }
}

咋一看是沒有什么問題的,但是本次重構(gòu)的定時任務(wù)比較多,因此會涉及到很多try catch相同的代碼。

注解方式

解決重復(fù)代碼方式之一就是封裝,在就是注解切面,想到注解方式更加靈活

于是

/**
 * Redisson 同步鎖
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RedissonSyncLock {
    String pref();
    /**
     * 鎖后綴,一般前綴根據(jù)業(yè)務(wù)來定,后綴是具體的場景
     */
    String keyEL();
    /**
     * 等待時長 【需要區(qū)分是互斥還是阻塞,互斥默認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){
     // 程序執(zhí)行
}

的確使用起來是比較方便的。

以上就是spring boot優(yōu)雅集成redisson詳解的詳細內(nèi)容,更多關(guān)于spring boot集成redisson的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 128進制加密數(shù)據(jù)示例分享

    128進制加密數(shù)據(jù)示例分享

    這篇文章主要介紹了128進制加密數(shù)據(jù)示例,這里使用JAVA實現(xiàn),需要的朋友可以參考下
    2014-03-03
  • 詳解SpringCloud Ribbon 負載均衡通過服務(wù)器名無法連接的神坑

    詳解SpringCloud Ribbon 負載均衡通過服務(wù)器名無法連接的神坑

    這篇文章主要介紹了詳解SpringCloud Ribbon 負載均衡通過服務(wù)器名無法連接的神坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-06-06
  • 使用c3p0連接數(shù)據(jù)庫實現(xiàn)增刪改查

    使用c3p0連接數(shù)據(jù)庫實現(xiàn)增刪改查

    這篇文章主要為大家詳細介紹了使用c3p0連接數(shù)據(jù)庫實現(xiàn)增刪改查,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Java socket通信模擬QQ實現(xiàn)多人聊天室

    Java socket通信模擬QQ實現(xiàn)多人聊天室

    Socket在Java實戰(zhàn)網(wǎng)絡(luò)通信編程應(yīng)用中有非常重要的作用,你想要跟別人聯(lián)系都得通過socket占據(jù)端口來實現(xiàn),掌握Socket技術(shù)不僅在聊天應(yīng)用程序中需要用到(比如QQ什么的都都是用socket來寫的),而且對于學習 Asp.net 也非常有幫助
    2022-07-07
  • Java中解壓縮文件的方法詳解(通用)

    Java中解壓縮文件的方法詳解(通用)

    在軟件開發(fā)和數(shù)據(jù)處理領(lǐng)域,文件的解壓縮和壓縮是常見的任務(wù),下面這篇文章主要給大家介紹了關(guān)于Java中解壓縮文件的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-06-06
  • idea導(dǎo)入maven工程的三種方法

    idea導(dǎo)入maven工程的三種方法

    這篇文章主要介紹了idea導(dǎo)入maven工程的三種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • Springboot+devtools配置熱部署過程

    Springboot+devtools配置熱部署過程

    SpringBoot提供的spring-boot-devtools模塊可以實現(xiàn)應(yīng)用的熱部署,極大提升開發(fā)效率,通過添加POM依賴、配置yml文件、使用IDE快捷鍵等步驟,可以無需手動重啟即可自動加載變更,這種方式不僅適用于靜態(tài)文件的自動加載,也適用于整個SpringBoot工程,是提高開發(fā)效率的有效手段
    2024-11-11
  • idea中自動生成Java類圖和時序圖的圖文教程

    idea中自動生成Java類圖和時序圖的圖文教程

    本文主要介紹了idea中自動生成Java類圖和時序圖的圖文教程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • Ireport的安裝與使用教程

    Ireport的安裝與使用教程

    這篇文章主要介紹了Ireport的安裝與使用教程,需要的朋友可以參考下
    2021-10-10
  • spring整合JMS實現(xiàn)同步收發(fā)消息(基于ActiveMQ的實現(xiàn))

    spring整合JMS實現(xiàn)同步收發(fā)消息(基于ActiveMQ的實現(xiàn))

    本篇文章主要介紹了spring整合JMS實現(xiàn)同步收發(fā)消息(基于ActiveMQ的實現(xiàn)),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10

最新評論

葵青区| 双峰县| 丰镇市| 确山县| 县级市| 东方市| 平乡县| 策勒县| 双桥区| 武鸣县| 高唐县| 凤台县| 舞阳县| 靖江市| 兰坪| 沙湾县| 泾阳县| 武穴市| 安庆市| 桃园市| 晴隆县| 商水县| 湟源县| 江西省| 乐亭县| 定襄县| 湄潭县| 瑞安市| 丁青县| 常州市| 喀什市| 和龙市| 卓尼县| 东阳市| 沐川县| 手游| 洛阳市| 府谷县| 东阳市| 政和县| 巴青县|