色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何在SpringBoot中解決Redis的緩存穿透等問題

jf_78858299 ? 來源:JAVA日知錄 ? 作者:飄渺Jam ? 2023-04-28 11:35 ? 次閱讀

今天給大家介紹一下如何在SpringBoot中解決Redis的緩存穿透、緩存擊穿、緩存雪崩的問題。

緩存穿透

什么是緩存穿透

緩存穿透指的是一個緩存系統無法緩存某個查詢的數據,從而導致這個查詢每一次都要訪問數據庫。

常見的Redis緩存穿透場景包括:

  1. 查詢一個不存在的數據:攻擊者可能會發送一些無效的查詢來觸發緩存穿透。
  2. 查詢一些非常熱門的數據:如果一個數據被訪問的非常頻繁,那么可能會導致緩存系統無法處理這些請求,從而造成緩存穿透。
  3. 查詢一些異常數據:這種情況通常發生在數據服務出現故障或異常時,從而造成緩存系統無法訪問相關數據,從而導致緩存穿透。

如何解決

我們可以使用Guava在內存中維護一個布隆過濾器。具體步驟如下:

  1. 添加Guava和Redis依賴:
<dependency>
    <groupId>com.google.guava<span class="hljs-name"groupId>
    <artifactId>guava<span class="hljs-name"artifactId>
    <version>29.0-jre<span class="hljs-name"version>
<span class="hljs-name"dependency>

<dependency>
    <groupId>org.springframework.boot<span class="hljs-name"groupId>
    <artifactId>spring-boot-starter-data-redis<span class="hljs-name"artifactId>
<span class="hljs-name"dependency>
  1. 創建一個BloomFilterUtil類,用于在緩存中維護Bloom Filter。
public class BloomFilterUtil {
    // 布隆過濾器的預計容量
    private static final int expectedInsertions = 1000000;
    // 布隆過濾器誤判率
    private static final double fpp = 0.001;
    private static BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()), expectedInsertions, fpp);
    /**
     * 向Bloom Filter中添加元素
     */
    public static void add(String key){
        bloomFilter.put(key);
    }
    /**
     * 判斷元素是否存在于Bloom Filter中
     */
    public static boolean mightContain(String key){
        return bloomFilter.mightContain(key);
    }
}
  1. 在Controller中查詢數據時,先根據請求參數進行Bloom Filter的過濾
@Autowired
private RedisTemplate

緩存擊穿

什么是緩存擊穿

緩存擊穿指的是在一些高并發訪問下,一個熱點數據從緩存中不存在,每次請求都要直接查詢數據庫,從而導致數據庫壓力過大,并且系統性能下降的現象。

緩存擊穿的原因通常有以下幾種:

  1. 緩存中不存在所需的熱點數據:當系統中某個熱點數據需要被頻繁訪問時,如果這個熱點數據最開始沒有被緩存,那么就會導致系統每次請求都需要直接查詢數據庫,造成數據庫負擔。
  2. 緩存的熱點數據過期:當一個熱點數據過期并需要重新緩存時,如果此時有大量請求,那么就會導致所有請求都要直接查詢數據庫。

如何解決

主要思路 : 在遇到緩存擊穿問題時,我們可以在查詢數據庫之前,先判斷一下緩存中是否已有數據,如果沒有數據則使用Redis的單線程特性,先查詢數據庫然后將數據寫入緩存中。

  1. 添加Redis依賴
<dependency>
    <groupId>org.springframework.boot<span class="hljs-name"groupId>
    <artifactId>spring-boot-starter-data-redis<span class="hljs-name"artifactId>
<span class="hljs-name"dependency>
  1. 在Controller中查詢數據時,先從緩存中查詢數據,如果緩存中無數據則進行鎖操作
@Autowired
private RedisTemplate<String, Object> redisTemplate;

@GetMapping("/user/{id}")
public User getUserById(@PathVariable Long id){
    // 先從緩存中獲取值
    String userKey = "user_"+id.toString();
    User user = (User) redisTemplate.opsForValue().get(userKey);
    if(user == null){
        // 查詢數據庫之前加鎖
        String lockKey = "lock_user_"+id.toString();
        String lockValue = UUID.randomUUID().toString();
        try{
            Boolean lockResult = redisTemplate.opsForValue().setIfAbsent(lockKey, lockValue, 60, TimeUnit.SECONDS);
            if(lockResult != null && lockResult){
                // 查詢數據庫
                user = userRepository.findById(id).orElse(null);
                if(user != null){
                    // 將查詢到的數據加入緩存
                    redisTemplate.opsForValue().set(userKey, user, 300, TimeUnit.SECONDS);
                }
            }
        }finally{
            // 釋放鎖
            if(lockValue.equals(redisTemplate.opsForValue().get(lockKey))){
                redisTemplate.delete(lockKey);
            }
        }
    }
    return user;
}

緩存雪崩

什么是緩存雪崩

指緩存中大量數據的失效時間集中在某一個時間段,導致在這個時間段內緩存失效并額外請求數據庫查詢數據的請求大量增加,從而對數據庫造成極大的壓力和負荷。

常見的Redis緩存雪崩場景包括:

  1. 緩存服務器宕機:當緩存服務器宕機或重啟時,大量的訪問請求將直接命中數據庫,并在同一時間段內導致大量的數據庫查詢請求,從而將數據庫壓力大幅提高。
  2. 緩存數據同時失效:在某個特定時間點,緩存中大量數據的失效時間集中在一起,這些數據會在同一時間段失效,并且這些數據被高頻訪問,將導致大量的訪問請求去查詢數據庫。
  3. 緩存中數據過期時間設計不合理:當緩存中的數據有效時間過短,且數據集中在同一時期失效時,就容易導致大量的請求直接查詢數據庫,加劇數據庫壓力。
  4. 波動式的訪問過程:當數據的訪問存在波動式特征時,例如輸出某些活動物品或促銷商品時,將會帶來高頻的查詢請求訪問,導致緩存大量失效并產生緩存雪崩。

如何解決

在遇到緩存雪崩時,我們可以使用兩種方法:一種是將緩存過期時間分散開,即為不同的數據設置不同的過期時間;另一種是使用Redis的多級緩存架構,通過增加一層代理層來解決。具體步驟如下:

  1. 添加相關依賴
<dependency>
    <groupId>org.springframework.boot<span class="hljs-name"groupId>
    <artifactId>spring-boot-starter-data-redis<span class="hljs-name"artifactId>
<span class="hljs-name"dependency>
<dependency>
    <groupId>net.sf.ehcache<span class="hljs-name"groupId>
    <artifactId>ehcache<span class="hljs-name"artifactId>
    <version>2.10.6<span class="hljs-name"version>
<span class="hljs-name"dependency>
  1. 在application.properties中配置Ehcache緩存
spring.cache.type=ehcache
  1. 創建一個CacheConfig類,用于配置Ehcache:
@Configuration
@EnableCaching
public class CacheConfig {
    @Bean
    public EhCacheCacheManager ehCacheCacheManager(CacheManager cm){
        return new EhCacheCacheManager(cm);
    }
    @Bean
    public CacheManager ehCacheManager(){
        EhCacheManagerFactoryBean cmfb = new EhCacheManagerFactoryBean();
        cmfb.setConfigLocation(new ClassPathResource("ehcache.xml"));
        cmfb.setShared(true);
        return cmfb.getObject();
    }
}
  1. 在ehcache.xml中添加緩存配置
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
    updateCheck="true"
    monitoring="autodetect"
    dynamicConfig="true">

    <cache name="userCache" maxEntriesLocalHeap="10000" timeToLiveSeconds="60" timeToIdleSeconds="30"/>

<span class="hljs-name"ehcache>
  1. 在Controller中查詢數據時,先從Ehcache緩存中獲取,如果緩存中無數據則再從Redis緩存中獲取數據
@Autowired
private RedisTemplate

以上就是使用SpringBoot時如何解決Redis的緩存穿透、緩存擊穿、緩存雪崩的常用方法。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • spring
    +關注

    關注

    0

    文章

    340

    瀏覽量

    14356
  • Boot
    +關注

    關注

    0

    文章

    150

    瀏覽量

    35851
  • Redis
    +關注

    關注

    0

    文章

    376

    瀏覽量

    10888
  • SpringBoot
    +關注

    關注

    0

    文章

    173

    瀏覽量

    184
收藏 人收藏

    評論

    相關推薦

    使用Redis緩存model層

    〈譯〉使用REDIS處理RAILS MODEL緩存
    發表于 04-18 17:07

    redis緩存注解怎么使用

    spring boot —— redis 緩存注解使用教程
    發表于 09-11 14:43

    Spring bootRedis的使用

    【本人禿頂程序員】springboot專輯:Spring bootRedis的使用
    發表于 03-27 11:42

    Redis在高速緩存系統的序列化算法研究

    Redis是一個key?value存儲系統,通過對Redis高速緩存系統的序列化算法優化,可提高緩存讀取的效率和存儲容量。引入現代統計學B
    發表于 11-23 16:07 ?0次下載

    Java 使用Redis緩存工具的詳細解說

    本文是關于Java 使用Redis緩存工具的詳細解說。詳細步驟請看下文
    的頭像 發表于 02-09 14:10 ?7899次閱讀
    Java 使用<b class='flag-5'>Redis</b><b class='flag-5'>緩存</b>工具的詳細解說

    Redis常見面試題及答案

    本文的面試題如下: Redis 持久化機制 緩存雪崩、緩存穿透緩存預熱、緩存更新、
    的頭像 發表于 12-16 11:44 ?2217次閱讀
    <b class='flag-5'>Redis</b>常見面試題及答案

    緩存雪崩/穿透/擊穿的解決方案

    緩存是我們項目應用肯定會使用,是我們數據庫的守護神,能夠保證數據庫的穩定,能夠提高整個系統的性能。一般我們采用市面上的redis、memcahce方案;redis已經非常強大了,每秒支持幾萬的連接時不成問題。
    發表于 01-26 09:44 ?1321次閱讀
    <b class='flag-5'>緩存</b>雪崩/<b class='flag-5'>穿透</b>/擊穿的解決方案

    Redis緩存的異常原因及其處理辦法分析

    Redis 是當前最流行的 NoSQL 數據庫。Redis 主要用來做緩存使用,在提高數據查詢效率、保護數據庫等方面起到了關鍵性的作用,很大程度上提高系統的性能。
    的頭像 發表于 02-06 15:02 ?760次閱讀

    SpringBoot+Redis實現點贊功能的緩存和定時持久化(附源碼)

    用戶對瀏覽內容進行【點贊/取贊】,并發送【點贊/取贊】請求到后端,這些信息先存入Redis緩存,再每隔兩小時將Redis的內容直接寫入數
    的頭像 發表于 02-09 16:38 ?4603次閱讀

    基于SpringBoot+Redis的轉盤抽獎

    基于SpringBoot+Redis技術實現轉盤抽獎活動項目,含前端、后臺及數據庫文件
    的頭像 發表于 02-28 14:24 ?1553次閱讀
    基于<b class='flag-5'>SpringBoot+Redis</b>的轉盤抽獎

    緩存穿透了如何解決

    首先來了解幾個概念: 緩存穿透:大量請求根本不存在的key 緩存雪崩:redis中大量key集體過期 緩存擊穿:
    的頭像 發表于 05-23 09:54 ?700次閱讀
    <b class='flag-5'>緩存</b>被<b class='flag-5'>穿透</b>了如何解決

    如何用Springboot整合Redis

    本篇文件我們來介紹如何用Springboot整合Redis。 1、Docker 安裝 Redis 1.1 下載鏡像 docker pull redis: 6 . 2 . 6 1.2 創
    的頭像 發表于 10-08 14:56 ?593次閱讀
    如何用<b class='flag-5'>Springboot</b>整合<b class='flag-5'>Redis</b>

    SpringBoot AOP + Redis 延時雙刪功能實戰

    注意:要知道經常修改的數據表不適合使用Redis,因為雙刪策略執行的結果是把Redis中保存的那條數據刪除了,以后的查詢就都會去查詢數據庫。所以Redis使用的是讀遠遠大于改的數據緩存
    的頭像 發表于 10-13 16:08 ?652次閱讀
    <b class='flag-5'>SpringBoot</b> AOP + <b class='flag-5'>Redis</b> 延時雙刪功能實戰

    Oracle與Redis Enterprise協同,作為企業緩存解決方案

    單獨使用Oracle作為企業緩存數據庫時,會出現哪些問題呢?使用Redis Enterprise與Oracle共同用作企業級緩存或副本數據庫,會出現哪些喜人的提升呢?Orcle配合使用Redi
    的頭像 發表于 11-22 10:00 ?487次閱讀
    Oracle與<b class='flag-5'>Redis</b> Enterprise協同,作為企業<b class='flag-5'>緩存</b>解決方案

    Redis緩存預熱+緩存雪崩+緩存擊穿+緩存穿透要點簡析

    緩存預熱就是系統上線后,提前將相關的緩存數據直接加載到緩存系統。
    的頭像 發表于 12-25 09:41 ?915次閱讀
    <b class='flag-5'>Redis</b><b class='flag-5'>緩存</b>預熱+<b class='flag-5'>緩存</b>雪崩+<b class='flag-5'>緩存</b>擊穿+<b class='flag-5'>緩存</b><b class='flag-5'>穿透</b>要點簡析
    主站蜘蛛池模板: 国产精品久久久久婷婷五月色| 亚洲国产日韩欧美视频二区| 成人18视频在线观看| 亚洲AV怡红院AV男人的天堂| 免费在线视频a| 黄色三级三级三级免费看| 啊灬啊灬啊灬快灬深高潮啦| 亚洲综合中文| 无限资源在线观看高清| 欧美性猛交AAA片免费观看| 久久精品亚洲视频| 国产亚洲精品久久久久久国| 大胸女晃奶动态图| 97在线视频免费| 伊人久久国产精品| 亚洲黄网站wwwwww| 婷婷综合亚洲爱久久| 日本理伦片午夜理伦片| 嗯啊不要老师| 狼人射综合| 久久免费看少妇高潮A片JA| 海量激情文学| 国产亚洲精品久久综合阿香蕉| 国产99久久九九免费精品无码| jizzzz亚洲丰满xxxx| 91久久精一区二区三区大全| 亚洲综合色婷婷在线影院| 亚洲激情一区| 亚洲成人免费观看| 小女生RAPPER入口| 我不卡影院手机在线观看| 日韩亚洲欧美中文高清| 人妻中文字幕无码系列| 欧美性猛交XXXX乱大交极品| 欧美黑大炮18p| 青青草原社区| 全免费A敌肛交毛片免费懂色AV | 99免费在线| 99免费在线观看| lesbabes性欧美| 嘟嘟嘟影院免费观看视频|