亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解Redis緩存預(yù)熱的實現(xiàn)方法

 更新時間:2023年10月10日 11:11:00   作者:vker  
緩存預(yù)熱是一種在程序啟動或緩存失效之后,主動將熱點數(shù)據(jù)加載到緩存中的策略,本文將給大家分享一下如何實現(xiàn)Redis的緩存預(yù)熱,文中有詳細(xì)的實現(xiàn)代碼,需要的朋友可以參考下

技術(shù)棧:

  • SpringBoot 3.0.2
  • Redis4
  • MySQL8
  • Mybatis-Plus 3.5.3.1
  • Druid 1.2.18

工具:

  • lombok

什么是緩存預(yù)熱?

緩存預(yù)熱是一種在程序啟動或緩存失效之后,主動將熱點數(shù)據(jù)加載到緩存中的策略。 這樣,在實際請求到達(dá)程序時,熱點數(shù)據(jù)已經(jīng)存在于緩存中,從而減少了緩存穿透和緩存擊穿的情況,也緩解了SQL服務(wù)器的壓力。

實現(xiàn)

緩存抽象類

首先我們先來實現(xiàn)一個緩存抽象類,這個抽象類的作用就是在將來我們需要將某個模塊的數(shù)據(jù)需要提前加載到緩存中的時候,我們可以創(chuàng)建一個它的實現(xiàn)類,來進(jìn)行數(shù)據(jù)的緩存與加載,具體使用方式請看后邊我寫的例子。

public abstract class AbstractCache {
    /**
     * 緩存
     */
    protected abstract void init();
    /**
     * 獲取緩存
     *
     * @param <T>
     * @return
     */
    public abstract <T> T get();
    /**
     * 清理緩存
     */
    public abstract void clear();
    /**
     * 重新加載
     */
    public void reload() {
        clear();
        init();
    }
}

Spring上下文工具類

接下來我們實現(xiàn)一個Spring的上下文工具類,這個工具類需要實現(xiàn)ApplicationContextAware,作用就是負(fù)責(zé)管理bean的加載與實例化的,具體如何使用,請往下繼續(xù)閱讀。

@Component
public class ApplicationContextUtil implements ApplicationContextAware {
    private static ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ApplicationContextUtil.applicationContext = applicationContext;
    }
    /**
     * 獲取上下文
     * @return
     */
    public static ApplicationContext getContext() {
        return applicationContext;
    }
}

緩存預(yù)熱

然后我們來實現(xiàn),在程序啟動后,直接進(jìn)行數(shù)據(jù)的緩存加載,這個類需要實現(xiàn)CommandLineRunner接口,這個接口提供的方法作用就是在程序啟動后自動運行。這個實現(xiàn)類里,我們使用ApplicationContextUtil工具類來獲取上下文,然后通過getBeansOfType方法獲取實現(xiàn)AbstractCache抽象類的子類,返回的是一個Map類型的集合,接下來通過getBean方法以多態(tài)的方式實例化子類,最后我們調(diào)用抽象類的init方法即可。如果有多個實現(xiàn)類,使用@Order注解標(biāo)注先后運行就可以了。

@Component
@ConditionalOnProperty(name = {"cache.init.enable"}, havingValue = "true", matchIfMissing = false)
public class CachePreheatHandler implements CommandLineRunner {
    /**
     * 緩存預(yù)熱
     * @param args
     * @throws Exception
     */
    @Override
    public void run(String... args) throws Exception {
        ApplicationContext context = ApplicationContextUtil.getContext();
        Map<String, AbstractCache> beansOfType = context.getBeansOfType(AbstractCache.class);
        for (Map.Entry<String, AbstractCache> cacheEntry : beansOfType.entrySet()) {
            AbstractCache cache = context.getBean(cacheEntry.getValue().getClass());
            cache.init();
        }
    }
}

解釋:

@ConditionalOnProperty這個注解在這里的作用是,需要在配置文件開啟cache.init.enable,理想值是true,默認(rèn)值是false。

cache.init.enable=true

使用

我們就以新聞熱點為例,數(shù)據(jù)庫中有一張tb_news新聞表,均為微博熱搜體育榜內(nèi)容。

接下來創(chuàng)建一個AbstractCache的實現(xiàn)類,來實現(xiàn)具體的實現(xiàn)

@Component
@RequiredArgsConstructor
public class NewsCache extends AbstractCache {
    private static final String NEWS_KEY = "news";
    private final RedisTemplate<String, Object> redisTemplate;
    private final NewsService newsService;
    @Override
    protected void init() {
        if (Boolean.FALSE.equals(redisTemplate.hasKey(NEWS_KEY))) {
            redisTemplate.opsForValue().set(NEWS_KEY, newsService.list(), 30, TimeUnit.MINUTES);
        }
    }
    @Override
    public <T> T get() {
        if (Boolean.FALSE.equals(redisTemplate.hasKey(NEWS_KEY))) {
            reload();
        }
        return (T) redisTemplate.opsForValue().get(NEWS_KEY);
    }
    @Override
    public void clear() {
        redisTemplate.delete(NEWS_KEY);
    }
}

