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

环境说明 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:

上图中各注解说明

  • @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模板使用示例

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

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

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

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

  • StringRedisTemplate模板的存储结果为:

说明: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模板示例

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

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

默认的StringRedisTemplate模板使用示例

       使用RedisTemplate模板(无论是默认的还是自定义的)后,取出来的是一个Object,如果需要转换为我们需要的类型的话,还需要再进行处理,那这样还不如直接使用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进行查看:

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

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


RedisTemplate与StringRedisTemplate常用方法

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

常用方法

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

 

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

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

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

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

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!以下是一个简单的示例,演示了如何在Spring Boot项目中使用Redis。 首先,确保你的Spring Boot项目已经添加了对Redis的依赖。你可以在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 接下来,在你的application.properties(或application.yml)文件中配置Redis连接信息: ```properties spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.password=yourpassword # 如果有密码的话 ``` 接下来,创建一个Redis配置类,用于配置RedisTemplate和连接工厂等信息。例如,创建一个名为RedisConfig的类: ```java @Configuration public class RedisConfig { @Bean public RedisConnectionFactory redisConnectionFactory() { LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(); // 设置连接信息(可根据需要进行自定义配置) connectionFactory.setHostName("127.0.0.1"); connectionFactory.setPort(6379); connectionFactory.setPassword("yourpassword"); // 如果有密码的话 return connectionFactory; } @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); // 设置key和value的序列化器 template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; } } ``` 现在,你可以在你的服务类或控制器类中注入RedisTemplate使用它来操作Redis。例如,创建一个名为RedisService的类: ```java @Service public class RedisService { @Autowired private RedisTemplate<String, Object> redisTemplate; public void set(String key, Object value) { redisTemplate.opsForValue().set(key, value); } public Object get(String key) { return redisTemplate.opsForValue().get(key); } public boolean delete(String key) { return redisTemplate.delete(key); } } ``` 现在,你可以在你的控制器或其他地方使用RedisService来操作Redis。例如,在一个名为ExampleController的类中: ```java @RestController public class ExampleController { @Autowired private RedisService redisService; @GetMapping("/set") public String set() { redisService.set("key", "value"); return "Set successfully"; } @GetMapping("/get") public String get() { Object value = redisService.get("key"); return "Value: " + value; } @GetMapping("/delete") public String delete() { boolean result = redisService.delete("key"); return "Delete result: " + result; } } ``` 这样,你就可以通过访问`/set`、`/get`和`/delete`接口来设置、获取和删除Redis中的值了。 希望这个示例对你有所帮助!如果有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值