Spring Boot 2.X(六):Spring Boot 集成Redis

  • 2019 年 10 月 13 日
  • 筆記

Redis 簡介

什麼是 Redis

Redis 是目前使用的非常廣泛的免費開源記憶體資料庫,是一個高性能的 key-value 資料庫。

Redis 與其他 key-value 快取(如 Memcached )相比有以下三個特點:

1.Redis 支援數據的持久化,它可以將記憶體中的數據保存在磁碟中,重啟的時候可以再次載入進行使用。
2.Redis 不僅僅支援簡單的 key-value 類型的數據,同時還提供 list,set,zset,hash 等數據結構的存儲。
3.Redis 支援數據的備份,即 master-slave 模式的數據備份。

Redis 優勢如下:

1.性能極高。Redis 能讀的速度是 110000 次/s,寫的速度是 81000 次/s。
2.豐富的數據類型。Redis 支援二進位案例的 Strings,Lists,Sets 及 Ordered Sets 數據類型操作。
3.原子性。Redis 所有的操作都是原子性的,意思是要麼成功執行要麼失敗完全不執行。單個操作是原子性的,多個操作也是,通過 MULTI 和 EXEC 指令抱起來。
4.豐富的特性。Redis 還支援 publish/subscribe,通知,key 過期等特性。

Spring Boot 集成 Redis

1.在項目中添加依賴

<?xml version="1.0" encoding="UTF-8"?>  <project xmlns="http://maven.apache.org/POM/4.0.0"      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">      <modelVersion>4.0.0</modelVersion>      <parent>          <groupId>org.springframework.boot</groupId>          <artifactId>spring-boot-starter-parent</artifactId>          <version>2.1.9.RELEASE</version>          <relativePath /> <!-- lookup parent from repository -->      </parent>      <groupId>cn.zwqh</groupId>      <artifactId>spring-boot-redis</artifactId>      <version>0.0.1-SNAPSHOT</version>      <name>spring-boot-redis</name>      <description>spring-boot-redis</description>        <properties>          <java.version>1.8</java.version>      </properties>        <dependencies>            <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-web</artifactId>          </dependency>            <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-test</artifactId>              <scope>test</scope>          </dependency>            <!-- Redis -->          <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-data-redis</artifactId>          </dependency>        </dependencies>        <build>          <plugins>              <plugin>                  <groupId>org.springframework.boot</groupId>                  <artifactId>spring-boot-maven-plugin</artifactId>              </plugin>          </plugins>      </build>    </project>  

查看 jar 包時發現,Spring Data Redis 下 org.springframework.data.redis.connection 包路徑下面默認有兩個包 jedis 和 lettuce,這說明 Spring Boot 已經默認包裝適配了這兩個 Redis 客戶端。

在 springboot 1.5.x版本的默認的Redis客戶端是 Jedis實現的,springboot 2.x版本中默認客戶端是用 lettuce實現的。

Lettuce 與 Jedis 比較

LettuceJedis 的都是連接 Redis Server的客戶端。

Jedis 在實現上是直連 redis server,多執行緒環境下非執行緒安全,除非使用連接池,為每個 redis實例增加物理連接。


Lettuce 是 一種可伸縮,執行緒安全,完全非阻塞的Redis客戶端,多個執行緒可以共享一個RedisConnection,它利用Netty NIO 框架來高效地管理多個連接,從而提供了非同步和同步數據訪問方式,用於構建非阻塞的反應性應用程式。


下面我們分別使用 Lettuce 和 Jedis 來集成 Redis 服務

2. Lettuce 集成 Redis 服務

導入依賴

由於 Spring Boot 2.X 默認集成了 Lettuce ,所以無需導入。

application.properties配置文件

################ Redis 基礎配置 ##############  # Redis資料庫索引(默認為0)  spring.redis.database=0  # Redis伺服器地址  spring.redis.host=127.0.0.1  # Redis伺服器連接埠  spring.redis.port=6379  # Redis伺服器連接密碼(默認為空)  spring.redis.password=zwqh  # 鏈接超時時間 單位 ms(毫秒)  spring.redis.timeout=3000  ################ Redis 執行緒池設置 ##############  # 連接池最大連接數(使用負值表示沒有限制) 默認 8  spring.redis.lettuce.pool.max-active=8  # 連接池最大阻塞等待時間(使用負值表示沒有限制) 默認 -1  spring.redis.lettuce.pool.max-wait=-1  # 連接池中的最大空閑連接 默認 8  spring.redis.lettuce.pool.max-idle=8  # 連接池中的最小空閑連接 默認 0  spring.redis.lettuce.pool.min-idle=0  

自定義 RedisTemplate

默認情況下的模板只能支援 RedisTemplate<String,String>,只能存入字元串,很多時候,我們需要自定義 RedisTemplate ,設置序列化器,這樣我們可以很方便的操作實例對象。如下所示:

@Configuration  public class LettuceRedisConfig {        @Bean      public RedisTemplate<String, Serializable> redisTemplate(LettuceConnectionFactory connectionFactory) {          RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();          redisTemplate.setKeySerializer(new StringRedisSerializer());          redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());          redisTemplate.setConnectionFactory(connectionFactory);          return redisTemplate;      }  }

序列化實體類

public class UserEntity implements Serializable {        /**       *       */      private static final long serialVersionUID = 5237730257103305078L;        private Long id;      private String userName;      private String userSex;      public Long getId() {          return id;      }      public void setId(Long id) {          this.id = id;      }      public String getUserName() {          return userName;      }      public void setUserName(String userName) {          this.userName = userName;      }      public String getUserSex() {          return userSex;      }      public void setUserSex(String userSex) {          this.userSex = userSex;      }    }

單元測試

  @RunWith(SpringRunner.class)  @SpringBootTest  public class SpringBootRedisApplicationTests {        @Autowired      private RedisTemplate<String, String> strRedisTemplate;      @Autowired      private RedisTemplate<String, Serializable> serializableRedisTemplate;        @Test      public void testString() {          strRedisTemplate.opsForValue().set("strKey", "zwqh");          System.out.println(strRedisTemplate.opsForValue().get("strKey"));      }        @Test      public void testSerializable() {          UserEntity user=new UserEntity();          user.setId(1L);          user.setUserName("朝霧輕寒");          user.setUserSex("男");          serializableRedisTemplate.opsForValue().set("user", user);          UserEntity user2 = (UserEntity) serializableRedisTemplate.opsForValue().get("user");          System.out.println("user:"+user2.getId()+","+user2.getUserName()+","+user2.getUserSex());      }    }

執行結果如下:

得到我們預期的結果。

3.Jedis 集成 Redis 服務

pom 文件

<?xml version="1.0" encoding="UTF-8"?>  <project xmlns="http://maven.apache.org/POM/4.0.0"      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">      <modelVersion>4.0.0</modelVersion>      <parent>          <groupId>org.springframework.boot</groupId>          <artifactId>spring-boot-starter-parent</artifactId>          <version>2.1.9.RELEASE</version>          <relativePath /> <!-- lookup parent from repository -->      </parent>      <groupId>cn.zwqh</groupId>      <artifactId>spring-boot-redis</artifactId>      <version>0.0.1-SNAPSHOT</version>      <name>spring-boot-redis</name>      <description>spring-boot-redis</description>        <properties>          <java.version>1.8</java.version>      </properties>        <dependencies>            <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-web</artifactId>          </dependency>            <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-test</artifactId>              <scope>test</scope>          </dependency>            <!-- Redis -->          <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-data-redis</artifactId>              <exclusions>                  <!-- 排除lettuce包 -->                  <exclusion>                      <groupId>io.lettuce</groupId>                      <artifactId>lettuce-core</artifactId>                  </exclusion>              </exclusions>          </dependency>          <!-- 添加jedis客戶端 -->          <dependency>              <groupId>redis.clients</groupId>              <artifactId>jedis</artifactId>          </dependency>        </dependencies>        <build>          <plugins>              <plugin>                  <groupId>org.springframework.boot</groupId>                  <artifactId>spring-boot-maven-plugin</artifactId>              </plugin>          </plugins>      </build>    </project>  