然后啟動項目,我們就發(fā)現(xiàn),Redis中已經(jīng)存好了熱點數(shù)據(jù)

最后可以通過get方法獲取數(shù)據(jù)了,也不用擔(dān)心數(shù)據(jù)過期了。

@RestController
@RequestMapping("/news")
@RequiredArgsConstructor
public class NewsController {
    private final NewsCache newsCache;
    @GetMapping("/cache")
    public List<News> list() {
        return newsCache.get();
    }
}

好了,小伙伴們,今天的分享就到此結(jié)束了,歡迎留出建議,如果覺得內(nèi)容可以,還請來個點贊和關(guān)注吧!

以上就是詳解Redis緩存預(yù)熱的實現(xiàn)方法的詳細(xì)內(nèi)容,更多關(guān)于Redis緩存預(yù)熱的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Redis實現(xiàn)用戶簽到的示例代碼

    Redis實現(xiàn)用戶簽到的示例代碼

    Redis的位圖可以高效實現(xiàn)用戶簽到功能,每個bit位對應(yīng)一個簽到狀態(tài),節(jié)省存儲空間,利用SETBIT、GETBIT等命令操作簽到數(shù)據(jù),可統(tǒng)計連續(xù)簽到天數(shù)和本月簽到情況,感興趣的可以了解一下
    2024-09-09
  • 推薦一款神仙顏值的 Redis 客戶端工具(速收藏)

    推薦一款神仙顏值的 Redis 客戶端工具(速收藏)

    這篇文章主要給大家推薦一款神仙顏值的 Redis 客戶端工具(速收藏),非常好用的redis桌面管理工具,可以運行于Linux、Windows、Mac三大平臺,并且當(dāng)加載大數(shù)量的key不會crash,感興趣的朋友跟隨小編一起看看吧
    2020-12-12
  • Redis安裝教程圖解

    Redis安裝教程圖解

    Redis是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。本文就教大家如何安裝Redis,需要的朋友可以參考下
    2015-10-10
  • Redis BloomFilter實例講解

    Redis BloomFilter實例講解

    這篇文章主要介紹了Redis BloomFilter實例。BloomFilter不需要存儲key,節(jié)省空間,在某些對保密要求非常嚴(yán)格的場合有優(yōu)勢。想要進(jìn)一步了解BloomFilter運用實例的小伙伴可以了解一下這篇文章
    2021-09-09
  • Redis Sorted Set類型使用及應(yīng)用場景

    Redis Sorted Set類型使用及應(yīng)用場景

    Sorted Set是Redis常用的一種是數(shù)據(jù)類型,本文主要介紹了Redis Sorted Set類型使用及應(yīng)用場景,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • Redis sort 排序命令詳解

    Redis sort 排序命令詳解

    這篇文章主要介紹了Redis sort 排序命令詳解,本文講解了默認(rèn)排序命令、排序方式命令、BY語法、GET用法示例等內(nèi)容,需要的朋友可以參考下
    2015-07-07
  • 解決redis啟動的警告日志問題

    解決redis啟動的警告日志問題

    這篇文章主要介紹了解決redis啟動的警告日志問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Window下對Redis進(jìn)行開啟與關(guān)閉的操作方法

    Window下對Redis進(jìn)行開啟與關(guān)閉的操作方法

    這篇文章主要介紹了Window下對Redis進(jìn)行開啟與關(guān)閉的操作方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-11-11
  • Redis存儲斷點續(xù)傳文件狀態(tài)的最佳實踐

    Redis存儲斷點續(xù)傳文件狀態(tài)的最佳實踐

    在斷點續(xù)傳系統(tǒng)中,如何高效地存儲和更新文件上傳狀態(tài)是關(guān)鍵,得益于 Redis 高效的內(nèi)存操作和多種數(shù)據(jù)結(jié)構(gòu)的支持,它非常適合用于存儲上傳過程中的臨時狀態(tài)信息,下面,我們將探討如何利用 Redis 實現(xiàn)文件上傳狀態(tài)的存儲,需要的朋友可以參考下
    2024-12-12
  • 淺談Redis的異步機(jī)制

    淺談Redis的異步機(jī)制

    命令操作、系統(tǒng)配置、關(guān)鍵機(jī)制、硬件配置等會影響 Redis 的性能,還要提前準(zhǔn)備好應(yīng)對異常的方案,本文主要介紹了Redis的異步機(jī)制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05

最新評論