91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Redis緩存實例代碼分析

發布時間:2023-04-04 10:27:39 來源:億速云 閱讀:119 作者:iii 欄目:開發技術

這篇文章主要介紹“Redis緩存實例代碼分析”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Redis緩存實例代碼分析”文章能幫助大家解決問題。

一、簡介

1、場景

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

2、RedisTemplate

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

二、引入Redis

1、項目中集成Redis

service-base模塊中添加redis依賴,Spring Boot 2.0以上默認通過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 #默認為空
    timeout: 3000ms #最大等待時間,超時則拋出異常,否則請求一直等待
    lettuce:
      pool:
        max-active: 20  #最大連接數,負值表示沒有限制,默認8
        max-wait: -1    #最大阻塞等待時間,負值表示沒限制,默認-1
        max-idle: 8     #最大空閑連接,默認8
        min-idle: 0     #最小空閑連接,默認0

3、啟動Redis服務

遠程連接Linux服務器,這里本地使用centos虛擬機上的redis

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

三、測試RedisTemplate

1、存值測試

test中創建測試類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);
        //向數據庫中存儲string類型的鍵值對, 過期時間5分鐘
        redisTemplate.opsForValue().set("dict", dict, 5, TimeUnit.MINUTES);
    }
}

發現RedisTemplate默認使用了JDK的序列化方式存儲了key和value,可讀性差

Redis緩存實例代碼分析

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);
        //序列化時將類的數據類型存入json,以便反序列化的時候轉換成正確的類型
        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存儲

Redis緩存實例代碼分析

3、取值測試

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

四、將數據字典存入redis

DictServiceImpl

注意:當redis服務器宕機時,我們不要拋出異常,要正常的執行后面的流程,使業務可以正常的運行

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

集成redis總結:

(1)導入相關依賴;

(2)配置redis連接信息;

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

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

redis業務總結:

(1)首先查詢redis中有無對應的緩存信息,有的話取出直接返回,沒有執行(2),如果redis因為某種原因連接不上比如宕機,此時打印錯誤日志,繼續查詢數據庫;

(2)沒有的話查詢數據庫,將數據存放進redis并返回數據。

關于“Redis緩存實例代碼分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

区。| 富平县| 正定县| 含山县| 将乐县| 乌拉特中旗| 长顺县| 南昌市| 务川| 石渠县| 大田县| 建水县| 怀集县| 阿勒泰市| 昆山市| 拉孜县| 新绛县| 尉氏县| 乐山市| 长阳| 栾川县| 大港区| 辽宁省| 安吉县| 湖北省| 寿阳县| 阿勒泰市| 广河县| 永嘉县| 三都| 增城市| 孝昌县| 崇礼县| 大英县| 浮山县| 屏东县| 卫辉市| 武功县| 徐州市| 清镇市| 射阳县|