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

關(guān)于單體架構(gòu)緩存刷新實(shí)現(xiàn)方案

這篇具有很好參考價(jià)值的文章主要介紹了關(guān)于單體架構(gòu)緩存刷新實(shí)現(xiàn)方案。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

背景

如果各位看官是分布式項(xiàng)目應(yīng)該都采用分布式緩存了,例如redis等,分布式緩存不在本次討論范圍哈;我個(gè)人建議是,如果是用戶量比較大,建議采用分布式緩存機(jī)制,后期可以很容易前后到分布式服務(wù)或微服務(wù)。

我這邊項(xiàng)目基本上都是單體架構(gòu),因?yàn)闃I(yè)務(wù)場(chǎng)景需要,用戶一般就幾十個(gè),最多,最多也就是100多用戶,所以,單體是完全滿足的,同時(shí)用戶對(duì)于系統(tǒng)的要求也不高,因此采用了單體架構(gòu),但是后期可以切換到分布式,這是后期需求,如果遇到在調(diào)整。

問題

ok,背景介紹完。那就是說下單體的問題出現(xiàn)的情況;由于業(yè)務(wù)場(chǎng)景需要,很多的應(yīng)用緩存和功能局部緩存,一開始設(shè)計(jì)這塊時(shí),就沒好好設(shè)計(jì)這塊,現(xiàn)在遇到問題了;第一個(gè),應(yīng)用緩存比較亂(也有公共的緩存機(jī)制,但是有些業(yè)務(wù)不希望放到公共緩存里,一般就在當(dāng)前類上定義了緩存),第二個(gè)線上也出現(xiàn)了幾次因?yàn)榫彺嫖醇皶r(shí)刷新,造成垃圾數(shù)據(jù)的產(chǎn)生,因此,在這些問題的出現(xiàn)后,需要進(jìn)一步設(shè)計(jì)緩存機(jī)制了,在不大調(diào)整業(yè)務(wù)代碼的前提下如何及時(shí)進(jìn)行刷新應(yīng)用緩存呢?

應(yīng)用緩存刷新

一開始刷新機(jī)制很簡(jiǎn)單,有模糊匹配緩存key進(jìn)行刪除,有指定key進(jìn)行刪除的,但是總有寫業(yè)務(wù)寫的不太規(guī)范,有些亂,關(guān)鍵后期也不曉得,在什么情況下進(jìn)行刷新了緩存,這樣的操作將會(huì)給后期項(xiàng)目遺留問題;怎么解決呢?方案是創(chuàng)建緩存接口,需要進(jìn)行實(shí)現(xiàn)接口,然后需要進(jìn)行緩存刷新的,實(shí)現(xiàn)該接口進(jìn)行處理,什么時(shí)間進(jìn)行刷新呢,根據(jù)業(yè)務(wù),進(jìn)行通知即可;現(xiàn)在面臨著一個(gè)問題,有些類是交給spring管理的,有些類是項(xiàng)目自己管理的并沒有交給spring,這個(gè)問題如何解決呢?也好解決,第一種,全部交給spring容器管理,通過spring拿到所有刷新緩存接口實(shí)現(xiàn)類,進(jìn)行循環(huán)調(diào)用刷新接口,這塊屬于一刀切,不過比較簡(jiǎn)單,我這邊沒有采用;第二種是原有代碼不調(diào)整,之前什么樣就是什么樣,那就要有spi機(jī)制,這塊可以采用谷歌服務(wù)發(fā)現(xiàn)方式,這里還需要考慮一個(gè)問題,如果交給spring就不用spi發(fā)現(xiàn),沒有交給spring就需要進(jìn)行發(fā)現(xiàn),但是為了防止重復(fù),優(yōu)先使用sping機(jī)制進(jìn)行獲取所偶刷新解決的實(shí)現(xiàn)類,然后通過spi找到所有實(shí)現(xiàn)的類,進(jìn)行排查把增量的實(shí)現(xiàn)類添加給緩存類進(jìn)行統(tǒng)一循環(huán)處理即可

demo:文章來源地址http://www.zghlxwxcb.cn/news/detail-615143.html

@Service
@Slf4j
public class RefreshCacheUtils implements ApplicationContextAware, ApplicationRunner {

    private final static List<RefreshCache> REFRESH_CACHE_LIST = new ArrayList<>();

    private ApplicationContext applicationContext;

    
    public static void refreshByDeviceId(String deviceId) {
        for (RefreshCache refreshCache : REFRESH_CACHE_LIST) {
            refreshCache.refreshByDeviceId(deviceId);
        }
    }

    
    public static void refreshByBusinessId(String businessId) {
        for (RefreshCache refreshCache : REFRESH_CACHE_LIST) {
            refreshCache.refreshByBusinessId(businessId);
        }
    }

    
    public static void refreshdDefaultExecution(String otherParameter) {
        for (RefreshCache refreshCache : REFRESH_CACHE_LIST) {
            refreshCache.defaultExecution(otherParameter);
        }
    }

    /**
     * @param args
     * @throws Exception
     */
    @Override
    public void run(ApplicationArguments args) throws Exception {
        Map<String, RefreshCache> beans = applicationContext.getBeansOfType(RefreshCache.class);

        //使用jdk提供的類ServiceLoader來加載RefreshCache的子類
        //如果服務(wù)發(fā)現(xiàn)沒有,請(qǐng)檢查RefreshCache實(shí)現(xiàn)類是否添加注解:@AutoService(value = RefreshCache.class)
        //如果實(shí)現(xiàn)了RefreshCache的對(duì)應(yīng)的類是被spring管理,就不用加@AutoService(value = RefreshCache.class),這塊邏輯已經(jīng)進(jìn)行整合了
        ServiceLoader<RefreshCache> loaders = ServiceLoader.load(RefreshCache.class);
        //把spring容器里的Cache實(shí)現(xiàn)類直接放入緩存
        REFRESH_CACHE_LIST.addAll(beans.values());
        //在進(jìn)行處理spi
        loaders.stream().forEach(s -> {
            //是否已經(jīng)存在spring容器進(jìn)行打標(biāo)記
            AtomicBoolean isExistFlag = new AtomicBoolean(false);

            for (RefreshCache refreshCache : REFRESH_CACHE_LIST) {
                String name = refreshCache.getClass().getName();
                String spiName = s.get().getClass().getName();
                //判斷spi的對(duì)象是否在spring容器里,如果在直接打上標(biāo)記為true并結(jié)束循環(huán)
                if (name.equals(spiName) || name.contains(spiName + "$$")) {
                    isExistFlag.set(true);
                    break;
                }
            }
            //判斷標(biāo)記是否為true,如果為true就說明都不處理,如果為false,加入到刷新緩存列表
            if (!isExistFlag.get()) {
                REFRESH_CACHE_LIST.add(s.get());
            }
        });

        log.info("所有待刷新緩存對(duì)象信息初始化完成:{}", REFRESH_CACHE_LIST);

    }

    /**
     * @param applicationContext
     * @throws BeansException
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}

到了這里,關(guān)于關(guān)于單體架構(gòu)緩存刷新實(shí)現(xiàn)方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java架構(gòu)師緩存通用設(shè)計(jì)方案

    Java架構(gòu)師緩存通用設(shè)計(jì)方案

    想學(xué)習(xí)架構(gòu)師構(gòu)建流程請(qǐng)?zhí)D(zhuǎn):Java架構(gòu)師系統(tǒng)架構(gòu)設(shè)計(jì) 在實(shí)際應(yīng)用中需要考慮的實(shí)際問題。首先,前端頁面可以做緩存,雖然圖上沒有顯示,但在現(xiàn)實(shí)應(yīng)用中這是提高性能的一個(gè)重要方面。前端頁面緩存可以將靜態(tài)內(nèi)容

    2024年02月07日
    瀏覽(32)
  • Redis緩存設(shè)計(jì)與性能優(yōu)化【緩存和數(shù)據(jù)庫不一致問題,解決方案:1.加過期時(shí)間這樣可以一段時(shí)間后自動(dòng)刷新 2.分布式的讀寫鎖】

    Redis緩存設(shè)計(jì)與性能優(yōu)化【緩存和數(shù)據(jù)庫不一致問題,解決方案:1.加過期時(shí)間這樣可以一段時(shí)間后自動(dòng)刷新 2.分布式的讀寫鎖】

    在大并發(fā)下,同時(shí)操作數(shù)據(jù)庫與緩存會(huì)存在數(shù)據(jù)不一致性問題 1、雙寫不一致情況 2、讀寫并發(fā)不一致 解決方案: 1、對(duì)于并發(fā)幾率很小的數(shù)據(jù)(如個(gè)人維度的訂單數(shù)據(jù)、用戶數(shù)據(jù)等),這種幾乎不用考慮這個(gè)問題,很少會(huì)發(fā)生緩存不一致, 可以給緩存數(shù)據(jù)加上過期時(shí)間,每隔一

    2024年04月13日
    瀏覽(29)
  • 【技術(shù)解決方案】(多級(jí))緩存架構(gòu)最佳實(shí)踐

    【技術(shù)解決方案】(多級(jí))緩存架構(gòu)最佳實(shí)踐

    凌晨三點(diǎn)半了,太困了,還差一些,明天補(bǔ)上… 因?yàn)樽约鹤罱龅捻?xiàng)目涉及到了緩存,所以水一篇緩存相關(guān)的文章,供大家作為參考,若發(fā)現(xiàn)文章有紕漏,希望大家多指正。 緩存涉及到的范圍頗廣,從CPU緩存,到進(jìn)程內(nèi)緩存,到進(jìn)程外緩存。再加上已經(jīng)凌晨一點(diǎn)了,我得保

    2024年02月07日
    瀏覽(24)
  • vue項(xiàng)目關(guān)于iframe嵌套的頁面,在切換tab標(biāo)簽時(shí)會(huì)被重新刷新的問題處理方案

    這兩天工作中遇到一個(gè)這樣的需求,切換tab標(biāo)簽時(shí),要求對(duì)應(yīng)的tab頁面不刷新,但是項(xiàng)目中加入了一部分含有iframe的頁面,在切換路由的過程中,如果使用keep-alive是達(dá)不到緩存ifram嵌套的頁面效果的。 vue中的keep-alive 1.原理:vue 的緩存機(jī)制并 不是直接存儲(chǔ) DOM 結(jié)構(gòu) ,而是將

    2024年02月04日
    瀏覽(59)
  • 轉(zhuǎn)載 spring @Cacheable擴(kuò)展實(shí)現(xiàn)緩存自動(dòng)過期時(shí)間以及自動(dòng)刷新

    轉(zhuǎn)載 spring @Cacheable擴(kuò)展實(shí)現(xiàn)緩存自動(dòng)過期時(shí)間以及自動(dòng)刷新

    用過spring cache的朋友應(yīng)該會(huì)知道,Spring Cache默認(rèn)是不支持在@Cacheable上添加過期時(shí)間的,雖然可以通過配置緩存容器時(shí)統(tǒng)一指定。形如 復(fù)制 但有時(shí)候我們會(huì)更習(xí)慣通過注解指定過期時(shí)間。今天我們就來聊一下如何擴(kuò)展@Cacheable實(shí)現(xiàn)緩存自動(dòng)過期以及緩存即將到期自動(dòng)刷新 2 實(shí)現(xiàn)

    2024年02月03日
    瀏覽(13)
  • 【案例實(shí)戰(zhàn)】高并發(fā)業(yè)務(wù)的多級(jí)緩存架構(gòu)一致性解決方案

    【案例實(shí)戰(zhàn)】高并發(fā)業(yè)務(wù)的多級(jí)緩存架構(gòu)一致性解決方案

    我們?cè)诟卟l(fā)的項(xiàng)目中基本上都離不開緩存,那么既然引入緩存,那就會(huì)有一個(gè)緩存與數(shù)據(jù)庫數(shù)據(jù)一致性的問題。 首先,我們先來看看高并發(fā)項(xiàng)目里面Redis常見的三種緩存讀寫模式。 Cache Aside 優(yōu)點(diǎn) 讀取效率高,緩存命中率高,寫操作與數(shù)據(jù)庫同步,數(shù)據(jù)一致性較高,實(shí)現(xiàn)較

    2024年02月13日
    瀏覽(29)
  • 用Selenium操作網(wǎng)頁,如何在打開網(wǎng)站的過程中,實(shí)現(xiàn)刷新,清除緩存的效果

    在使用 Selenium 操作網(wǎng)頁時(shí),可以通過控制瀏覽器選項(xiàng)來實(shí)現(xiàn)刷新和清除緩存的效果。下面是使用 Python 和 Selenium 的示例代碼: 刷新網(wǎng)頁: 清除緩存: 在上述代碼中,我們首先創(chuàng)建了一個(gè)瀏覽器對(duì)象,并打開了一個(gè)網(wǎng)站。然后,通過 refresh() 方法刷新頁面,或者通過禁用緩存

    2024年01月24日
    瀏覽(50)
  • 深入淺出 -- 系統(tǒng)架構(gòu)之單體架構(gòu)

    深入淺出 -- 系統(tǒng)架構(gòu)之單體架構(gòu)

    單體架構(gòu)(Monolithic Architecture)是一種傳統(tǒng)的軟件架構(gòu)模式,將整個(gè)應(yīng)用程序作為一個(gè)單一的、統(tǒng)一的單元進(jìn)行開發(fā)、部署和擴(kuò)展。在單體架構(gòu)中,所有的功能模塊都被打包在一起,共享同一個(gè)代碼庫和數(shù)據(jù)庫。 例如,在網(wǎng)上商城系統(tǒng)中,JavaWeb工程通常會(huì)被打成WA R包部署在

    2024年04月10日
    瀏覽(23)
  • springboot 集成caffeine單體緩存兩種方式及算法簡(jiǎn)介 (注解/手動(dòng))

    ? ? ? ?Caffeine 是基于 JAVA 8 的高性能緩存庫。并且在 spring5 (springboot 2.x) 后,spring 官方放棄了 Guava,而使用了性能更優(yōu)秀的 Caffeine 作為默認(rèn)緩存組件。 ? ? ? ?Caffeine 因?yàn)槭褂昧? Window-TinyLFU ?緩存淘汰策略,提供了一個(gè) 近乎最佳的命中率 。綜合了?LRU?和 LFU 算法的長(zhǎng)處,

    2024年02月03日
    瀏覽(23)
  • 微服務(wù)概述之單體架構(gòu)

    微服務(wù)概述之單體架構(gòu)

    互聯(lián)網(wǎng)始于 1969年美國(guó)的阿帕網(wǎng)(ARPA),最開始的阿帕網(wǎng)只在美國(guó)軍方使用。隨著時(shí)間的推移,一些大學(xué)也開始加入建設(shè),慢慢演化成了現(xiàn)在的因特網(wǎng) (Internet)。隨著計(jì)算機(jī)網(wǎng)絡(luò)的普及,到現(xiàn)在全世界幾乎一半的人口,都在使用互聯(lián)網(wǎng)產(chǎn)品。日常生活中的各種場(chǎng)景,如商場(chǎng)

    2024年01月22日
    瀏覽(17)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包