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

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

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

技術(shù)棧:

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

工具:

  • lombok

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

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

實(shí)現(xiàn)

緩存抽象類

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

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上下文工具類

接下來我們實(shí)現(xiàn)一個(gè)Spring的上下文工具類,這個(gè)工具類需要實(shí)現(xiàn)ApplicationContextAware,作用就是負(fù)責(zé)管理bean的加載與實(shí)例化的,具體如何使用,請(qǐng)往下繼續(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ù)熱

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

@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這個(gè)注解在這里的作用是,需要在配置文件開啟cache.init.enable,理想值是true,默認(rèn)值是false。

cache.init.enable=true

使用

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

接下來創(chuàng)建一個(gè)AbstractCache的實(shí)現(xiàn)類,來實(shí)現(xiàn)具體的實(shí)現(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);
    }
}

然后啟動(dòng)項(xiàng)目,我們就發(fā)現(xiàn),Redis中已經(jīng)存好了熱點(diǎn)數(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)容可以,還請(qǐng)來個(gè)點(diǎn)贊和關(guān)注吧!

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

相關(guān)文章

  • Redis如何解決熱key問題

    Redis如何解決熱key問題

    這篇文章主要介紹了Redis如何解決熱key問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-07-07
  • Redis高可用部署架構(gòu)的實(shí)現(xiàn)

    Redis高可用部署架構(gòu)的實(shí)現(xiàn)

    本文主要介紹了Redis高可用部署架構(gòu)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • Redis cluster集群模式的原理解析

    Redis cluster集群模式的原理解析

    這篇文章主要介紹了Redis cluster集群模式的原理解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 解密Redis助力雙11背后電商秒殺系統(tǒng)(推薦)

    解密Redis助力雙11背后電商秒殺系統(tǒng)(推薦)

    這篇文章主要介紹了解密Redis助力雙11背后電商秒殺系統(tǒng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 大家都應(yīng)該知道的Redis過期鍵與過期策略

    大家都應(yīng)該知道的Redis過期鍵與過期策略

    這篇文章主要給大家介紹了一些應(yīng)該知道的Redis過期鍵與過期策略的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Linux環(huán)境搭建Redis6.x集群環(huán)境詳解(主從復(fù)制)

    Linux環(huán)境搭建Redis6.x集群環(huán)境詳解(主從復(fù)制)

    本文詳細(xì)介紹了如何搭建和管理一個(gè)Redis集群,包括主從復(fù)制、集群配置、批量腳本、集群啟動(dòng)和關(guān)閉、節(jié)點(diǎn)的增刪、投票機(jī)制以及主節(jié)點(diǎn)宕機(jī)演示,通過這些步驟,可以實(shí)現(xiàn)Redis集群的高可用性和性能擴(kuò)展
    2026-03-03
  • Redis出現(xiàn)中文亂碼的問題及解決

    Redis出現(xiàn)中文亂碼的問題及解決

    這篇文章主要介紹了Redis出現(xiàn)中文亂碼的問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • Redis序列化存儲(chǔ)及日期格式的問題處理

    Redis序列化存儲(chǔ)及日期格式的問題處理

    這篇文章主要介紹了Redis序列化存儲(chǔ)及其日期格式的問題處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Win10下通過Ubuntu安裝Redis的過程

    Win10下通過Ubuntu安裝Redis的過程

    這篇文章主要介紹了Win10下通過Ubuntu安裝Redis,在安裝Ubuntu需要先打開Windows功能,接著創(chuàng)建一個(gè)用戶及密碼,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • 比較幾種Redis集群方案

    比較幾種Redis集群方案

    Redis高可用集群是一個(gè)由多個(gè)主從節(jié)點(diǎn)群組成的分布式服務(wù)器群,它具有復(fù)制、高可用和分片特性。Redis集群不需要sentinel哨兵也能完成節(jié)點(diǎn)移除和故障轉(zhuǎn)移的功能,只要將每個(gè)節(jié)點(diǎn)設(shè)置成集群模式,這種集群模式?jīng)]有中心節(jié)點(diǎn),可水平擴(kuò)展,官方稱可以線性擴(kuò)展到上萬個(gè)節(jié)點(diǎn)
    2021-06-06

最新評(píng)論

依兰县| 密云县| 许昌县| 嘉峪关市| 忻城县| 隆安县| 盖州市| 通渭县| 边坝县| 许昌县| 汝城县| 巴里| 昭苏县| 玛沁县| 泸溪县| 施甸县| 沈阳市| 诸城市| 会同县| 罗源县| 景德镇市| 普兰县| 承德县| 河间市| 江孜县| 根河市| 大埔区| 景泰县| 镇原县| 澎湖县| 广河县| 吉安市| 阿城市| 博白县| 辽源市| 峨眉山市| 深泽县| 韩城市| 广州市| 蓬安县| 突泉县|