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

Redis 簡介

什麼是 Redis

Redis 是目前使用的很是普遍的免費開源內存數據庫,是一個高性能的 key-value 數據庫。html

Redis 與其餘 key-value 緩存(如 Memcached )相比有如下三個特色:java

1.Redis 支持數據的持久化,它能夠將內存中的數據保存在磁盤中,重啓的時候能夠再次加載進行使用。
2.Redis 不單單支持簡單的 key-value 類型的數據,同時還提供 list,set,zset,hash 等數據結構的存儲。
3.Redis 支持數據的備份,即 master-slave 模式的數據備份。

Redis 優點以下:git

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 客戶端。github

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

Lettuce 與 Jedis 比較

LettuceJedis 的都是鏈接 Redis Server的客戶端。web

Jedis 在實現上是直連 redis server,多線程環境下非線程安全,除非使用鏈接池,爲每一個 redis實例增長物理鏈接。

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

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

2. Lettuce 集成 Redis 服務

導入依賴

因爲 Spring Boot 2.X 默認集成了 Lettuce ,因此無需導入。spring

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());
    }

}

執行結果以下:

獲得咱們預期的結果。apache

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;
    }

}

單元測試同上

出現預期結果。api

總結

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

示例代碼

github

碼雲

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

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

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

若是文章對您有幫助,請掃碼關注下個人公衆號,文章持續更新中...

相關文章
相關標籤/搜索