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

Redis緩存實(shí)例分步詳解

 更新時(shí)間:2023年04月04日 08:30:42   作者:zoeil  
實(shí)際開發(fā)中緩存處理是必須的,不可能我們每次客戶端去請求一次服務(wù)器,服務(wù)器每次都要去數(shù)據(jù)庫中進(jìn)行查找,為什么要使用緩存?說到底是為了提高系統(tǒng)的運(yùn)行速度

一、簡介

1、場景

由于數(shù)據(jù)字典的變化不是很頻繁,而且系統(tǒng)對數(shù)據(jù)字典的訪問較頻繁,所以我們有必要把數(shù)據(jù)字典的數(shù)據(jù)存入緩存,減少數(shù)據(jù)庫壓力和提高訪問速度。這里,我們使用Redis作為系統(tǒng)的分布式緩存中間件。

2、RedisTemplate

在Spring Boot項(xiàng)目中中,默認(rèn)集成Spring Data Redis,Spring Data Redis針對Redis提供了非常方便的操作模版RedisTemplate,并且可以進(jìn)行連接池自動管理。

二、引入Redis

1、項(xiàng)目中集成Redis

service-base模塊中添加redis依賴,Spring Boot 2.0以上默認(rèn)通過commons-pool2連接池連接Redis

<!-- spring boot redis緩存引入 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 緩存連接池-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>
<!-- redis 存儲 json序列化 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

2、添加Redis連接配置

service-core的 application.yml 中添加如下配置

#spring: 
  redis:
    host: 192.168.100.100
    port: 6379
    database: 0
    password: 123456 #默認(rèn)為空
    timeout: 3000ms #最大等待時(shí)間,超時(shí)則拋出異常,否則請求一直等待
    lettuce:
      pool:
        max-active: 20  #最大連接數(shù),負(fù)值表示沒有限制,默認(rèn)8
        max-wait: -1    #最大阻塞等待時(shí)間,負(fù)值表示沒限制,默認(rèn)-1
        max-idle: 8     #最大空閑連接,默認(rèn)8
        min-idle: 0     #最小空閑連接,默認(rèn)0

3、啟動Redis服務(wù)

遠(yuǎn)程連接Linux服務(wù)器,這里本地使用centos虛擬機(jī)上的redis

#啟動服務(wù)
cd /usr/local/redis-5.0.7
bin/redis-server redis.conf

三、測試RedisTemplate

1、存值測試

test中創(chuàng)建測試類RedisTemplateTests

@SpringBootTest
@RunWith(SpringRunner.class)
public class RedisTemplateTests {
    @Resource
    private RedisTemplate redisTemplate;
    @Resource
    private DictMapper dictMapper;
    @Test
    public void saveDict(){
        Dict dict = dictMapper.selectById(1);
        //向數(shù)據(jù)庫中存儲string類型的鍵值對, 過期時(shí)間5分鐘
        redisTemplate.opsForValue().set("dict", dict, 5, TimeUnit.MINUTES);
    }
}

發(fā)現(xiàn)RedisTemplate默認(rèn)使用了JDK的序列化方式存儲了key和value,可讀性差

2、Redis配置文件

service-base中添加RedisConfig,我們可以在這個配置文件中配置Redis序列化方案

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //首先解決key的序列化方式
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringRedisSerializer);
        //解決value的序列化方式
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        //序列化時(shí)將類的數(shù)據(jù)類型存入json,以便反序列化的時(shí)候轉(zhuǎn)換成正確的類型
        ObjectMapper objectMapper = new ObjectMapper();
        //objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
        // 解決jackson2無法反序列化LocalDateTime的問題
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        objectMapper.registerModule(new JavaTimeModule());
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        return redisTemplate;
    }
}

再次測試,key使用了字符串存儲,value使用了json存儲

3、取值測試

@Test
public void getDict(){
    Dict dict = (Dict)redisTemplate.opsForValue().get("dict");
    System.out.println(dict);
}

四、將數(shù)據(jù)字典存入redis

DictServiceImpl

注意:當(dāng)redis服務(wù)器宕機(jī)時(shí),我們不要拋出異常,要正常的執(zhí)行后面的流程,使業(yè)務(wù)可以正常的運(yùn)行

@Resource
private RedisTemplate redisTemplate;
@Override
public List<Dict> listByParentId(Long parentId) {
    //先查詢r(jià)edis中是否存在數(shù)據(jù)列表
    List<Dict> dictList = null;
    try {
        dictList = (List<Dict>)redisTemplate.opsForValue().get("srb:core:dictList:" + parentId);
        if(dictList != null){
            log.info("從redis中取值");
            return dictList;
        }
    } catch (Exception e) {
        log.error("redis服務(wù)器異常:" + ExceptionUtils.getStackTrace(e));//此處不拋出異常,繼續(xù)執(zhí)行后面的代碼
    }
    log.info("從數(shù)據(jù)庫中取值");
    dictList = baseMapper.selectList(new QueryWrapper<Dict>().eq("parent_id", parentId));
    dictList.forEach(dict -> {
        //如果有子節(jié)點(diǎn),則是非葉子節(jié)點(diǎn)
        boolean hasChildren = this.hasChildren(dict.getId());
        dict.setHasChildren(hasChildren);
    });
    //將數(shù)據(jù)存入redis
    try {
        redisTemplate.opsForValue().set("srb:core:dictList:" + parentId, dictList, 5, TimeUnit.MINUTES);
        log.info("數(shù)據(jù)存入redis");
    } catch (Exception e) {
        log.error("redis服務(wù)器異常:" + ExceptionUtils.getStackTrace(e));//此處不拋出異常,繼續(xù)執(zhí)行后面的代碼
    }
    return dictList;
}

