SpringBoot整合Redis并示例使用模板操作

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


SpringBoot整合Redis

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



    org.springframework.boot
    spring-boot-starter-data-redis

第二步在系统配置文件中配置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并示例使用模板操作_第1张图片

上图中各注解说明

  • @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并示例使用模板操作_第2张图片

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

  • RedisTemplate模板的存储结果为:

SpringBoot整合Redis并示例使用模板操作_第3张图片

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

  • StringRedisTemplate模板的存储结果为:

SpringBoot整合Redis并示例使用模板操作_第4张图片

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

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

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

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



    org.springframework.boot
    spring-boot-starter-web

注入自定义的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 redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        // 这里key采用String
        RedisTemplate 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并示例使用模板操作_第5张图片

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

SpringBoot整合Redis并示例使用模板操作_第6张图片

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

默认的StringRedisTemplate模板使用示例

       使用RedisTemplate模板(无论是默认的还是自定义的)后,取出来的是一个Object,如果需要转换为我们需要的类型的话,还需要再进行处理,那这样还不如直接使用StringRedisTemplate模板,存储前与取出后都手动进行对象字符串间转换:

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



    com.alibaba
    fastjson
    1.2.27

使用默认的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并示例使用模板操作_第7张图片

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

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


RedisTemplate与StringRedisTemplate常用方法

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

常用方法

SpringBoot整合Redis并示例使用模板操作_第8张图片

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

 

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

^_^ 参考链接
              https://www.cnblogs.com/slowcity/p/9002660.html
              https://www.cnblogs.com/zeng1994...323.html

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

^_^ 本文已经被收录进《程序员成长笔记(一)》,笔者JustryDeng

你可能感兴趣的:(Redis)