中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

如何在網(wǎng)站插做視頻優(yōu)化大師使用方法

如何在網(wǎng)站插做視頻,優(yōu)化大師使用方法,西安代做網(wǎng)站,成都網(wǎng)站建設(shè)名錄SpringCache緩存專題 學(xué)習(xí)目標(biāo) 1、理解緩存存在的意義 2、掌握redis與SpringCache的集成方式 3、掌握SpringCache注解的使用 4、掌握項(xiàng)目集成SpringCache流程 第一章 基于SpringCache緩存方案 1.為什么需要緩存 ? 前臺(tái)請(qǐng)求,后臺(tái)先從緩存中取數(shù)據(jù)&#xff0…

SpringCache緩存專題

學(xué)習(xí)目標(biāo)

1、理解緩存存在的意義

2、掌握redis與SpringCache的集成方式

3、掌握SpringCache注解的使用

4、掌握項(xiàng)目集成SpringCache流程

第一章 基于SpringCache緩存方案

1.為什么需要緩存

? 前臺(tái)請(qǐng)求,后臺(tái)先從緩存中取數(shù)據(jù),取到直接返回結(jié)果,取不到時(shí)從數(shù)據(jù)庫(kù)中取,數(shù)據(jù)庫(kù)取到更新緩存,并返回結(jié)果,數(shù)據(jù)庫(kù)也沒(méi)取到,那直接返回空結(jié)果:

在這里插入圖片描述

使用緩存是一個(gè)很“高性價(jià)比”的性能優(yōu)化方式,尤其是對(duì)于有大量重復(fù)查詢的程序來(lái)說(shuō)。通常來(lái)說(shuō),在WEB后端應(yīng)用程序來(lái)說(shuō),

耗時(shí)比較大的往往有兩個(gè)地方:

1、查數(shù)據(jù)庫(kù);

2、調(diào)用其它服務(wù)的API(因?yàn)槠渌?wù)最終也要去做查數(shù)據(jù)庫(kù)等耗時(shí)操作);

重復(fù)查詢也有兩種:

1、我們?cè)趹?yīng)用程序中代碼寫(xiě)得不好,寫(xiě)的for循環(huán),可能每次循環(huán)都用重復(fù)的參數(shù)去查詢了。

2、大量的相同或相似請(qǐng)求造成的。比如資訊網(wǎng)站首頁(yè)的文章列表、電商網(wǎng)站首頁(yè)的商品列表、微博等社交媒體熱搜的文章等等,當(dāng)大量的用戶都去請(qǐng)求同樣的接口,同樣的數(shù)據(jù),如果每次都去查數(shù)據(jù)庫(kù),那對(duì)數(shù)據(jù)庫(kù)來(lái)說(shuō)是一個(gè)不可承受的壓力。所以我們通常會(huì)把高頻的查詢進(jìn)行緩存,我們稱它為“熱點(diǎn)”。

2.SpringCache概述

? 前面提到了緩存有諸多的好處,于是大家就摩拳擦掌準(zhǔn)備給自己的應(yīng)用加上緩存的功能。但是網(wǎng)上一搜卻發(fā)現(xiàn)緩存的框架太多了,各有各的優(yōu)勢(shì),比如Redis[中央緩存-遠(yuǎn)程緩存]、Memcached、Guava、Caffeine[本地緩存]等等。

? 如果我們的程序想要使用緩存,就要與這些框架耦合。聰明的架構(gòu)師已經(jīng)在利用接口來(lái)降低耦合了,利用面向?qū)ο蟮某橄蠛投鄳B(tài)的特性,做到業(yè)務(wù)代碼與具體的框架分離。

? 但我們?nèi)匀恍枰@式地在代碼中去調(diào)用與緩存有關(guān)的接口和方法,在合適的時(shí)候插入數(shù)據(jù)到緩存里,在合適的時(shí)候從緩存中讀取數(shù)據(jù)。想一想**「AOP」**的適用場(chǎng)景,這不就是天生就應(yīng)該AOP去做的嗎?

? 自Spring 3.1起,提供了類似于 @Transactional 注解事務(wù)的注解Cache支持,且提供了Cache抽象,在此之前一般通過(guò)AOP實(shí)現(xiàn)。

使用Spring Cache的好處:

  • 提供基本的Cache抽象,方便切換各種底層Cache;
  • 通過(guò)注解Cache可以實(shí)現(xiàn)類似于事務(wù)一樣,緩存邏輯透明的應(yīng)用到我們的業(yè)務(wù)代碼上,且只需要更少的代碼就可以完成;
  • 提供事務(wù)回滾時(shí)也自動(dòng)回滾緩存;
  • 支持比較復(fù)雜的緩存邏輯;

2.1SpringCache概述及核心配置

? Spring Cache就是一個(gè)緩存框架。它利用了AOP(將緩存邏輯與服務(wù)邏輯解耦),實(shí)現(xiàn)了基于注解的緩存功能(聲明式緩存),并且進(jìn)行了合理的抽象,業(yè)務(wù)代碼不用關(guān)心底層是使用了什么緩存框架,只需要簡(jiǎn)單地加一個(gè)注解,就能實(shí)現(xiàn)緩存功能了。而且Spring Cache也提供了很多默認(rèn)的配置,用戶可以快速將緩存集成到項(xiàng)目中;

接下來(lái),我們以一個(gè)很小的例子給大家講解SpringCache的快速使用;

2.2. SpringCache環(huán)境準(zhǔn)備

導(dǎo)入:day12\SpringCache緩存專題\代碼\springboot-cache項(xiàng)目代碼;

核心步驟如下:

2.2.1 緩存依賴導(dǎo)入
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.2.2 環(huán)境配置
#數(shù)據(jù)庫(kù)配置
spring:redis:host: 192.168.200.130     # Redis服務(wù)器地址database: 1         # Redis數(shù)據(jù)庫(kù)索引(默認(rèn)為0)port: 6379          # Redis服務(wù)器連接端口
#    password: ld123456  # Redis服務(wù)器連接密碼(默認(rèn)為空)
2.2.3 緩存配置類定義

SpringCache抽象出公共的緩存接口,同時(shí)面向用戶屏蔽了底層實(shí)現(xiàn)細(xì)節(jié),用戶可通過(guò)配置緩存管理器來(lái)實(shí)現(xiàn)緩存方案的替換:

在這里插入圖片描述

我們當(dāng)前以Redis作為SpringCache緩存底層實(shí)現(xiàn)為例展開(kāi)講解。

/*** @author itheima* code 自定義redis序列化配置類*/
@Configuration
public class RedisCacheConfig {/*** 配置 cacheManager 代替默認(rèn)的cacheManager (緩存管理器)* @param factory RedisConnectionFactory* @return  CacheManager*/@Beanpublic CacheManager cacheManager(RedisConnectionFactory factory) {RedisSerializer<String> redisSerializer = new StringRedisSerializer();Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper objectMapper = new ObjectMapper();objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);//僅僅序列化對(duì)象的屬性,且屬性不可為final修飾objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);serializer.setObjectMapper(objectMapper);// 配置key value序列化RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer))//關(guān)閉控制存儲(chǔ).disableCachingNullValues()//修改前綴與key的間隔符號(hào),默認(rèn)是::.computePrefixWith(cacheName->cacheName+":");//設(shè)置特有的Redis配置Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<>();//定制化的Cache 設(shè)置過(guò)期時(shí)間 eg:以role:開(kāi)頭的緩存存活時(shí)間為10scacheConfigurations.put("role",customRedisCacheConfiguration(config,Duration.ofSeconds(10)));cacheConfigurations.put("stock",customRedisCacheConfiguration(config,Duration.ofSeconds(3000)));cacheConfigurations.put("market",customRedisCacheConfiguration(config,Duration.ofSeconds(300)));//構(gòu)建redis緩存管理器RedisCacheManager cacheManager = RedisCacheManager.builder(factory)//Cache事務(wù)支持.transactionAware().withInitialCacheConfigurations(cacheConfigurations).cacheDefaults(config).build();//設(shè)置過(guò)期時(shí)間return cacheManager;}/*** 設(shè)置RedisConfiguration配置* @param config* @param ttl* @return*/public RedisCacheConfiguration customRedisCacheConfiguration(RedisCacheConfiguration config, Duration ttl) {//設(shè)置緩存缺省超時(shí)時(shí)間return config.entryTtl(ttl);}
}