集成redis總結(jié):

(1)導(dǎo)入相關(guān)依賴;

(2)配置redis連接信息;

(3)測試連接,取值測試,存值測試;

(4)根據(jù)自己的需要配置序列化器,否則默認(rèn)使用jdk的序列化器。

redis業(yè)務(wù)總結(jié):

(1)首先查詢r(jià)edis中有無對應(yīng)的緩存信息,有的話取出直接返回,沒有執(zhí)行(2),如果redis因?yàn)槟撤N原因連接不上比如宕機(jī),此時(shí)打印錯誤日志,繼續(xù)查詢數(shù)據(jù)庫;

(2)沒有的話查詢數(shù)據(jù)庫,將數(shù)據(jù)存放進(jìn)redis并返回?cái)?shù)據(jù)。

到此這篇關(guān)于Redis緩存實(shí)例分步詳解的文章就介紹到這了,更多相關(guān)Redis緩存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)鼠標(biāo)隨機(jī)移動效果的示例代碼

    Java實(shí)現(xiàn)鼠標(biāo)隨機(jī)移動效果的示例代碼

    有的時(shí)候我們需要鼠標(biāo)一直滑動的情況,為了節(jié)省時(shí)間,本文用Java語言寫了一個腳本,可以實(shí)現(xiàn)鼠標(biāo)隨機(jī)移動,感興趣的小伙伴可以了解一下
    2022-05-05
  • Spring ProtocolResolver策略接口示例

    Spring ProtocolResolver策略接口示例

    這篇文章主要介紹了Spring ProtocolResolver策略接口示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • springboot中用fastjson處理返回值為null的屬性值

    springboot中用fastjson處理返回值為null的屬性值

    在本篇文章里小編給大家整理的是一篇關(guān)于springboot中用fastjson處理返回值問題詳解內(nèi)容,需要的朋友們參考下。
    2020-03-03
  • springboot啟動不了也不報(bào)錯的問題及解決

    springboot啟動不了也不報(bào)錯的問題及解決

    這篇文章主要介紹了springboot啟動不了也不報(bào)錯的問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Java判斷List中有無重復(fù)元素的方法

    Java判斷List中有無重復(fù)元素的方法

    今天小編就為大家分享一篇Java判斷List中有無重復(fù)元素的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • 解決Spring中@Value注解取值為null問題

    解決Spring中@Value注解取值為null問題

    近期應(yīng)用中因業(yè)務(wù)迭代需要接入 user 客戶端,接入后總是啟動失敗,報(bào)注冊 user bean 依賴的配置屬性為 null,所以接下來小編就和大家一起排查分析這個問題,感興趣的小伙伴跟著小編一起來看看吧
    2023-08-08
  • 列舉java語言中反射的常用方法及實(shí)例代碼

    列舉java語言中反射的常用方法及實(shí)例代碼

    反射機(jī)制指的是程序在運(yùn)行時(shí)能夠獲取自身的信息。這篇文章主要介紹了列舉java語言中反射的常用方法,需要的朋友可以參考下
    2019-07-07
  • Spring?Boot?多數(shù)據(jù)源處理事務(wù)的思路詳解

    Spring?Boot?多數(shù)據(jù)源處理事務(wù)的思路詳解

    這篇文章主要介紹了Spring?Boot?多數(shù)據(jù)源如何處理事務(wù),本文單純就是技術(shù)探討,要從實(shí)際應(yīng)用中來說的話,我并不建議這樣去玩分布式事務(wù)、也不建議這樣去玩多數(shù)據(jù)源,畢竟分布式事務(wù)主要還是用在微服務(wù)場景下,對Spring?Boot?多數(shù)據(jù)源事務(wù)相關(guān)知識感興趣的朋友參考下本文
    2022-06-06
  • java?-jar/-cp啟動添加外部的依賴包方式

    java?-jar/-cp啟動添加外部的依賴包方式

    這篇文章主要介紹了java?-jar/-cp啟動添加外部的依賴包方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java實(shí)現(xiàn)斗地主案例

    Java實(shí)現(xiàn)斗地主案例

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)斗地主案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04

最新評論

读书| 赣榆县| 汉源县| 海安县| 高台县| 舒城县| 女性| 浦北县| 高邑县| 祥云县| 固阳县| 衡南县| 静乐县| 泗阳县| 衡东县| 道孚县| 广河县| 娄底市| 石阡县| 黎平县| 新竹县| 云南省| 化州市| 江达县| 淮滨县| 长汀县| 吉水县| 云梦县| 满洲里市| 崇阳县| 红安县| 虹口区| 五原县| 平塘县| 无锡市| 佛坪县| 海原县| 太仓市| 鹰潭市| 清丰县| 石林|