application.properties配置文件

################ Redis 基礎配置 ##############  # Redis資料庫索引(默認為0)  spring.redis.database=0  # Redis伺服器地址  spring.redis.host=127.0.0.1  # Redis伺服器連接埠  spring.redis.port=6379  # Redis伺服器連接密碼(默認為空)  spring.redis.password=zwqh  # 鏈接超時時間 單位 ms(毫秒)  spring.redis.timeout=3000  ################ Redis 執行緒池設置 ##############  # 連接池最大連接數(使用負值表示沒有限制) 默認 8  spring.redis.jedis.pool.max-active=8  # 連接池最大阻塞等待時間(使用負值表示沒有限制) 默認 -1  spring.redis.jedis.pool.max-wait=-1  # 連接池中的最大空閑連接 默認 8  spring.redis.jedis.pool.max-idle=8  # 連接池中的最小空閑連接 默認 0  spring.redis.jedis.pool.min-idle=0

JedisRedisConfig

@Configuration  public class JedisRedisConfig {        @Value("${spring.redis.database}")      private int database;      @Value("${spring.redis.host}")      private String host;      @Value("${spring.redis.port}")      private int port;      @Value("${spring.redis.password}")      private String password;      @Value("${spring.redis.timeout}")      private int timeout;      @Value("${spring.redis.jedis.pool.max-active}")      private int maxActive;      @Value("${spring.redis.jedis.pool.max-wait}")      private long maxWaitMillis;      @Value("${spring.redis.jedis.pool.max-idle}")      private int maxIdle;      @Value("${spring.redis.jedis.pool.min-idle}")      private int minIdle;        /**       * 連接池配置資訊       */        @Bean      public JedisPoolConfig jedisPoolConfig() {          JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();          // 最大連接數          jedisPoolConfig.setMaxTotal(maxActive);          // 當池內沒有可用連接時,最大等待時間          jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);          // 最大空閑連接數          jedisPoolConfig.setMinIdle(maxIdle);          // 最小空閑連接數          jedisPoolConfig.setMinIdle(minIdle);          // 其他屬性可以自行添加          return jedisPoolConfig;      }        /**       * Jedis 連接       *       * @param jedisPoolConfig       * @return       */      @Bean      public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig) {          JedisClientConfiguration jedisClientConfiguration = JedisClientConfiguration.builder().usePooling()                  .poolConfig(jedisPoolConfig).and().readTimeout(Duration.ofMillis(timeout)).build();          RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();          redisStandaloneConfiguration.setHostName(host);          redisStandaloneConfiguration.setPort(port);          redisStandaloneConfiguration.setPassword(RedisPassword.of(password));          return new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration);      }        /**       * 快取管理器       *       * @param connectionFactory       * @return       */      @Bean      public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {          return RedisCacheManager.create(connectionFactory);      }        @Bean      public RedisTemplate<String, Serializable> redisTemplate(JedisConnectionFactory connectionFactory) {          RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();          redisTemplate.setKeySerializer(new StringRedisSerializer());          redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());          redisTemplate.setConnectionFactory(jedisConnectionFactory(jedisPoolConfig()));          return redisTemplate;      }    }

單元測試同上

出現預期結果。

總結

上面介紹了 Spring Boot 2.X 如何通過 Lettuce 和 Jedis 來集成 Redis 服務,按項目需求,我們也可以自定義操作類來實現數據操作。

示例程式碼

github

碼雲

非特殊說明,本文版權歸 朝霧輕寒 所有,轉載請註明出處.

原文標題:Spring Boot 2.X(六):Spring Boot 集成Redis

原文地址:https://www.zwqh.top/article/info/11