环境说明: Windows10、IntelliJ IDEA、SpringBoot 2.1.2.RELEASE


SpringBoot整合Redis:

第一步:在pom.xm两种引入Redis依赖支持

<!-- 引入Redis支持 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

第二步:在系统配置文件中配置Redis信息

# 单机版的redis可以这么连接
#spring.redis.host=192.168.1.108
#spring.redis.port=6379

# 对于单机版的Redis,可以使用此参数指定(数据库index),操作使用哪一个数据库
# Redis支持多个数据库(默认是16个,可通过配置来修改数据库数量),并且每个数据库的数据是隔离的,不能
# 共享,并且基于单机才有,如果是集群就没有数据库的概念,集群只有一个db0数据库。
#spring.redis.database=3



# redis集群
spring.redis.cluster.nodes = 10.8.109.24:6379, 10.8.109.36:6379, 10.8.109.49:6379, 10.8.109.24:6380, 10.8.109.36:6380, 10.8.109.49:6380

# 如果redis需要登录密码的话,需要给出
spring.redis.password = ds123

Redis模板:

      以前我们操作Redis都是直接使用Lettuce或Jedis等对Redis进行操作,不过后来spring-boot-starter-data-redis模板块儿项目对Lettuce、Jedis进行了封装改进,对外提供了一些操作Redis的模板,现在如果是SpringBoot的项目,一般都是直接使用模板进行Redis操作。

       spring-boot-starter-data-redis给我们提供了好几个Redis操作模板,如: RedisTemplate、StringRedisTemplate、ReactiveRedisTemplate、  ReactiveStringRedisTemplate、RedisKeyValueTemplate等。其中    RedisTemplate和StringRedisTemplate是最常用的模板。

SpringBoot默认注入的模板:

        RedisTemplate和StringRedisTemplate是最常用的模板;常用到甚至在SpringBoot中的spring-boot-autoconfigure模块儿下,都有一个配置类为我们默认注入了RedisTemplate与StringRedisTemplate:

springboot 集成两个redis配置 springboot连接多个redis_Java使用Redis

上图中各注解说明:

  • @Configuration:表明这是一个配置类,并尝试注入Spring容器。
  • @ConditionalOnClass(RedisOperations.class):当classpath下存在RedisOperations类时,被@ConditionalOnClass注解注解了的类,才有资格注入Spring容器; 否者无资格注入Spring容器。
  • @EnableConfigurationProperties(RedisProperties.class):将被@ConfigurationProperties注解注解了的RedisProperties类注入为Spring容器的Bean。
  • @Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class }):注入LettuceConnectionConfiguration 与JedisConnectionConfiguration为Spring容器的Bean。
  • @Bean:尝试将实例注入Spring容器。
  • @ConditionalOnMissin:当容器中不存在类的实例时,被@ConditionalOnMissin注解注解了的类或被@ConditionalOnMissin注解注解了的方法的返回的实例,才有资格注入Spring容器; 否者无资格注入Spring容器。                      
    注:还可通过设置属性值,如name属性值等,来进一步添加条件成立的约束条件。

简单来说,即:
       当SpringBoot中引入了对Redis的支持且用户没有主动注入RedisTemplate和StringRedisTemplate模板时,SpringBoot才会往Spring中注入默认的RedisTemplate和StringRedisTemplate模板。


Redis模板使用示例:

默认模板的使用方式很简单,如:

springboot 集成两个redis配置 springboot连接多个redis_SpringBoot集成Redis_02

运行测试类后,我们使用RedisDesktopManager工具连接Redis进行查看:

  • RedisTemplate<Object, Object>模板的存储结果为:

springboot 集成两个redis配置 springboot连接多个redis_SpringBoot整合Redis_03

说明:RedisTemplate<Object, Object>模板的存储结果“乱码”了,是因为RedisTemplate<Object, Object>模板的
           默认的各种key-value序列化器(keySerializer、valueSerializer、hashKeySerializer、hashValueSerializer)
           均采用的是JdkSerializationRedisSerializer。

  • StringRedisTemplate模板的存储结果为:

springboot 集成两个redis配置 springboot连接多个redis_Java使用Redis_04

说明:StringRedisTemplate模板的存储结果未乱码,是因为StringRedisTemplate模板的默认的各种key-value序
           列化器(keySerializer、valueSerializer、hashKeySerializer、hashValueSerializer)均采用的是
           StringRedisSerializer.UTF_8字符集的StringRedisSerializer序列化器。

注入自定义模板及使用示例:

说明:从上面,我们知道:默认的RedisTemplate<Object, Object>模板的序列化器会导致乱码,所以我们可以主动
           注入一个自定义的RedisTemplate模板。

准备工作:因为下面我们自定义的模板中用到了Jackson2JsonRedisSerializer序列化器,所以需要引
                  入相关的依赖,本人这里直接引入:

<!--
引入spring-boot-starter-web依赖。

注:spring-boot-starter-web本身依赖有很多其他依赖,spring-boot-starter-json就是其一,
   其实这里需要的也只是spring-boot-starter-json而已;不过考虑到spring-boot-starter-web的常用性,
  所以这里干脆直接引入了pring-boot-starter-web依赖
注:如果不引入spring-boot-starter-web的话,那么这里需要单独引入spring-boot-starter-json依赖
-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

注入自定义的RedisTemplate模板:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * 定制化RedisTemplate模板
 *
 * @author JustryDeng
 * @date 2019/4/11 16:26
 */
@Configuration
public class MyRedisTemplate {

    @Bean
    @SuppressWarnings("unchecked")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        // 这里key采用String
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        // 设置key的 序列化 器
        // 注:RedisTemplate对应的反序列化器与序列化器 一致,设置了序列化器就相当于设置了反序列化起
        StringRedisSerializer keySerializer = new StringRedisSerializer();
        template.setKeySerializer(keySerializer);
        template.setHashKeySerializer(keySerializer);
        //设置value的 序列化 器
        //注:RedisTemplate对应的反序列化器与序列化器 一致,设置了序列化器就相当于设置了反序列化起
        Jackson2JsonRedisSerializer valueSerializer
                = new Jackson2JsonRedisSerializer(Object.class);
        template.setValueSerializer(valueSerializer);
        template.setHashValueSerializer(valueSerializer);
        template.afterPropertiesSet();
        return template;
    }
}

注:如果需要注入自定义的StringRedisTemplate的话,就按照上图中相同的方式注入即可,不过由于默
       认的StringRedisTemplate模板本身默认使用的就是StringRedisSerializer.UTF_8字符集的
       StringRedisSerializer序列化器,所以对于StringRedisTemplate,我们可以直接使用SpringBoot为
       我们默认注入的即可。

使用自定义的RedisTemplate模板示例:

springboot 集成两个redis配置 springboot连接多个redis_Redis的使用_05

运行完上图中的特使方法后,我们使用RedisDesktopManager工具连接Redis进行查看:

springboot 集成两个redis配置 springboot连接多个redis_Java使用Redis_06

可以看见,使用了我们自定义的RedisTemplate模板并指定序列化器后,可以直观的观察数据了。

默认的StringRedisTemplate模板使用示例:

存储前与取出后都手动进行对象字符串间转换:

准备工作:引入阿里的Fastjosn依赖(本人以Fastjson为JSON格式化工具):

<!-- fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.27</version>
</dependency>

使用默认的StringRedisTemplate示例:

import com.alibaba.fastjson.JSON;
import com.model.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisApplicationTests {

    @Autowired
    StringRedisTemplate stringRedisTemplate;


    /**
     * 主动将对象转换为json字符串,在使用StringRedisTemplate模板进行存储与读取
     *
     * @date 2019/4/11 15:00
     */
    @Test
    public void originStringRedisTemplateTest() {
        User user = User.builder().name("咿呀咔咔").age(25).motto("我是一只小小小小鸟~").gender("男").build();
        // 将要放入缓存的对象先转换为JSON字符串
        String jsonStr = com.alibaba.fastjson.JSON.toJSONString(user);
        // 放入Redis
        stringRedisTemplate.opsForValue().set("ds-key", jsonStr);
        // 从Redis中获取
        String getstr = stringRedisTemplate.opsForValue().get("ds-key");
        // 将获取到的字符串转换为对应的对象
        // 注意:JSON.parseObject此方法进行字符串对象转换时,依赖于实体模型的构造方法;如果
        //      使用了lombok的@Builder注解,那么最好在补一个全餐构造,否则此步骤可能出现异常
        User getUser = JSON.parseObject(getstr, User.class);
        System.out.println(getUser);
    }

}

运行完上图中的特使方法后,我们使用RedisDesktopManager工具连接Redis进行查看:

springboot 集成两个redis配置 springboot连接多个redis_SpringBoot整合Redis_07

注:相比起我们使用自定义的RedisTemplate模板来讲,个人感觉使用StringRedisTemplate更顺手,因为放进去的、取
       出来的就是json字符串,将json字符串转换为对象更方便。

注:现在主流的JSON格式化工具有阿里的Fastjson、谷歌的Gson等;Fastjson效果更高,不过如果是非常复杂的对象
       的话Fastjson的转换结果可能并不如人所想,除非你编写的实体类模型是严格符合阿里巴巴规范编写的;Gson虽
       然再转换速率上没有Fastjson快,但是在转换结果准确性方面却做得非常好,项目中用那种取决于自己项目情况。


RedisTemplate与StringRedisTemplate常用方法:

声明:本文主要介绍Redis模板相关知识以及对模板进行了简单的使用示例,下面再分享一张整理自
           网友的Redis模板常用方法图,更多细节用
           法请查阅相关文档。

常用方法:

springboot 集成两个redis配置 springboot连接多个redis_Java操作Redis_08

P.S.虽然整理上图内容并不会太费劲,但是笔者今天属实有点头昏,就不整理了,直接从网友那里摘录吧。

^_^ 如有不当之处,欢迎指正                    

^_^ 测试代码托管链接 
               https://github.com/JustryDeng/CommonRepository