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

Redis之緩存穿透問題解決方案實(shí)踐SpringBoot3+Docker

這篇具有很好參考價值的文章主要介紹了Redis之緩存穿透問題解決方案實(shí)踐SpringBoot3+Docker。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、介紹

當(dāng)一種請求,總是能越過緩存,調(diào)用數(shù)據(jù)庫,就是緩存穿透。
Redis之緩存穿透問題解決方案實(shí)踐SpringBoot3+Docker,Server架構(gòu),# Redis,緩存,redis,docker
比如當(dāng)請求一個數(shù)據(jù)庫沒有的數(shù)據(jù),那么緩存也不會有,然后就一直請求,甚至高并發(fā)去請求,對數(shù)據(jù)庫壓力會增大。

二、方案介紹

  1. 如果key具有某種規(guī)則,那么可以對key增加校驗(yàn)機(jī)制,不符合直接返回。
  2. Redisson布隆過濾器
  3. 邏輯修改,當(dāng)數(shù)據(jù)庫沒有此數(shù)據(jù),以nullvalue,也插入redis緩存,但設(shè)置較短的過期時間。

三、Redis Docker部署

docker-compose示例如下,redis.conf從這里下載

redis:
    container_name: redis
    image: redis:7.2
    volumes:
      - ./redis/redis.conf:/usr/local/etc/redis/redis.conf
    ports:
      - "6379:6379"
    command: [ "redis-server", "/usr/local/etc/redis/redis.conf" ]

四、SpringBoot3 Base代碼

1. 依賴配置

		<!-- redis -->
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!-- redis 連接線程池 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.11.1</version>
        </dependency>
        <!-- redisson -->
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.24.3</version>
        </dependency>
spring: 
  data:
    redis:
      host: 192.168.101.65  # Redis服務(wù)器的主機(jī)名或IP地址
      port: 6379  # Redis服務(wù)器的端口號
      password:  # 用于連接Redis服務(wù)器的密碼
      database: 0  # 要連接的Redis數(shù)據(jù)庫的索引號
      lettuce:
        pool:
          max-active: 20  # 連接池中最大的活躍連接數(shù)
          max-idle: 10  # 連接池中最大的空閑連接數(shù)
          min-idle: 0  # 連接池中最小的空閑連接數(shù)
      timeout: 10000  # 連接超時時間(毫秒)
      lock-watchdog-timeout: 100  # Redisson的分布式鎖的看門狗超時時間(毫秒)

2. 基本代碼

要演示的代碼很簡單,就是一個攜帶courseId請求過來,調(diào)用下面的service函數(shù),然后查詢數(shù)據(jù)庫。

@Override
    public CoursePublish getCoursePublish(Long courseId) {
        return coursePublishMapper.selectById(courseId);
    }

當(dāng)我們使用redis改造時,基本代碼如下

@Override
    public CoursePublish getCoursePublishCache(Long courseId) {
        String key = "content:course:publish:" + courseId;
        //先查詢redis
        Object object = redisTemplate.opsForValue().get(key);
        if (object != null){
            String string = object.toString();
            CoursePublish coursePublish = JSON.parseObject(string, CoursePublish.class);
            return coursePublish;
        }else {
            //后查詢數(shù)據(jù)庫
            CoursePublish coursePublish = getCoursePublish(courseId);
            if (coursePublish != null){
                redisTemplate.opsForValue().set(key, JSON.toJSONString(coursePublish));
            }
            return coursePublish;
        }
    }

五、緩存優(yōu)化代碼

1. 校驗(yàn)機(jī)制

我這里的id沒規(guī)則,所以加不了,跳過。

2. 布隆過濾器

讀取yaml配置

@Data
@Component
@ConfigurationProperties(prefix = "spring.data.redis")
public class RedisProperties {
    private String host;
    private int port;
    private String password;
    private int database;
    private int lockWatchdogTimeout;
}

配置RedissonClient

@Slf4j
@Configuration
public class RedissionConfig {

    @Autowired
    private RedisProperties redisProperties;

    @Bean
    public RedissonClient redissonClient() {
        RedissonClient redissonClient;

        Config config = new Config();
        //starter依賴進(jìn)來的redisson要以redis://開頭,其他不用
        String url = "redis://"+ redisProperties.getHost() + ":" + redisProperties.getPort();
        config.useSingleServer().setAddress(url)
                //.setPassword(redisProperties.getPassword())
                .setDatabase(redisProperties.getDatabase());

        try {
            redissonClient = Redisson.create(config);
            return redissonClient;
        } catch (Exception e) {
            log.error("RedissonClient init redis url:[{}], Exception:", url, e);
            return null;
        }
    }
}

