1. 程式人生 > 實用技巧 >Spring Boot 2.x 版本預設Redis客戶端已經使用Lettuce

Spring Boot 2.x 版本預設Redis客戶端已經使用Lettuce

一、Redis的常用三個java客戶端:Jedis,Redisson,Lettuce

Jedis:是Redis的Java實現客戶端,提供了比較全面的Redis命令的支援,使用阻塞的I/O,程式流需要等到sockets處理完I/O才能執行,不支援非同步。Jedis客戶端例項不是執行緒安全的,所以需要通過連線池來使用Jedis。

Redisson:Redisson實現了分散式和可擴充套件的Java資料結構,和Jedis相比,功能較為簡單,不支援字串操作,不支援排序、事務、管道、分割槽等Redis特性。Redisson的宗旨是促進使用者對Redis的關注分離,從而讓使用者能夠將精力更集中地放在處理業務邏輯上。基於Netty框架的事件驅動的通訊層,其方法呼叫是非同步的。Redisson的API是執行緒安全的。

Lettuce:高階Redis客戶端,用於執行緒安全同步,非同步和響應使用,支援叢集,Sentinel,管道和編碼器,主要在一些分散式快取框架上使用比較多。基於Netty框架的事件驅動的通訊層,其方法呼叫是非同步的。Lettuce的API是執行緒安全的。

二、Spring Boot預設整合的Redis客戶端

Jedis 和 Lettuce 是 Java 操作 Redis 的客戶端。在 Spring Boot 1.x 版本預設使用的是 Jedis ,而在 Spring Boot 2.x 版本預設使用的就是Lettuce。關於 Jedis 跟 Lettuce 的區別如下:

  • Jedis在實現上是直接連線的redis server,如果在多執行緒環境下是非執行緒安全的,這個時候只有使用連線池,為每個Jedis例項增加物理連線
  • Lettuce的連線是基於Netty的,連線例項(StatefulRedisConnection)可以在多個執行緒間併發訪問,應為StatefulRedisConnection是執行緒安全的,所以一個連線例項(StatefulRedisConnection)就可以滿足多執行緒環境下的併發訪問,當然這個也是可伸縮的設計,一個連線例項不夠的情況也可以按需增加連線例項。
    @Bean
    public RedisConnectionFactory redisConnectionFactory(RedisProperties redisProperties) {
        RedisStandaloneConfiguration configuration =  new RedisStandaloneConfiguration();
        configuration.setHostName(redisProperties.getHost());
        configuration.setPort(redisProperties.getPort());
        configuration.setPassword(redisProperties.getPassword());
        return new LettuceConnectionFactory(configuration);
    }

相關demo

hanko/database​gitee.com

三、Redis記憶體優化

    • Redis記憶體淘汰策略
    • Redis欄位增加過期時間
    • 使用Google Snappy對儲存資料進行壓縮後儲存。同時可以直接儲存byte[]。