2.3 SpringCache注解詳解

2.3.1 @Cacheable注解

如果緩存中沒(méi)有:查詢數(shù)據(jù)庫(kù),存儲(chǔ)緩存,返回結(jié)果,

如果緩存中有:直接返回結(jié)果

作用:可以用來(lái)進(jìn)行緩存的寫(xiě)入,將結(jié)果存儲(chǔ)在緩存中,以便于在后續(xù)調(diào)用的時(shí)候可以直接返回緩存中的值,而不必再執(zhí)行實(shí)際的方法。 最簡(jiǎn)單的使用方式,注解名稱=緩存名稱,使用例子如下:

在這里插入圖片描述

示例代碼:

@Service
@CacheConfig(cacheNames = "role")//提取緩存的前綴配置
public class RoleServiceImpl implements IRoleService {@Autowiredprivate RoleMapper roleMapper;/*** <p>* 幾個(gè)屬性:* a)cacheNames/value:指定緩存組件的名字*      cacheNames = {"role"}可以使用多個(gè)參數(shù),是數(shù)組的形式,可以指定多個(gè)緩存* b)key:緩存數(shù)據(jù)使用的key,可以用他來(lái)指定。默認(rèn)是使用方法參數(shù)的值*      編寫(xiě)SpEl:   #id  #a0,#po,#argrs[0]  "0"代表參數(shù)的索引*      #result  方法執(zhí)行后的返回值*      #root.methodName   方法名*      key = "#root.methodName+'['+#id+']'"* e)condition:指定符合緩存的條件*      condition = "#id>0 and #root.methodName eq 'aaa'" 可以多條件判斷* f)unless: 否定緩存,當(dāng)unless的條件為true,方法結(jié)果不會(huì)被緩存,可以獲取結(jié)果進(jìn)行判斷*      unless = "#result==null",結(jié)果為null,就不緩存*/@Override//@Cacheable(cacheNames = "role", key = "#id",condition = "#id>0",unless = "#result==null")@Cacheable(key = "#id",condition = "#id>0",unless = "#result==null")public Role findById(Integer id) {return roleMapper.selectByPrimaryKey(id);}@Cacheable(key ="#root.method.getName()")//直接引用mehtodname異常@Overridepublic R findAllRole() {List<Role> roleList = roleMapper.findAll();return R.ok(roleList);}
}
2.3.2 @CacheEvict注解

@CacheEvict:刪除緩存的注解,這對(duì)刪除舊的數(shù)據(jù)和無(wú)用的數(shù)據(jù)是非常有用的。這里還多了一個(gè)參數(shù)(allEntries),設(shè)置allEntries=true時(shí),可以對(duì)整個(gè)條目進(jìn)行批量刪除

在這里插入圖片描述

示例代碼:

    /*** .@CacheEvict 緩存清除*  key:指定要清除的數(shù)據(jù)*/@Override@CacheEvict(key = "#id")public Integer delete(Integer id) {return roleMapper.deleteByPrimaryKey(id);}
2.3.3 @CachePut注解

@CachePut:當(dāng)需要更新緩存而不干擾方法的運(yùn)行時(shí) ,可以使用該注解。也就是說(shuō),始終執(zhí)行該方法,并將結(jié)果放入緩存

本質(zhì)上說(shuō),如果存在對(duì)應(yīng)的緩存,則更新覆蓋,不存在則添加;

在這里插入圖片描述

示例代碼:

/*** .@CachePut既調(diào)用方法、又更新數(shù)據(jù),達(dá)到同步更新緩存* <p>* 運(yùn)行時(shí)機(jī):* 1、先調(diào)用目標(biāo)方法 ★★★* 2、將目標(biāo)方法的結(jié)果緩存起來(lái)★★★* 條件:存取Id的key要保持一致*     key = "#role.id"     傳入員工的Id*     key = "#result.id"   使用返回員工的Id* 注意: @Cacheable不能使用#result*      因?yàn)?@Cacheable在目標(biāo)方法執(zhí)行之前需要得到這個(gè)key,所以不能用#result*/
@Override
@CachePut(key = "#result.id")//更新或者添加緩存---》有則更新,無(wú)則添加
public Role update(Role role) {roleMapper.updateByPrimaryKey(role);return role;
}
2.3.4 @Caching注釋

? 在使用緩存的時(shí)候,有可能會(huì)同時(shí)進(jìn)行更新和刪除,會(huì)出現(xiàn)同時(shí)使用多個(gè)注解的情況.而@Caching可以實(shí)現(xiàn),對(duì)于復(fù)雜的緩存策略,我們可借助SpEL實(shí)現(xiàn);

Spring Cache提供了一些供我們使用的SpEL上下文數(shù)據(jù),下表直接摘自Spring官方文檔:

img

其它:如果表達(dá)式想直接引用一個(gè)常量值,那么需要 key=“‘xxxx’”

示例代碼:

    /*** .@Caching 定義復(fù)雜緩存規(guī)則*/@Override@Caching(cacheable = {@Cacheable(key = "#role.rolename")},put = {@CachePut(key = "#role.id"),@CachePut(key = "#role.rolecode")},evict = {@CacheEvict(key = "8")})public R add(Role role) {
//        role.setId(null);try {roleMapper.insert(role);} catch (Exception e) {return R.error();}return R.ok(role.getId());}
2.3.5 注解小結(jié)

對(duì)于緩存聲明,spring的緩存提供了一組java注解:

  • @Cacheable
    • 功能:觸發(fā)緩存寫(xiě)入,如果緩存中沒(méi)有,查詢數(shù)據(jù)庫(kù),存儲(chǔ)緩存,返回結(jié)果,如果緩存中有,直接返回結(jié)果
    • 應(yīng)用:查詢數(shù)據(jù)庫(kù)方法,且查詢的數(shù)據(jù)時(shí)熱點(diǎn)數(shù)據(jù)
  • @CacheEvict
    • 功能:觸發(fā)緩存清除
    • 應(yīng)用:刪除或修改數(shù)據(jù)庫(kù)方法
  • @CachePut
    • 功能:緩存寫(xiě)入(不會(huì)影響到方法的運(yùn)行)。有則更新,無(wú)則添加
    • 應(yīng)用:新增到數(shù)據(jù)庫(kù)方法
  • @Caching
    • 功能:重新組合要應(yīng)用于方法的多個(gè)緩存操作
    • 應(yīng)用:上面的注解的組合使用
  • @CacheConfig(cacheNames = “xxx”)
    • 功能:可以提取公共的緩存key的前綴,一般是業(yè)務(wù)的前綴
    • 應(yīng)用:作用在類之上

第二章 優(yōu)雅使用SpringCache

3.緩存層選擇

在這里插入圖片描述

選擇Face的理由:

  • controller層功能過(guò)于粗狂、組裝數(shù)據(jù)返回前端,不易緩存的維護(hù);
  • service的功能過(guò)于細(xì)膩,切關(guān)聯(lián)甚廣;
  • 使用face處理緩存等一些特殊場(chǎng)景,與開(kāi)發(fā)服務(wù)邏輯隔離,方便維護(hù);

4.項(xiàng)目集成SpringCache

當(dāng)前我們先將stock_job任務(wù)工程集成SpringCache;

4.1 stock_job工程引入cache依賴
<!--不要將緩存放在中間common層,因?yàn)槿绻胏ommon的第三方不適用緩存,會(huì)導(dǎo)致因?yàn)閳?chǎng)景依賴自動(dòng)裝配的機(jī)制導(dǎo)致啟動(dòng)失敗-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!--引入redis的starter依賴-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- redis創(chuàng)建連接池,默認(rèn)不會(huì)創(chuàng)建連接池 -->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>
4.2 配置application-cache.yml:
#配置redis的環(huán)境
spring:redis:host: 192.168.200.130 # 默認(rèn)localhostport: 6379 #默認(rèn)是6379
#    password: laofang #如果redis服務(wù)沒(méi)有配置密碼,則可不寫(xiě)database: 0 #默認(rèn)操縱redis的0分片的數(shù)據(jù) ,可省略不寫(xiě)lettuce:pool:max-active: 8 # 連接池最大連接數(shù)(使用負(fù)值表示沒(méi)有限制)max-wait: -1ms # 連接池最大阻塞等待時(shí)間(使用負(fù)值表示沒(méi)有限制)max-idle: 8 # 連接池中的最大空閑連接min-idle: 1  # 連接池中的最小空閑連接timeout: PT10S # 連接超時(shí)時(shí)間

在主配置文件激活緩存配置:

spring:profiles:active: true
4.3 定義SpringCache配置類

RedisConfiguration配置類開(kāi)啟緩存@EnableCaching,然后定義緩存依賴bean:

@Configuration
//開(kāi)啟SpringCache緩存注解功能支持
@EnableCaching
public class RedisCacheConfig {/*** 定義序列化方式* @return*/@Beanpublic StringRedisSerializer stringRedisSerializer(){return new StringRedisSerializer();}/*** 配置 cacheManager 代替默認(rèn)的cacheManager (緩存管理器)* 當(dāng)前使用的redis緩存做為底層實(shí)現(xiàn),如果將來(lái)想替換緩存方案,那么只需調(diào)整CacheManager的實(shí)現(xiàn)細(xì)節(jié)即可* 其他代碼無(wú)需改動(dòng)* @param factory RedisConnectionFactory* @return  CacheManager*/@Beanpublic CacheManager cacheManager(RedisConnectionFactory factory) {//定義redis數(shù)據(jù)序列化的對(duì)象RedisSerializer<String> redisSerializer = new StringRedisSerializer();//jackson序列化方式對(duì)象Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper objectMapper = new ObjectMapper();//設(shè)置被序列化的對(duì)象的屬性都可訪問(wèn):暴力反射objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);//僅僅序列化對(duì)象的屬性,且屬性不可為final修飾objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);serializer.setObjectMapper(objectMapper);// 配置key value序列化RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer))//關(guān)閉控制存儲(chǔ)--》禁止緩存value為null的數(shù)據(jù).disableCachingNullValues()//修改前綴與key的間隔符號(hào),默認(rèn)是::  eg:name:findById.computePrefixWith(cacheName->cacheName+":");//設(shè)置特有的Redis配置Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<>();//定制化的Cache 設(shè)置過(guò)期時(shí)間 eg:以role:開(kāi)頭的緩存存活時(shí)間為10s
//        cacheConfigurations.put("role",customRedisCacheConfiguration(config,Duration.ofSeconds(20)));cacheConfigurations.put(StockConstant.STOCK,customRedisCacheConfiguration(config, Duration.ofHours(24)));//構(gòu)建redis緩存管理器RedisCacheManager cacheManager = RedisCacheManager.builder(factory)//Cache事務(wù)支持,保證reids下的緩存與數(shù)據(jù)庫(kù)下的數(shù)據(jù)一致性.transactionAware().withInitialCacheConfigurations(cacheConfigurations).cacheDefaults(config).build();//設(shè)置過(guò)期時(shí)間return cacheManager;}/*** 設(shè)置RedisConfiguration配置* @param config* @param ttl* @return*/public RedisCacheConfiguration customRedisCacheConfiguration(RedisCacheConfiguration config, Duration ttl) {//設(shè)置緩存缺省超時(shí)時(shí)間return config.entryTtl(ttl);}
}

5.項(xiàng)目使用案例

5.1 股票code緩存實(shí)現(xiàn)

5.1.1 場(chǎng)景說(shuō)明

原來(lái)進(jìn)行股票數(shù)據(jù)采集時(shí),需要反復(fù)從數(shù)據(jù)庫(kù)加載股票code信息,io開(kāi)銷比較大,我們可以將該數(shù)據(jù)緩存在內(nèi)存中:

