1. 程式人生 > 其它 >第五章 新版SpringBoot2.x整合Redis6客戶端實戰

第五章 新版SpringBoot2.x整合Redis6客戶端實戰

第1集 分散式快取Redis客戶端講解

簡介:分散式快取Redis客戶端講解

  • 自帶客戶端 redis-cli

  • 視覺化工具

  • 語言客戶端:java、nodejs、python

    • java語言客戶端:

      • jedis
      Jedis 是直連模式,在多個執行緒間共享一個 Jedis 例項時是執行緒不安全的,需要使用連線池
      其API提供了比較全面的Redis命令的支援,相比於其他Redis 封裝框架更加原生
      Jedis中的方法呼叫是比較底層的暴露的Redis的API,Java方法基本和Redis的API保持著一致
      使用阻塞的I/O,方法呼叫同步,程式流需要等到socket處理完I/O才能執行,不支援非同步操作
      • lettuce
      高階Redis客戶端,用於執行緒安全同步,非同步響應
      基於Netty的的事件驅動,可以在多個執行緒間併發訪問, 通過非同步的方式可以更好的利用系統資源

第2集 新版SpringBoot2.X專案建立

簡介:新版SpringBoot2.X專案建立

第3集SpringBoot2.x實戰整合Redis客戶端+單元測試

簡介:SpringBoot2.x整合Redis客戶端+單元測試

  • 在SpringBoot整合Redis很簡單

    • SpringData介紹

      • 操作mysql/redis/elasticseatch
      • SpringDataRedis是專門操作redis的依賴
    • 新增依賴 spring-boot-starter-data-redis

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

    • Springboot2後預設使用Lettuce作為訪問redis的客戶端

    • 舊版本lettuce存在堆外記憶體溢位的bug, 5.3版本修復了這個bug, 我們是用 6.1

    • 很多同學沒產生原因

      • 併發量不高
      • 記憶體足夠大,沒發生問題就又釋出更新了
    • 解決方式

      • 升級版本
      • 換jedis

第4集 SpringDataRedis的RedisTemplate講解介紹

簡介:SpringDataRedis配置RedisTemplate介紹

  • RedisTemplate介紹

    • ValueOperations:簡單K-V操作
    • SetOperations:set型別資料操作
    • ZSetOperations:zset型別資料操作
    • HashOperations:針對map型別的資料操作
    • ListOperations:list型別的資料操作
  • RedisTemplate和StringRedisTemplate的區別

    • StringRedisTemplate繼承RedisTemplate

    • 兩者的資料是不共通的(預設的序列化機制導致key不一樣)

    • StringRedisTemplate預設採用的是String的序列化策略

    • RedisTemplate預設採用的是JDK的序列化策略,會將資料先序列化成位元組陣列然後在存入Redis資料庫

    • 總結

      • 當redis資料庫裡面本來操作的是字串資料的時候,那使用StringRedisTemplate即可
      • 資料是複雜的物件型別,那麼使用RedisTemplate是更好的選擇
  • 操作

    • String結構

      • 儲存字串
      • 儲存物件

第5集 RedisTemplate的序列和反序列化機制講解

簡介:RedisTemplate的序列和反序列化機制講解

  • 上集問題

    • 同個key為啥獲取不到值,核心就是序列化機制導致key不一樣
  • 什麼是序列化

    • 把物件轉換為位元組序列的過程稱為物件的序列化。

    • 把位元組序列恢復為物件的過程稱為物件的反序列化。

    • 物件的序列化主要有兩種用途

      • 把物件的位元組序列永久地儲存到硬碟上,通常存放在一個檔案中
      • 在網路上傳送物件的位元組序列。
  • Redis為什麼要序列化

    • 效能可以提高,不同的序列化方式效能不一樣

    • 視覺化工具更好檢視

      • 採用預設的jdk方式會亂碼(POJO類需要實現Serializable介面)
      • 採用JSON方式則不用,且視覺化工具更好檢視
  • 自定義redis序列化方式,提供了多種可選擇策略

    • JdkSerializationRedisSerializer

      • POJO物件的存取場景,使用JDK本身序列化機制
      • 預設機制 ObjectInputStream/ObjectOutputStream進行序列化操作
    • StringRedisSerializer

      • Key或者value為字串
    • Jackson2JsonRedisSerializer

      • 利用jackson-json工具,將pojo例項序列化成json格式儲存
    • GenericFastJsonRedisSerializer

      • 另一種javabean與json之間的轉換,同時也需要指定Class型別
    • ...

第6集 RedisTemplate 序列化機制配置實戰

簡介:自定義序列化和反序列化機制配置實戰

  • 配置實戰
@Configuration
public class RedisTemplateConfiguration {
   /**
   * @param redisConnectionFactory
   * @return
   */
   @Bean
   public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
     RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
     redisTemplate.setConnectionFactory(redisConnectionFactory);
     // 使用Jackson2JsonRedisSerialize 替換預設序列化
     Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
     ObjectMapper objectMapper = new ObjectMapper();
     objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
     jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
     // 設定key和value的序列化規則
     redisTemplate.setKeySerializer(new StringRedisSerializer());
     redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
     // 設定hashKey和hashValue的序列化規則
     redisTemplate.setHashKeySerializer(new StringRedisSerializer());
     redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
     // 設定支援事物
     //redisTemplate.setEnableTransactionSupport(true);
     redisTemplate.afterPropertiesSet();
     return redisTemplate;
   }
}

第7集 SpringBoot整合Jedis+Lettuce客戶端連線池配置實戰

簡介:SpringBoot整合Jedis+Lettuce客戶端連線池配置實戰

  • 基於SpringDataRedis可以快速替換底層實現

    • Lettuce連線池介紹(新增連線池)
      <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-pool2</artifactId>
        </dependency>
    # 連線池最大連線數(使用負值表示沒有限制)
    spring.redis.lettuce.pool.max-active = 10
    # 連線池中的最大空閒連線
    spring.redis.lettuce.pool.max-idle = 10
    # 連線池中的最小空閒連線
    spring.redis.lettuce.pool.min-idle = 0
    # 連線池最大阻塞等待時間(使用負值表示沒有限制)
    spring.redis.lettuce.pool.max-wait= -1ms
    #指定客戶端
    spring.redis.client-type = lettuce
    • Jedis連線池介紹(可以不排除lettuce依賴包)
      <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>
    
    
        <!--不用指定版本號,本身spring-data-redis裡面有-->
        <dependency>
          <groupId>redis.clients</groupId>
          <artifactId>jedis</artifactId>
        </dependency>
    
    
    <dependency>
        <groupId>org.apache.commons</groupId>
          <artifactId>commons-pool2</artifactId>
          <version>2.6.1</version>
      </dependency>
    # 連線池最大連線數(使用負值表示沒有限制)
    spring.redis.jedis.pool.max-active = 10
    # 連線池中的最大空閒連線
    spring.redis.jedis.pool.max-idle = 10
    # 連線池中的最小空閒連線
    spring.redis.jedis.pool.min-idle = 0
    # 連線池最大阻塞等待時間(使用負值表示沒有限制)
    spring.redis.jedis.pool.max-wait= -1ms
    #指定客戶端
    spring.redis.client-type = jedis
  • 斷點除錯 redisTemplate的connectionFactory實現