国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

redisson+aop實現(xiàn)分布式鎖

這篇具有很好參考價值的文章主要介紹了redisson+aop實現(xiàn)分布式鎖。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

基于注解實現(xiàn),一個注解搞定緩存

Aop:面向切面編程,在不改變核心代碼的基礎上實現(xiàn)擴展,有以下應用場景

①事務

②日志

③controlleradvice+expetcationhandle實現(xiàn)全局異常

④redissson+aop實現(xiàn)分布式鎖

⑤認證授權

Aop的實現(xiàn)存在與bean的后置處理器beanpostprocessAfterinitlazing

一,實現(xiàn)步驟

1.定義注解

注解的定義仿照@translation進行定義



@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface GmallCache {
    //注解里面的自定義參數(shù)
    String prefix() default "cache";
    String suffix() default "info";
}

2.創(chuàng)建切面

參照官網(wǎng)

https://docs.spring.io/spring-framework/docs/5.3.9-SNAPSHOT/reference/html/core.html#aop文章來源地址http://www.zghlxwxcb.cn/news/detail-805593.html


@Aspect     //定義一個切面
@Component  //交給ioc管理
public class GmallAspect {

    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private RedissonClient redissonClient;


    /**
     * 使用注解+aop實現(xiàn)緩存實現(xiàn)思路
     * ①首先的定義一個注解,仿照@transactional注解去實現(xiàn),他就是在aop的基礎上實現(xiàn)的
     * ②定義一個切面,交由ioc容器來管理
     * ③去官網(wǎng)找到環(huán)繞通知的實例在此基礎上進行修改
     * ④around注解里面掃描所有加了定義注解的內(nèi)容
     * ⑤方法體里面首先獲取添加了注解的方法,然后獲取方法上的注解以及里面的參數(shù)
     * ⑥一切準備就緒,準備redis里面的key,先從redis里面查詢,根據(jù)json數(shù)據(jù),判斷是否為空,如果為空直接返回空,如果不為空,則獲取運行時類型,根據(jù)反射拿到對象
     *⑦redis里面有,直接返回
     * ⑧redis里面沒有,定義lockKey,上鎖
     * ⑨判斷是否拿到鎖,拿不到則等待一會兒,并自旋
     * ⑩拿到鎖,則從數(shù)據(jù)庫查詢
     *          查詢到:存往redis,返回,由于不確定對象的類型,此處存往reids使用json格式
     *          查詢不到:預防緩存穿透①存空串(不建議)②使用反射創(chuàng)建空對象返回
     *  十一:釋放鎖
     */

    //定義一個環(huán)繞通知并且掃描,簡單的說就是對加了這個注解的所有方法增強
    @Around("@annotation(com.atguigu.gmall.common.cache.GmallCache)")
    public Object gmallCacheImpl(ProceedingJoinPoint joinPoint) throws Throwable {
        //創(chuàng)建返回對象
        Object object = new Object();
        //獲取加了注解的方法
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        //獲取注解
        GmallCache annotation = method.getAnnotation(GmallCache.class);
        //獲取注解參數(shù)
        String prefix = annotation.prefix();
        String suffix = annotation.suffix();
        //準備key
        String key = prefix + Arrays.toString(joinPoint.getArgs()) + suffix;
        //從緩存里面查詢
        object = cacheNull(key, signature);
        //判斷緩存是否存在
        if (ObjectUtils.isEmpty(object)) {
            //不存在,從數(shù)據(jù)庫查詢
            //上鎖
            String lockKey = prefix + Arrays.toString(joinPoint.getArgs());
            //獲取鎖
            RLock lock = redissonClient.getLock(lockKey);
            boolean res = lock.tryLock(20, 10, TimeUnit.SECONDS);//此處數(shù)字要定義為常量
            try {
                if (res) {
                    //獲取到了鎖
                    //從數(shù)據(jù)庫查詢
                    object = joinPoint.proceed();
                    if (ObjectUtils.isEmpty(object)) {
                        //使用拿到返回值的運行時類型,使用反射創(chuàng)建對象
                        Object instance = signature.getReturnType().newInstance();
                        //數(shù)據(jù)庫查詢不到,預防緩存穿透
                       // Object obj = new Object();
                        //存儲到數(shù)據(jù)庫
                        redisTemplate.opsForValue().setIfAbsent(key, JSON.toJSONString(instance), 15, TimeUnit.SECONDS);
                        return instance;//返回skuinfo
                    } else {
                        //查詢到了
                        //存儲到數(shù)據(jù)庫
                        redisTemplate.opsForValue().set(key, JSON.toJSONString(object));
                        return object;
                    }
                } else {
                    //沒有獲取到等待,自旋
                    Thread.sleep(300);
                    return gmallCacheImpl(joinPoint);
                }
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            } finally {
                //解鎖
                lock.unlock();
            }
        } else {
            //存在
            return object;
        }
        //保底從數(shù)據(jù)庫查詢
        return joinPoint.proceed();
    }

    /**
     * 從緩存查詢數(shù)據(jù)
     *
     * @param key
     * @param signature
     * @return
     */
    private Object cacheNull(String key, MethodSignature signature) {
        String str = (String) redisTemplate.opsForValue().get(key);
        if (!StringUtils.isEmpty(str)) {
            //獲取返回類型
            Class returnType = signature.getReturnType();
            //轉換
            Object object = JSON.parseObject(str, returnType);
            return object;
        }

        return null;
    }


}


到了這里,關于redisson+aop實現(xiàn)分布式鎖的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Spring Boot 集成 Redisson 實現(xiàn)分布式鎖

    Spring Boot 集成 Redisson 實現(xiàn)分布式鎖

    ????????Redisson 是一種基于 Redis 的 Java 駐留集群的分布式對象和服務庫,可以為我們提供豐富的分布式鎖和線程安全集合的實現(xiàn)。在 Spring Boot 應用程序中使用 Redisson 可以方便地實現(xiàn)分布式應用程序的某些方面,例如分布式鎖、分布式集合、分布式事件發(fā)布和訂閱等。本篇

    2024年02月08日
    瀏覽(24)
  • Redis分布式鎖及Redisson的實現(xiàn)原理

    Redis分布式鎖及Redisson的實現(xiàn)原理

    Redis分布式鎖 在討論分布式鎖之前我們回顧一下一些單機鎖,比如synchronized、Lock 等 鎖的基本特性: 1.互斥性:同一時刻只能有一個節(jié)點訪問共享資源,比如一個代碼塊,或者同一個訂單同一時刻只能有一個線程去支付等。 2.可重入性: 允許一個已經(jīng)獲得鎖的線程,在沒有釋

    2024年02月06日
    瀏覽(23)
  • 源碼篇--Redisson 分布式鎖lock的實現(xiàn)

    我們知道Redis 緩存可以使用setNx來作為分布式鎖,但是我們直接使用setNx 需要考慮鎖過期的問題;此時我們可以使用Redisson 的lock 來實現(xiàn)分布式鎖,那么lock 內(nèi)部幫我們做了哪些工作呢。 RedisConfig.java lock.lock() 阻塞獲取 redis 鎖,獲取到鎖之后繼續(xù)向下執(zhí)行業(yè)務邏輯; lockInterr

    2024年01月25日
    瀏覽(33)
  • 微服務系列文章之 Redisson實現(xiàn)分布式鎖

    微服務系列文章之 Redisson實現(xiàn)分布式鎖

    當我們在設計分布式鎖的時候,我們應該考慮分布式鎖至少要滿足的一些條件,同時考慮如何高效的設計分布式鎖,這里我認為以下幾點是必須要考慮的。 1、互斥 在分布式高并發(fā)的條件下,我們最需要保證,同一時刻只能有一個線程獲得鎖,這是最基本的一點。 2、防止死

    2024年02月15日
    瀏覽(20)
  • 微服務系列文章之 Redisson實現(xiàn)分布式鎖(3)

    微服務系列文章之 Redisson實現(xiàn)分布式鎖(3)

    1、技術架構 項目總體技術選型 2、加鎖方式 該項目支持? 自定義注解加鎖 ?和? 常規(guī)加鎖 ?兩種模式 自定義注解加鎖 常規(guī)加鎖 3、Redis部署方式 該項目支持四種Redis部署方式 該項目已經(jīng)實現(xiàn)支持上面四種模式,你要采用哪種只需要修改配置文件 application.properties ,項目代碼

    2024年02月16日
    瀏覽(18)
  • 微服務系列文章之 Redisson實現(xiàn)分布式鎖(2)

    1、概念 很明顯RLock是繼承Lock鎖,所以他有Lock鎖的所有特性,比如lock、unlock、trylock等特性,同時它還有很多新特性:強制鎖釋放,帶有效期的鎖,。 2、RLock鎖API 這里針對上面做個整理,這里列舉幾個常用的接口說明 RLock相關接口,主要是新添加了? leaseTime ?屬性字段,主要是

    2024年02月16日
    瀏覽(22)
  • 在Java項目中使用redisson實現(xiàn)分布式鎖

    在Java項目中使用Redission自定義注解實現(xiàn)分布式鎖: 添加Redission依賴項:在項目的pom.xml中添加Redission依賴項: 創(chuàng)建自定義注解:創(chuàng)建一個自定義注解來標記需要使用分布式鎖的方法。例如,創(chuàng)建一個名為 @DistributedLock 的注解: 創(chuàng)建注解切面:創(chuàng)建一個切面類,通過AOP將注解

    2024年02月16日
    瀏覽(25)
  • spring boot 實現(xiàn)Redisson分布式鎖及其讀寫鎖

    分布式鎖,就是控制分布式系統(tǒng)中不同進程共同訪問同一共享資源的一種鎖的實現(xiàn)。 1、引入依賴 2、配置文件 3、配置類 4、測試代碼 5、理解 一、時間設置 默認 lock() 小結 lock.lock (); (1)默認指定鎖時間為30s(看門狗時間) (2)鎖的自動續(xù)期:若是業(yè)務超長,運行期間自

    2024年02月12日
    瀏覽(20)
  • redis實戰(zhàn)-redis實現(xiàn)分布式鎖&redisson快速入門

    redis實戰(zhàn)-redis實現(xiàn)分布式鎖&redisson快速入門

    前言 集群環(huán)境下的并發(fā)問題 ?分布式鎖 定義 需要滿足的條件 常見的分布式鎖 redis實現(xiàn)分布式鎖 核心思路 代碼實現(xiàn) 誤刪情況 邏輯說明 解決方案 代碼實現(xiàn) 更為極端的誤刪情況 Lua腳本解決原子性問題 分布式鎖-redission redisson的概念 快速入門 總結 在前面我們已經(jīng)實現(xiàn)了單機

    2024年02月09日
    瀏覽(26)
  • 【Redisson】分布式鎖源碼分析如何實現(xiàn)多個應用實例互斥

    lockName就是保存到Redis里面的key 直接進行構建方法里面的 super(commandExecutor, name); org.redisson.connection.ServiceManager : private final String id = UUID.randomUUID().toString(); 這個 id 就是 UUID : this.id = getServiceManager().getId(); 這個entryName通過UUID可以區(qū)分是哪個應用實例 entryName+threadId可以區(qū)分哪個應

    2024年02月11日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包