    /*** 定義批量獲取分鐘級(jí)股票數(shù)據(jù)*/@Overridepublic void getStockRtIndex() {//1.獲取股票的編碼集合 todo 后期優(yōu)化 將股票id數(shù)據(jù)存入redis緩存List<String> stockCodes = stockBusinessMapper.getAllStockCodes();//2.給股票編碼添加交易所前綴,以6開(kāi)頭:sh,其它szstockCodes=stockCodes.stream().map(stockCode->{stockCode= stockCode.startsWith("6")?"sh"+stockCode:"sz"+stockCode;return stockCode;}).collect(Collectors.toList());//......}

顯然每次查詢都要取數(shù)據(jù)庫(kù)獲取一次全量的股票code數(shù)據(jù),開(kāi)銷較大,我們可以存入redis緩存中提高處理效率;

5.1.2 緩存層接口抽取

定義緩存層接口:

package com.itheima.stock.face;import com.itheima.stock.pojo.entity.StockBusiness;
import java.util.List;/*** @author by itheima* @Date 2022/6/16* @Description 定義股票緩存層*/
public interface StockCacheFace {/*** 獲取所有股票編碼,并添加上證或者深證的股票前綴編號(hào):sh sz* @return*/List<String> getAllStockCodeWithPredix();/*** 根據(jù)id更新股票的信息*/void updateStockInfoById(StockBusiness info);
}

定義緩存層實(shí)現(xiàn):


/*** @author by itheima* @Date 2022/6/16* @Description 股票數(shù)據(jù)緩存層實(shí)現(xiàn)*/
@Component
@CacheConfig(cacheNames = StockConstant.STOCK)
public class StockCacheFaceImpl implements StockCacheFace {@Autowiredprivate StockBusinessMapper stockBusinessMapper;/*** 緩存股票編碼,且編碼數(shù)據(jù)提供所屬大盤(pán)前綴* @return*/@Cacheable(key = "#root.method.getName()")@Overridepublic List<String> getAllStockCodeWithPredix() {//1.獲取所有A股股票的編碼List<String> allCodes = stockBusinessMapper.getAllStockCodes();//2.添加股票前綴 sh szList<String> prefixCodes = allCodes.stream().map(code -> {code = code.startsWith("6") ? "sh" + code : "sz" + code;return code;}).collect(Collectors.toList());return prefixCodes;}/*** 清除緩存* 如果指定具體key,表達(dá)式需要添加單引號(hào)* @param info*/@CacheEvict(key = "'getAllStockCodeWithPredix'")@Overridepublic void updateStockInfoById(StockBusiness info) {stockBusinessMapper.updateByPrimaryKeySelective(info);}
}

測(cè)試:

package com.itheima.stock;import com.itheima.stock.face.StockCacheFace;
import com.itheima.stock.pojo.entity.StockBusiness;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;/*** @author by itheima* @Date 2022/6/16* @Description 測(cè)試springCache緩存*/
@SpringBootTest
public class TestSpringCache {@Autowiredprivate StockCacheFace stockCacheFace;/*** @Description 測(cè)試緩存*/@Testpublic void testCache(){List<String> all = stockCacheFace.getAllStockCodeWithPredix();System.out.println(all);}/*** @Description 測(cè)試緩存*/@Testpublic void deleteCache(){StockBusiness info = StockBusiness.builder().stockCode("000012").stockName("建筑材料666").build();stockCacheFace.updateStockInfoById(info);}
}

發(fā)現(xiàn)數(shù)據(jù)已經(jīng)緩存在redis下:

在這里插入圖片描述

5.2 緩存用戶權(quán)限信息(作業(yè))

//獲取權(quán)限集合
List<SysPermission> permissionList=this.sysPermissionMapper.getPermissionByUserId(user.getId());
List<String> permsNameList = permissionList.stream().filter(item -> !Strings.isNullOrEmpty(item.getPerms())).map(item -> item.getPerms()).collect(Collectors.toList());//獲取角色集合 基于角色鑒權(quán)注解需要將角色前追加ROLE_
List<SysRole> roleList= sysRoleMapper.getRoleByUserId(user.getId());
List<String> roleNameList = roleList.stream().filter(item -> !Strings.isNullOrEmpty(item.getName())).map(item ->  "ROLE_" + item.getName()).collect(Collectors.toList());List<String> auths= new ArrayList<String>();
auths.addAll(permsNameList);
auths.addAll(roleNameList);

將上述代碼封裝到緩存層;

? 入?yún)?#xff1a;userId

? 出參:List 用戶的SpringSecurity的權(quán)限標(biāo)識(shí)

5.3 用戶前端側(cè)邊欄信息緩存(作業(yè))

說(shuō)明:

? 把用戶對(duì)應(yīng)的前端展示的側(cè)邊欄緩存處理;

關(guān)聯(lián)的代碼:

//權(quán)限樹(shù)結(jié)構(gòu),給前端響應(yīng) 從緩存獲取樹(shù)狀結(jié)構(gòu)
List<PermissionRespNodeVo> treeNodeVo = permissionService.getTree(permissionList, "0", true);
user.setMenus(treeNodeVo);

5.4 用戶關(guān)聯(lián)的按鈕權(quán)限信息緩存(作業(yè))

說(shuō)明:

用戶的按鈕標(biāo)識(shí)緩存

if (!CollectionUtils.isEmpty(permissionList)) {
authBtnPerms = permissionList.stream().filter(per -> !Strings.isNullOrEmpty(per.getCode()) && per.getType()==3)
.map(per -> per.getCode()).collect(Collectors.toList());
}

當(dāng)然,也可直接把UserDetail對(duì)象直接緩存在緩存下(不建議)

? key:username

? value:LoginUserDetail對(duì)象

使用redis盡量避免出現(xiàn)大value出現(xiàn)

因?yàn)榇髒alue的出現(xiàn)會(huì)導(dǎo)致網(wǎng)絡(luò)IO增加,導(dǎo)致其它請(qǐng)求可能會(huì)被阻塞(redis的存取數(shù)據(jù)是單線程),而大value會(huì)占用過(guò)多的網(wǎng)絡(luò)io的開(kāi)下,導(dǎo)致其它請(qǐng)求被阻塞;

5.5 緩存股票的最新數(shù)據(jù)

思考:

? 如何在緩存帶來(lái)的性能開(kāi)銷和接口性能的提升之間做取舍?

? 用戶人群少,比如:幾十人,是否需要緩存每分鐘的股票相關(guān)的數(shù)據(jù)?

? 人少,訪問(wèn)量就少,數(shù)據(jù)庫(kù)能抗住,但是如果加入緩存,那么每分鐘還要更新緩存數(shù)據(jù),更新頻次過(guò)高,也會(huì)影響性能;

? 用戶人群多,訪問(wèn)量大

? 數(shù)據(jù)庫(kù)扛不住,引入緩存;

? 緩存的策略:方式1:設(shè)置緩存失效時(shí)間,一分鐘 方式2:觸發(fā)淘汰,一分鐘淘汰一次,xxljob觸發(fā)緩存更新

if (!CollectionUtils.isEmpty(permissionList)) {
authBtnPerms = permissionList.stream().filter(per -> !Strings.isNullOrEmpty(per.getCode()) && per.getType()==3)
.map(per -> per.getCode()).collect(Collectors.toList());
}

當(dāng)然,也可直接把UserDetail對(duì)象直接緩存在緩存下(不建議)

? key:username

? value:LoginUserDetail對(duì)象

使用redis盡量避免出現(xiàn)大value出現(xiàn)

因?yàn)榇髒alue的出現(xiàn)會(huì)導(dǎo)致網(wǎng)絡(luò)IO增加,導(dǎo)致其它請(qǐng)求可能會(huì)被阻塞(redis的存取數(shù)據(jù)是單線程),而大value會(huì)占用過(guò)多的網(wǎng)絡(luò)io的開(kāi)下,導(dǎo)致其它請(qǐng)求被阻塞;

5.5 緩存股票的最新數(shù)據(jù)

思考:

? 如何在緩存帶來(lái)的性能開(kāi)銷和接口性能的提升之間做取舍?

? 用戶人群少,比如:幾十人,是否需要緩存每分鐘的股票相關(guān)的數(shù)據(jù)?

? 人少,訪問(wèn)量就少,數(shù)據(jù)庫(kù)能抗住,但是如果加入緩存,那么每分鐘還要更新緩存數(shù)據(jù),更新頻次過(guò)高,也會(huì)影響性能;

? 用戶人群多,訪問(wèn)量大

? 數(shù)據(jù)庫(kù)扛不住,引入緩存;

? 緩存的策略:方式1:設(shè)置緩存失效時(shí)間,一分鐘 方式2:觸發(fā)淘汰,一分鐘淘汰一次,xxljob觸發(fā)緩存更新

總之,從緩存的性價(jià)比來(lái)講,數(shù)據(jù)盡量少,且使用頻次多,且變化要少;

http://m.risenshineclean.com/news/63344.html

相關(guān)文章:

  • 網(wǎng)站建設(shè)中 html模板淘客推廣
  • 東莞快速做網(wǎng)站東莞網(wǎng)絡(luò)公司電話
  • 表單大師 做網(wǎng)站怎么查網(wǎng)站是不是正規(guī)
  • 網(wǎng)站后臺(tái)管理方便嗎新疆今日頭條新聞
  • 網(wǎng)站怎么做留言板百度網(wǎng)站官網(wǎng)網(wǎng)址
  • 做企業(yè)網(wǎng)站 目的二維碼引流推廣的平臺(tái)
  • 網(wǎng)站被降權(quán)的表現(xiàn)應(yīng)用商店優(yōu)化
  • 清新縣城鄉(xiāng)規(guī)劃建設(shè)局網(wǎng)站百度域名購(gòu)買
  • 肇慶市企業(yè)網(wǎng)站建設(shè)品牌網(wǎng)絡(luò)銷售工資一般多少
  • 網(wǎng)站建設(shè)包含哪些網(wǎng)站模板套用教程
  • 網(wǎng)站軟件有哪些網(wǎng)站建設(shè)制作教程
  • 河北搜恒不給做網(wǎng)站seo網(wǎng)站自動(dòng)推廣
  • 張家港哪家做企業(yè)網(wǎng)站競(jìng)價(jià)推廣營(yíng)銷
  • 自己做網(wǎng)站需要什么seo自動(dòng)優(yōu)化工具
  • 怎樣做網(wǎng)站發(fā)帖天津百度關(guān)鍵詞seo
  • 安徽合肥市城鄉(xiāng)建設(shè)委員會(huì)網(wǎng)站在線子域名二級(jí)域名查詢工具
  • 有什么做網(wǎng)站優(yōu)化公司互聯(lián)網(wǎng)推廣廣告
  • 揚(yáng)州市住房和城鄉(xiāng)建設(shè)網(wǎng)站網(wǎng)絡(luò)建設(shè)推廣
  • 自己怎么做跨境電商優(yōu)化關(guān)鍵詞的方法有哪些
  • 聊城做企業(yè)網(wǎng)站關(guān)鍵詞優(yōu)化的建議
  • 進(jìn)網(wǎng)站后臺(tái)加什么原因日本比分預(yù)測(cè)最新分析
  • 做足球網(wǎng)站前景百度一下百度搜索入口
  • 現(xiàn)在哪些網(wǎng)站自己做裝修百度關(guān)鍵詞排名突然沒(méi)了
  • 具有設(shè)計(jì)感的網(wǎng)站seo優(yōu)化案例
  • 如何把購(gòu)物網(wǎng)站做成非經(jīng)營(yíng)網(wǎng)站百度收錄
  • 做電商網(wǎng)站要服務(wù)器嗎陽(yáng)東網(wǎng)站seo
  • c2c有哪些網(wǎng)站輿情監(jiān)測(cè)軟件免費(fèi)版
  • 房地產(chǎn)集團(tuán)網(wǎng)站建設(shè)方案廣州市新聞發(fā)布
  • 網(wǎng)站建設(shè)后臺(tái)管理便捷百度移動(dòng)seo首選帝搜軟件
  • 用什么軟件做購(gòu)物網(wǎng)站軟文推廣例子