把布隆過濾器加到service,如下

	private RBloomFilter<String> bloomFilter;

    @PostConstruct
    public void init(){
        //初始化布隆過濾器
        bloomFilter = redissonClient.getBloomFilter("bloom-filter");
        bloomFilter.tryInit(100, 0.003);
        List<CoursePublish> coursePublishList = coursePublishMapper.selectList(new LambdaQueryWrapper<CoursePublish>());
        coursePublishList.forEach(coursePublish -> {
            String key = "content:course:publish:" + coursePublish.getId();
            bloomFilter.add(key);
        });
    }
    
	@Override
    public CoursePublish getCoursePublishCache(Long courseId) {
        String key = "content:course:publish:" + courseId;
        //布隆過濾器
        boolean contains = bloomFilter.contains(key);
        if (!contains){
            return null;
        }
        //先查詢redis
        Object object = redisTemplate.opsForValue().get(key);
        if (object != null){
            String string = object.toString();
            CoursePublish coursePublish = JSON.parseObject(string, CoursePublish.class);
            return coursePublish;
        }else {
            //后查詢數(shù)據(jù)庫
            CoursePublish coursePublish = getCoursePublish(courseId);
            if (coursePublish != null){
            	bloomFilter.add(key);
                redisTemplate.opsForValue().set(key, JSON.toJSONString(coursePublish));
            }
            return coursePublish;
        }
    }

3. 邏輯優(yōu)化

當(dāng)數(shù)據(jù)庫沒有此數(shù)據(jù),以nullvalue,也插入redis緩存,但設(shè)置較短的過期時間。

            //后查詢數(shù)據(jù)庫
            CoursePublish coursePublish = getCoursePublish(courseId);
            if (coursePublish != null) {
            	bloomFilter.add(key);
                redisTemplate.opsForValue().set(key, JSON.toJSONString(coursePublish));
            }else {
                redisTemplate.opsForValue().set(key, JSON.toJSONString(coursePublish), 10, TimeUnit.SECONDS);
            }
            return coursePublish;

Redis之緩存穿透問題解決方案實(shí)踐SpringBoot3+Docker,Server架構(gòu),# Redis,緩存,redis,docker文章來源地址http://www.zghlxwxcb.cn/news/detail-834269.html

到了這里,關(guān)于Redis之緩存穿透問題解決方案實(shí)踐SpringBoot3+Docker的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • Redis:緩存擊穿、緩存穿透與緩存雪崩的區(qū)別、解決方案

    Redis:緩存擊穿、緩存穿透與緩存雪崩的區(qū)別、解決方案

    ? ? ? ? 近期學(xué)習(xí)redis相關(guān)原理,記錄一下開發(fā)過程中Redis的一些常見問題及應(yīng)對方法。 一句話總結(jié):先查 redis發(fā)現(xiàn)沒數(shù)據(jù) ,再去 數(shù)據(jù)庫查發(fā)現(xiàn)還是沒數(shù)據(jù) 。 這種情況下 緩存永遠(yuǎn)不會生效 ,數(shù)據(jù)庫將承擔(dān)巨大壓力。 ? ? ? ? 我們知道,redis的緩存作用,是在客戶端發(fā)起查

    2024年02月06日
    瀏覽(29)
  • redis中緩存雪崩,緩存穿透,緩存擊穿的原因以及解決方案

    redis中緩存雪崩,緩存穿透,緩存擊穿的原因以及解決方案

    在redis中,新,舊數(shù)據(jù)交替時候,舊數(shù)據(jù)進(jìn)行了刪除,新數(shù)據(jù)沒有更新過來,造成在高并發(fā)環(huán)境下,大量請求查詢redis沒有數(shù)據(jù),直接查詢mysql,造成mysql的壓力驟增,給mysql造成極大的壓力,造成一連串的后續(xù)異常反應(yīng)。 1.大多數(shù)系統(tǒng)設(shè)計(jì)者 考慮用加鎖 (最多的解決方案)或

    2024年02月15日
    瀏覽(36)
  • redis實(shí)戰(zhàn)-緩存三劍客穿透擊穿雪崩解決方案

    redis實(shí)戰(zhàn)-緩存三劍客穿透擊穿雪崩解決方案

    緩存穿透 :緩存穿透是指客戶端請求的 數(shù)據(jù)在緩存中和數(shù)據(jù)庫中都不存在 ,這樣緩存永遠(yuǎn)不會生效,這些請求都會打到數(shù)據(jù)庫, 造成數(shù)據(jù)庫壓力 ,也讓緩存沒有發(fā)揮出應(yīng)有的作用 緩存空對象 當(dāng)我們客戶端訪問不存在的數(shù)據(jù)時,先請求redis,但是此時redis中沒有數(shù)據(jù),此時

    2024年02月11日
    瀏覽(29)
  • Redis中的緩存穿透、雪崩、擊穿的原因以及解決方案

    Redis中的緩存穿透、雪崩、擊穿的原因以及解決方案

    是指用戶查詢數(shù)據(jù),在數(shù)據(jù)庫沒有,自然在緩存中也不會有。這樣就導(dǎo)致用戶查詢的時候,在緩存中找不到,每次都要去數(shù)據(jù)庫再查詢一遍,然后返回空(相當(dāng)于進(jìn)行了兩次無用的查詢)。這樣請求就繞過緩存直接查數(shù)據(jù)庫,這也是經(jīng)常提的緩存命中率問題。 我們可以簡單的

    2024年02月12日
    瀏覽(21)
  • Redis緩存雪崩、穿透、擊穿原因分析和解決方案,附Redis管道使用技巧

    Redis緩存雪崩、穿透、擊穿原因分析和解決方案,附Redis管道使用技巧

    先給大家附上其他幾篇文章,感興趣的自行開車導(dǎo)航 Redis過期策略和持久化機(jī)制全面揭秘,教你如何合理配置 【深入淺出Redis 一】從版本特性到數(shù)據(jù)類型到線程模型,帶你了解Redis的核心特性和應(yīng)用場景! 一次redis OOM問題分析解決,rdbtools安裝分析redis內(nèi)存 Redis管道(pipelin

    2024年02月16日
    瀏覽(23)
  • 【Redis從入門到進(jìn)階】第 6 講:緩存雪崩、擊穿、穿透場景與解決方案

    【Redis從入門到進(jìn)階】第 6 講:緩存雪崩、擊穿、穿透場景與解決方案

    本文已收錄于專欄 ??《Redis從入門到進(jìn)階》?? ?? 本專欄開啟,目的在于幫助大家更好的掌握學(xué)習(xí) Redis ,同時也是為了記錄我自己學(xué)習(xí) Redis 的過程,將會從基礎(chǔ)的數(shù)據(jù)類型開始記錄,直到一些更多的應(yīng)用,如緩存擊穿還有分布式鎖以及 Redis 持久化等。希望大家有問題也可

    2023年04月12日
    瀏覽(233)
  • 緩存穿透、緩存雪崩、緩存擊穿解決方案

    緩存穿透、緩存雪崩、緩存擊穿解決方案

    緩存就是數(shù)據(jù)交換的緩沖區(qū)(稱作Cache),是存貯數(shù)據(jù)的臨時地方,一般讀寫性能較高。 需求:添加ShopTypeController中的queryTypeList方法,添加查詢緩存 業(yè)務(wù)場景: 低一致性需求:使用內(nèi)存淘汰機(jī)制。例如店鋪類型的查詢緩存 高一致性需求:主動更新,并以超時剔除作為兜底方

    2023年04月09日
    瀏覽(29)
  • Java緩存穿透、擊穿、雪崩解決方案

    在互聯(lián)網(wǎng)高并發(fā)的場景下,對于數(shù)據(jù)庫查詢頻率高的數(shù)據(jù),為了提高查詢效率,常常會采用緩存技術(shù)進(jìn)行優(yōu)化。然而,緩存技術(shù)也會帶來一些問題,比如緩存穿透、緩存擊穿和緩存雪崩等。 當(dāng)我們從緩存中查詢一個不存在的數(shù)據(jù)時,請求就會穿透緩存直接查詢數(shù)據(jù)庫,這樣就

    2023年04月19日
    瀏覽(153)
  • 緩存擊穿、穿透、雪崩及常用解決方案

    緩存擊穿、穿透、雪崩及常用解決方案

    Redis是一種高性能的鍵值型數(shù)據(jù)庫,它可以用來實(shí)現(xiàn)緩存功能,提高應(yīng)用的響應(yīng)速度和承載能力。但是,使用Redis緩存也會遇到一些常見的問題,比如緩存擊穿、緩存穿透、緩存雪崩。這些問題都會影響緩存的效率和穩(wěn)定性,所以需要了解它們的原因和解決方案,保障Redis能夠

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

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

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

    2024年04月13日
    瀏覽(29)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包