Spring Boot2(三):使用Spring Boot2集成Redis緩存


本文在個人技術博客【鳥不拉屎】同步發布,詳情可猛戳 亦可掃描文章末尾二維碼關注個人公眾號【鳥不拉屎】

前言

前面一節總結了SpringBoot實現Mybatis的緩存機制,但是實際項目中很少用到Mybatis的二級緩存機制,反而用到比較多的是第三方緩存Redis

Redis是一個使用ANSI C編寫的開源、支持網絡、基於內存、可選持久性的鍵值對存儲數據庫。

安裝啟動Redis

安裝Redis的就不講太多了,直接去官方下載redis,下載Redis-x64-3.2.100.zip,cmd,在redis目錄下輸入:redis-server.exe redis.windows.conf啟動即可

另外可以通過Redis桌面客戶端可視化連接工具操作:redisdesktop

代碼部署

快速建立Spring Boot項目

添加redis依賴

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

application.yml配置

spring:
  redis:
    host: 127.0.0.1
    database: 0
    password:
    port: 6379
    jedis:
      pool:
        max-active: 1000  # 連接池最大連接數(使用負值表示沒有限制)
        max-wait: -1ms  # 連接池最大阻塞等待時間(使用負值表示沒有限制)
        max-idle: 10  # 連接池中的最大空閑連接
        min-idle: 5 # 連接池中的最小空閑連接

RedisConfig配置類

@Autowired
private RedisConnectionFactory factory;

/**
 *
 * @return
 */
@Bean
public RedisTemplate<String, Object> redisTemplate() {
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    //更改在redis里面查看key編碼問題
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    redisTemplate.setHashValueSerializer(new StringRedisSerializer());
    redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
    redisTemplate.setConnectionFactory(factory);
    return redisTemplate;
}

RedisUtils工具類

@Autowired
private RedisTemplate redisTemplate;
// 簡單的K-V操作
@Resource(name="redisTemplate")
private ValueOperations<String, String> valueOperations;

// 針對Map類型的數據操作
@Resource(name="redisTemplate")
private HashOperations<String, String, Object> hashOperations;

// 針對List類型的數據操作
@Resource(name="redisTemplate")
private ListOperations<String, Object> listOperations;

// set類型數據操作
@Resource(name="redisTemplate")
private SetOperations<String, Object> setOperations;

// zset類型數據操作
@Resource(name="redisTemplate")
private ZSetOperations<String, Object> zSetOperations;

實體類SysCodeEntity

@Data
public class SysCodeEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    private int id;

    // 分類編碼
    private String kindCode;

    // 分類名稱
    private String kindName;

    // CODE編碼
    private String code;
	......
}

ServiceImpl實現類

/**
 * 查詢所有數字字典
 * @return
 */
@Override
public List<SysCodeEntity> queryCodeAll() {
    logger.info("先從緩存中查找,如果沒有則去數據進行查詢");
    List<SysCodeEntity> codeList = (List<SysCodeEntity>)redisTemplate.opsForList().leftPop("codeList");
    if (codeList == null) {
        logger.info("說明緩存中沒有數據,則到數據庫中查詢");
        codeList = sysCodeDao.queryCodeAll();

        logger.info("將數據庫獲取的數據存入緩存");
        redisTemplate.opsForList().leftPush("codeList", codeList);
    } else {
        logger.info("則說明緩存中存在,直接從緩存中獲取數據");
    }
    logger.info("codeList=" + codeList);
    return codeList;
}

上面例子具體解釋已經在注釋中體現,通過opsForList的leftPop和leftPush存入和獲取Redis緩存的數據。

Controller層實現

/**
 * 查詢所有數字字典
 * @return
 */
@RequestMapping("/getAll")
private List<SysCodeEntity> getUser() {
    Long startTime = System.currentTimeMillis(); //開始時間
    List<SysCodeEntity> codeList = sysCodeService.queryCodeAll();
    Long endTime = System.currentTimeMillis(); //結束時間
    System.out.println("查詢數據庫--共耗時:" + (endTime - startTime) + "毫秒"); //1007毫秒
    return codeList;
}

Postman進行測試

http://localhost:8080/getAll

日志信息

總結和擴展

1、Redis支持:字符串String、哈希Hash、列表List、集合Set、有序集合Sorted Set、發布訂閱Pub/Sub、事務Transactions,7種數據類型

2、Redis實用場景:緩存系統、計數器、消息列隊系統、排行版及相關問題、社交網絡、按照用戶投票和時間排序、過期項目處理、實時系統

3、Redis的高級功能:慢查詢(內部執行時間超過某個指定的時限查詢)、PipeLine管道(降低客戶端與redis通信次數,適用於批處理)、BitMap位圖(針對大數據量設計)、HyperLogLog(極小空間完成獨立數據統計)、發布訂閱、消息隊列、GEO地理位置存儲

4、Redis持久化:

​ 快照RDB(使用快照,一種半持久耐用模式。不時的將數據集以異步方式從內存以RDB格式寫入硬盤)

​ 日志AOF(1.1版本開始使用更安全的AOF格式替代,一種只能追加的日志類型。將數據集修改操作記錄起來。Redis能夠在后台對只可追加的記錄作修改來避免無限增長的日志)

5、Redis分布式解決方案:主從復制、集群...

示例代碼-github

后期持續探索Redis技術 To be continued...

推薦閱讀:Redis 入門到分布式實踐


關於作者:

個人博客:鳥不拉屎

github主頁:niaobulashi

github博客:鳥不拉屎

掘金:鳥不拉屎

博客園:鳥不拉屎

知乎:鳥不拉屎


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM