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

【系統(tǒng)開(kāi)發(fā)】尚硅谷 - 谷粒商城項(xiàng)目筆記(五):分布式緩存

這篇具有很好參考價(jià)值的文章主要介紹了【系統(tǒng)開(kāi)發(fā)】尚硅谷 - 谷粒商城項(xiàng)目筆記(五):分布式緩存。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。


分布式緩存

緩存使用場(chǎng)景

【系統(tǒng)開(kāi)發(fā)】尚硅谷 - 谷粒商城項(xiàng)目筆記(五):分布式緩存

【系統(tǒng)開(kāi)發(fā)】尚硅谷 - 谷粒商城項(xiàng)目筆記(五):分布式緩存

【系統(tǒng)開(kāi)發(fā)】尚硅谷 - 谷粒商城項(xiàng)目筆記(五):分布式緩存

redis作緩存中間件

引入redis依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

配置redis

# ip地址
spring.redis.host=124.222.43.217
# 端口
spring.redis.port=6379

堆外內(nèi)存溢出

【系統(tǒng)開(kāi)發(fā)】尚硅谷 - 谷粒商城項(xiàng)目筆記(五):分布式緩存

<!--引入redis,排除lettuce,使用jedis-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <exclusions>
        <exclusion>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

緩存失效問(wèn)題

緩存穿透

【系統(tǒng)開(kāi)發(fā)】尚硅谷 - 谷粒商城項(xiàng)目筆記(五):分布式緩存

緩存雪崩

【系統(tǒng)開(kāi)發(fā)】尚硅谷 - 谷粒商城項(xiàng)目筆記(五):分布式緩存

緩存擊穿

【系統(tǒng)開(kāi)發(fā)】尚硅谷 - 谷粒商城項(xiàng)目筆記(五):分布式緩存

Redisson分布式鎖

導(dǎo)入依賴

<!-- 以后使用redisson作為所有分布式鎖,分布式對(duì)象等功能框架 -->
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.12.0</version>
</dependency>

redisson配置類

@Configuration
public class MyRedissonConfig {
    @Bean(destroyMethod="shutdown")
    RedissonClient redissonClient() throws IOException {
        Config config = new Config();
        // 這里必須以redis://開(kāi)頭,否則會(huì)報(bào)錯(cuò)
        config.useSingleServer().setAddress("redis://124.222.43.217:6379");
        return Redisson.create(config);
    }
}

可重入鎖

可重入鎖解釋:無(wú)論是公平方式還是非公平方式,進(jìn)門(mén)坐下來(lái)之后,你可以問(wèn)醫(yī)生問(wèn)題一次,兩次,無(wú)數(shù)次( 重入),只要你還坐著,你都可以問(wèn),但是一旦起身離開(kāi)座位,你的位置就會(huì)被搶,除非沒(méi)人排隊(duì),不然你失去了提問(wèn)的資格。

@ResponseBody
@GetMapping("/hello")
public String hello() {
    //1 獲取一把鎖,只要鎖的名字一樣,就是同一把鎖
    RLock lock = redisson.getLock("my-lock");
    // 2 加鎖
    lock.lock(); // 阻塞式等待,默認(rèn)加的鎖都是30s
    // 鎖的自動(dòng)續(xù)期,如果業(yè)務(wù)超長(zhǎng),運(yùn)行期間自動(dòng)給鎖續(xù)上新的30s。不用擔(dān)心業(yè)務(wù)時(shí)間長(zhǎng),鎖自動(dòng)過(guò)期被刪除
    // 加鎖的業(yè)務(wù)只要運(yùn)行完成,就不會(huì)給當(dāng)前鎖續(xù)期,即使不手動(dòng)解鎖,鎖默認(rèn)在30s以后自動(dòng)刪除
    lock.lock(10, TimeUnit.SECONDS); //10s自動(dòng)解鎖,自動(dòng)解鎖時(shí)間一定要大于業(yè)務(wù)的執(zhí)行時(shí)間
    // lock.lock(10, TimeUnit.SECONDS); // 鎖時(shí)間到了之后,不會(huì)自動(dòng)續(xù)期
    try {
        System.out.println("加鎖成功,執(zhí)行業(yè)務(wù)" + Thread.currentThread().getId());
        // 模擬長(zhǎng)業(yè)務(wù)5s
        Thread.sleep(5000);
    } catch (Exception e) {

    }finally {
        // 3 解鎖
        System.out.println("釋放鎖" + Thread.currentThread().getId());
        lock.unlock();
    }
    return "hello";
}

讀寫(xiě)鎖

讀鎖(共享鎖)會(huì)等待寫(xiě)鎖(互斥鎖,排他鎖)釋放,保證一定能讀到最新數(shù)據(jù)

寫(xiě)鎖也會(huì)等待讀鎖釋放,保證寫(xiě)數(shù)據(jù)時(shí)不能讀取數(shù)據(jù)

總結(jié):讀寫(xiě)互斥,不管是先讀后寫(xiě),還是先寫(xiě)后讀,都會(huì)進(jìn)行阻塞等待

    @GetMapping("/write")
    @ResponseBody
    public String writeValue() {
        RReadWriteLock lock = redisson.getReadWriteLock("rw-lock");
        String s = "";
        // 改數(shù)據(jù),加寫(xiě)鎖
        RLock rLock = lock.writeLock();
        try {
            rLock.lock();
            System.out.println("nihao");
            s = UUID.randomUUID().toString();
            Thread.sleep(30000);
            redisTemplate.opsForValue().set("writeValue", s);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            rLock.unlock();
        }
        return s;
    }

    @GetMapping("/read")
    @ResponseBody
    public String readValue() {
        RReadWriteLock lock = redisson.getReadWriteLock("rw-lock");
        String s = "";
        // 讀數(shù)據(jù),加讀鎖
        RLock rLock = lock.readLock();
        try {
            rLock.lock();
            s = redisTemplate.opsForValue().get("writeValue");
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            rLock.unlock();
        }
        return s;
    }

緩存一致性解決

雙寫(xiě)模式:寫(xiě)操作后,同時(shí)修改緩存

失效模式:寫(xiě)操作后,刪除緩存

【系統(tǒng)開(kāi)發(fā)】尚硅谷 - 谷粒商城項(xiàng)目筆記(五):分布式緩存

【系統(tǒng)開(kāi)發(fā)】尚硅谷 - 谷粒商城項(xiàng)目筆記(五):分布式緩存

【系統(tǒng)開(kāi)發(fā)】尚硅谷 - 谷粒商城項(xiàng)目筆記(五):分布式緩存

緩存-SpringCache

簡(jiǎn)介

【系統(tǒng)開(kāi)發(fā)】尚硅谷 - 谷粒商城項(xiàng)目筆記(五):分布式緩存

【系統(tǒng)開(kāi)發(fā)】尚硅谷 - 谷粒商城項(xiàng)目筆記(五):分布式緩存

【系統(tǒng)開(kāi)發(fā)】尚硅谷 - 谷粒商城項(xiàng)目筆記(五):分布式緩存

@Cacheable

引入依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

properties配置

# 使用redis作為緩存
spring.cache.type=redis
# 設(shè)置有效時(shí)間,毫秒為單位,3600*1000
spring.cache.redis.time-to-live=3600000
# 是否使用緩存前綴
spring.cache.redis.use-key-prefix=true
# 指定緩存前綴,如果不指定,則默認(rèn)使用注解中value指向的值(分組名),如果value沒(méi)有指向任何值,則無(wú)緩存前綴
# spring.cache.redis.key-prefix=WSKH_CACHE_
# 是否緩存空值,防止緩存穿透
spring.cache.redis.cache-null-values=true
spring.session.store-type=redis

啟動(dòng)類上加注解,開(kāi)啟緩存

@EnableCaching

在要開(kāi)啟緩存的方法上加上@Cacheable注解,示例如下所示:

// 每一個(gè)需要緩存的數(shù)據(jù)我們都要指定放到哪個(gè)名字的緩存?!揪彺娴姆謪^(qū)】
// 當(dāng)前方法的結(jié)果需要緩存,如果緩存中有,方法不調(diào)用,如果緩存中沒(méi)有,會(huì)調(diào)用方法,最后將方法的結(jié)果放入緩存
// value = {"category"} 表示:屬于哪個(gè)緩存分區(qū)(分組),當(dāng)沒(méi)有指定緩存前綴的時(shí)候,就會(huì)使用這個(gè)分組名作為前綴
// key = "#root.method.name" 表示:將方法名作為存入redis中的鍵
// sync = true 表示:是否為同步代碼塊
@Cacheable(value = {"category"},key = "#root.method.name",sync = true)  
@Override
public List<CategoryEntity> getLevel1Categorys() {
    long l = System.currentTimeMillis();
    List<CategoryEntity> categoryEntities = baseMapper.selectList(new QueryWrapper<CategoryEntity>().eq("parent_cid", 0));
    System.out.println("消耗時(shí)間," + (System.currentTimeMillis() - 1));
    return categoryEntities;
}

自定義緩存配置

默認(rèn)緩存數(shù)據(jù)是保存JDK序列化后的數(shù)據(jù),一般業(yè)務(wù)上需要使用JSON格式進(jìn)行緩存的存儲(chǔ)(JSON具有跨語(yǔ)言,跨平臺(tái)的高兼容性)

@EnableConfigurationProperties(CacheProperties.class)
@Configuration
@EnableCaching
public class MyCacheConfig {
    @Bean
    RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties) {
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
        config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
        config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
        CacheProperties.Redis redisProperties = cacheProperties.getRedis();
        if (redisProperties.getTimeToLive() != null) {
            config = config.entryTtl(redisProperties.getTimeToLive());
        }
        if (redisProperties.getKeyPrefix() != null) {
            config = config.prefixKeysWith(redisProperties.getKeyPrefix());
        }
        if (!redisProperties.isCacheNullValues()) {
            config = config.disableCachingNullValues();
        }
        if (!redisProperties.isUseKeyPrefix()) {
            config = config.disableKeyPrefix();
        }
        return config;
    }
}

@CacheEvict

  • value = “category”:指定分組名,即緩存默認(rèn)前綴
  • allEntries = true:指定刪除value指向的分組下的所有緩存數(shù)據(jù)
  • key = " ‘myKey’ ":指定緩存的key值,如果是普通字符串,則需要在雙引號(hào)中加單引號(hào),將其包裹
@CacheEvict(value = "category",allEntries = true)  // 失效模式
@CachePut // 雙寫(xiě)模式
@Transactional
@Override
public void updateCasecade(CategoryEntity category) {
    this.updateById(category);
    categoryBrandRelationService.updateCategory(category.getCatId(), category.getName());
}

同時(shí)清除多個(gè)緩存

【系統(tǒng)開(kāi)發(fā)】尚硅谷 - 谷粒商城項(xiàng)目筆記(五):分布式緩存

@CachePut

雙寫(xiě)模式,修改完數(shù)據(jù)庫(kù)后,將返回的結(jié)果更新到緩存中,如果方法返回修飾符為void,那么就不能使用@CachePut注解

原理與不足

【系統(tǒng)開(kāi)發(fā)】尚硅谷 - 谷粒商城項(xiàng)目筆記(五):分布式緩存

【系統(tǒng)開(kāi)發(fā)】尚硅谷 - 谷粒商城項(xiàng)目筆記(五):分布式緩存文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-493397.html

到了這里,關(guān)于【系統(tǒng)開(kāi)發(fā)】尚硅谷 - 谷粒商城項(xiàng)目筆記(五):分布式緩存的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(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)文章

  • 谷粒商城篇章8 ---- P236-P247 ---- 購(gòu)物車【分布式高級(jí)篇五】

    谷粒商城篇章8 ---- P236-P247 ---- 購(gòu)物車【分布式高級(jí)篇五】

    目錄 1 環(huán)境搭建 1.1 新建購(gòu)物車服務(wù)模塊gulimall-cart 1.2 購(gòu)物車服務(wù)相關(guān)配置 1.2.1 pom.xml? 1.2.2 yml配置 1.2.2.1 application.yml配置 1.2.2.2 bootstrap.yml配置 1.2.3 主類 1.3 SwitchHosts增加配置 1.4 網(wǎng)關(guān)配置 1.5 整合SpringSession 1.5.1 session數(shù)據(jù)存儲(chǔ)在redis 1.5.2 開(kāi)啟SpringSession 1.6?購(gòu)物車頁(yè)面搭建 2 購(gòu)

    2024年02月01日
    瀏覽(54)
  • 1+X 云計(jì)算運(yùn)維與開(kāi)發(fā)(中級(jí))案例實(shí)戰(zhàn)——分布式部署集群應(yīng)用商城系統(tǒng)

    1+X 云計(jì)算運(yùn)維與開(kāi)發(fā)(中級(jí))案例實(shí)戰(zhàn)——分布式部署集群應(yīng)用商城系統(tǒng)

    學(xué)而不思則罔,思而不學(xué)則殆。 IP 主機(jī)名 節(jié)點(diǎn) 192.168.200.10 mycat Mycat 中間件服務(wù)節(jié)點(diǎn) 192.168.200.20 db1 MariaDB 數(shù)據(jù)庫(kù)集群主節(jié)點(diǎn) 192.168.200.30 db2 MariaDB 數(shù)據(jù)庫(kù)集群從節(jié)點(diǎn) 192.168.200.40 zookeeper1 集群節(jié)點(diǎn) 192.168.200.50 zookeeper2 集群節(jié)點(diǎn) 192.168.200.60 zookeeper3 集群節(jié)點(diǎn) 192.168.200.70 redis 消息隊(duì)

    2023年04月23日
    瀏覽(33)
  • 谷粒商城筆記+踩坑(1)——架構(gòu)、項(xiàng)目環(huán)境搭建、代碼生成器

    谷粒商城筆記+踩坑(1)——架構(gòu)、項(xiàng)目環(huán)境搭建、代碼生成器

    ?導(dǎo)航: 谷粒商城筆記+踩坑匯總篇_谷粒商城筆記踩坑6_vincewm的博客-CSDN博客 目錄 1、項(xiàng)目介紹 1.1 微服務(wù)架構(gòu)圖 1.2. 微服務(wù)劃分圖 2、項(xiàng)目環(huán)境搭建 2.1. 虛擬機(jī)搭建環(huán)境 2.2. Linux安裝docker、配置鏡像加速 2.3. docker配置mysql、設(shè)置自啟動(dòng) 2.3.1、安裝mysql5.7 2.3.2、修改mysql配置文件

    2024年02月01日
    瀏覽(129)
  • 學(xué)習(xí)筆記20230629 -- 《分享在jsp分布式項(xiàng)目支援開(kāi)發(fā)衍生功能時(shí)遇到和解決的問(wèn)題》

    學(xué)習(xí)筆記20230629 -- 《分享在jsp分布式項(xiàng)目支援開(kāi)發(fā)衍生功能時(shí)遇到和解決的問(wèn)題》

    1.jsp項(xiàng)目的頁(yè)面跳轉(zhuǎn),需要后端的java技術(shù)做支撐,在java的接口文件中寫(xiě)跳轉(zhuǎn)接口,使用ajax去請(qǐng)求這個(gè)跳轉(zhuǎn)接口,將返回的數(shù)據(jù)(html標(biāo)簽代碼),放到當(dāng)前頁(yè)面或彈窗的\\\"content\\\"屬性中 2.使用原生js寫(xiě)法實(shí)現(xiàn) 全選 功能和刪除功能的邏輯思想 將每條回顯數(shù)據(jù)的唯一id值作為每一條

    2024年02月11日
    瀏覽(61)
  • 【筆記】谷粒商城高級(jí)篇

    【筆記】谷粒商城高級(jí)篇

    全文檢索工具:快速儲(chǔ)存、搜索和分析海量數(shù)據(jù)。 Index (索引) → Mysql的庫(kù) 動(dòng)詞,相當(dāng)于MySQL中的insert; 名詞,相當(dāng)于MySQL中的Database。 Type (類型) → Mysql的表(過(guò)時(shí)) 在Index中,可以定義一個(gè)或多個(gè)類型。類似于MySQL中的Table;每一種類型的數(shù)據(jù)放在一起。 Document (文檔) →

    2023年04月21日
    瀏覽(28)
  • 谷粒商城學(xué)習(xí)筆記

    谷粒商城學(xué)習(xí)筆記

    1)、電商模式 2)、谷粒商城 谷粒商城是一個(gè) B2C 模式的電商平臺(tái),銷售自營(yíng)商品給客戶。 1、項(xiàng)目微服務(wù)架構(gòu)圖 2、微服務(wù)劃分圖 3、項(xiàng)目技術(shù)特色 4、項(xiàng)目前置要求 分布式是指將不同的業(yè)務(wù)分布在不同的地方。 集群指的是將幾臺(tái)服務(wù)器集中在一起,實(shí)現(xiàn)同一業(yè)務(wù)。 例如:

    2024年01月16日
    瀏覽(28)
  • 【筆記/后端】谷粒商城高級(jí)篇

    【筆記/后端】谷粒商城高級(jí)篇

    全文檢索工具:快速儲(chǔ)存、搜索和分析海量數(shù)據(jù)。 Index (索引) → Mysql的庫(kù) 動(dòng)詞,相當(dāng)于MySQL中的insert; 名詞,相當(dāng)于MySQL中的Database。 Type (類型) → Mysql的表(過(guò)時(shí)) 在Index中,可以定義一個(gè)或多個(gè)類型。類似于MySQL中的Table;每一種類型的數(shù)據(jù)放在一起。 Document (文檔) →

    2024年02月02日
    瀏覽(25)
  • 谷粒商城第一天-項(xiàng)目概述、架構(gòu)、Linux環(huán)境搭建

    谷粒商城第一天-項(xiàng)目概述、架構(gòu)、Linux環(huán)境搭建

    目錄 一、學(xué)習(xí)的內(nèi)容 一、常見(jiàn)的商城模式 二、谷粒商城項(xiàng)目的微服務(wù)架構(gòu) 三、谷粒商城項(xiàng)目的微服務(wù)劃分 四、谷粒商城項(xiàng)目的亮點(diǎn) 五、微服務(wù)的基本的概念 二、完成的進(jìn)度 三、學(xué)到的東西 四、總結(jié) 6月9日正式下決心開(kāi)始學(xué)習(xí)谷粒商城項(xiàng)目,之前早就聽(tīng)說(shuō)谷粒商城項(xiàng)目的

    2024年02月10日
    瀏覽(102)
  • 谷粒商城項(xiàng)目|es的應(yīng)用場(chǎng)景及常見(jiàn)問(wèn)題

    谷粒商城項(xiàng)目|es的應(yīng)用場(chǎng)景及常見(jiàn)問(wèn)題

    es是什么 es多被用于搜索聚合分析引擎 是分布式的可以高性能查詢的引擎 es應(yīng)用場(chǎng)景 為什么不用MYSQL而用es es將數(shù)據(jù)存在內(nèi)存中且可以分布式的存儲(chǔ)數(shù)據(jù) 商品上架 商品在es中的保存 1.在es中建立索引 spu sku spu sku保存在一起防止分布查詢 為了防止對(duì)象數(shù)組扁平化,商品屬性字段

    2024年01月17日
    瀏覽(26)
  • 谷粒商城筆記+踩坑(9)——上架商品spu到ES索引庫(kù)

    谷粒商城筆記+踩坑(9)——上架商品spu到ES索引庫(kù)

    導(dǎo)航: 谷粒商城筆記+踩坑匯總篇 目錄 1、ES回顧 2、ES整合商品上架? 2.1、分析 2.2、創(chuàng)建sku的es索引庫(kù) 2.2.1、兩種索引庫(kù)設(shè)計(jì)方案分析 2.2.2、最終選用的索引庫(kù)方案,nested類型 2.3、SkuEsModel模型類 2.4、【庫(kù)存模塊】庫(kù)存量查詢 2.5、【查詢模塊】保存ES文檔 2.5.1、常量類 2.5.2、

    2024年02月05日
    瀏覽(28)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包