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


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


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.在項目中添加依賴

<code><project>    <modelversion>4.0.0/<modelversion>    <parent>        <groupid>org.springframework.boot/<groupid>        <artifactid>spring-boot-starter-parent/<artifactid>        <version>2.1.9.RELEASE/<version>        <relativepath>     /<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>                <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>/<code>

查看 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 比較

Lettuce 和 Jedis 的都是連接 Redis Server的客戶端。

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


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


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

2. Lettuce 集成 Redis 服務

導入依賴

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

application.properties配置文件

<code>################ 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 線程池設置 ############### 連接池最大連接數(使用負值表示沒有限制) 默認 8spring.redis.lettuce.pool.max-active=8# 連接池最大阻塞等待時間(使用負值表示沒有限制) 默認 -1spring.redis.lettuce.pool.max-wait=-1# 連接池中的最大空閒連接 默認 8spring.redis.lettuce.pool.max-idle=8# 連接池中的最小空閒連接 默認 0spring.redis.lettuce.pool.min-idle=0/<code>

自定義 RedisTemplate

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

<code>@Configurationpublic class LettuceRedisConfig {    @Bean    public RedisTemplate<string> redisTemplate(LettuceConnectionFactory connectionFactory) {        RedisTemplate<string> redisTemplate = new RedisTemplate<>();        redisTemplate.setKeySerializer(new StringRedisSerializer());        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());        redisTemplate.setConnectionFactory(connectionFactory);        return redisTemplate;    }}/<string>/<string>/<code>

序列化實體類

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

單元測試

<code>@RunWith(SpringRunner.class)@SpringBootTestpublic class SpringBootRedisApplicationTests {    @Autowired    private RedisTemplate<string> strRedisTemplate;    @Autowired    private RedisTemplate<string> 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());    }}/<string>/<string>/<code>

執行結果如下:

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

得到我們預期的結果。

3.Jedis 集成 Redis 服務

pom 文件

<code><project>    <modelversion>4.0.0/<modelversion>    <parent>        <groupid>org.springframework.boot/<groupid>        <artifactid>spring-boot-starter-parent/<artifactid>        <version>2.1.9.RELEASE/<version>        <relativepath>     /<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>                <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>                <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>/<code>

application.properties配置文件

<code>################ 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 線程池設置 ############### 連接池最大連接數(使用負值表示沒有限制) 默認 8spring.redis.jedis.pool.max-active=8# 連接池最大阻塞等待時間(使用負值表示沒有限制) 默認 -1spring.redis.jedis.pool.max-wait=-1# 連接池中的最大空閒連接 默認 8spring.redis.jedis.pool.max-idle=8# 連接池中的最小空閒連接 默認 0spring.redis.jedis.pool.min-idle=0/<code>

JedisRedisConfig

<code>@Configurationpublic 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> redisTemplate(JedisConnectionFactory connectionFactory) {        RedisTemplate<string> redisTemplate = new RedisTemplate<>();        redisTemplate.setKeySerializer(new StringRedisSerializer());        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());        redisTemplate.setConnectionFactory(jedisConnectionFactory(jedisPoolConfig()));        return redisTemplate;    }}/<string>/<string>/<code>

單元測試同上

出現預期結果。

總結

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


分享到:


相關文章: