zoukankan      html  css  js  c++  java
  • Springboot项目整合Redis

      老早就想记录一下Springboot项目中整合Redis的过程,今天终于忍不住对它下手了(在整合Redis之前,需确保redis处于启动状态)

    在这里插入图片描述
       废话不多说,直接新建Springboot项目。

    Springboot整合Redis
    1.创建项目选择依赖 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20191121095803814.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjU1ODM1,size_16,color_FFFFFF,t_70) 2.在项目的pom.xml文件中手动引入`commons-pool2 `连接池依赖
      <!-- 引入连接池的依赖-->
        <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-pool2</artifactId>
          <version>2.7.0</version>
        </dependency>
    

    3.在application.properties配置文件中配置redis连接信息

    server:
      port: 8082
    
    spring:
      redis:
        database: 4 #使用redis中哪个库
        port: 6379 
        host:192.168.138.121
        password: 123456  #redis连接密码
        timeout: 60000  #连接超时时间
        lettuce: #由于Spring Boot2.x 的改动,连接池相关配置需要通过spring.redis.lettuce.pool或者 spring.redis.jedis.pool 进行配置
          pool:
            max-active: 200 #连接池最大连接数(使用负值表示没有限制) 默认8
            max-wait: -1 #连接池最大阻塞等待时间(使用负值表示没有限制)
            min-idle: 0 #连接池中的最小空闲连接
            max-idle: 10 #连接池中的最大空闲连接
    
    

    4.写一个测试controller(当然也可以用Junit启动进行测试,我个人习惯写个controller,通过浏览器访问进行测试)

    @RestController
    public class testController {
    
    	@Autowired
    	private StringRedisTemplate stringRedisTemplate;
    
    	/**
    	 *在redis中有两个模板可以使用,最后专门说明 
    	 */
    //	private RedisTemplate<Object, Object> redisTemplate;
    
    
    
    	@RequestMapping("/set")
    	@ResponseBody
    	public Object setValue() {
    		stringRedisTemplate.opsForValue().set("name", "zhangsan");
    		return "走了  set ";
    	}
    
    
    	@RequestMapping("/get")
    	@ResponseBody
    	public Object getValue() {
    
    		return stringRedisTemplate.opsForValue().get("name");
    	}
    
    
    }
    
    

    5.启动项目,首先访问localhost:8082//set,然后redis就会在4号库中以key value的形式将name 和 zhangsan存储起来。
    在这里插入图片描述
    6.下面看一下redis中的4号库是否存储了key为name,value为zhangsan的数据。我这里直接使用的是Redis Desktop Manager工具来操作的redis。这样方便我们查看redis中的值的存储情况。

    在这里插入图片描述
    7.从redis管理工具中我们可以看到4号库中确实存了一个key为name,value为zhangsan的一组数据。说明我们的reids集成正常。下面看一个get取值。
      在浏览器中访问localhost:8082//get,然后看看返回的结果。
    在这里插入图片描述
      返回结果正常。到这里,简单的redis集成OK了,下面说一下集成的过程中,有哪些点需要注意的。

    需要留意的点

      在前面创建项目的过程中,提到了Redis中默认是有两个模板可以使用,分别是StringRedisTemplateRedisTemplate,这个当我们在引入了Redis相关的依赖之后,在其自动配置类RedisAutoConfiguration中就可以看到(可以在idea中 搜索此配置类进行查看)。

    @Configuration(proxyBeanMethods = false)
    @ConditionalOnClass(RedisOperations.class)
    @EnableConfigurationProperties(RedisProperties.class)
    @Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
    public class RedisAutoConfiguration {
    
    	@Bean
    	@ConditionalOnMissingBean(name = "redisTemplate")
    	public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
    			throws UnknownHostException {
    		RedisTemplate<Object, Object> template = new RedisTemplate<>();
    		template.setConnectionFactory(redisConnectionFactory);
    		return template;
    	}
    
    	@Bean
    	@ConditionalOnMissingBean
    	public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory)
    			throws UnknownHostException {
    		StringRedisTemplate template = new StringRedisTemplate();
    		template.setConnectionFactory(redisConnectionFactory);
    		return template;
    	}
    
    }
    
    
    两种模板的区别
      实不相瞒,当年我在这里吃了不少泥,那时候公司项目紧张,老项目中直接封装了一个redis工具类,对于两种模板都有相应的数据操作方法封装,然后就老是搞混,比如用stringRedisTemplate模板存储的数据,最终在取值的时候用了redisTemplate模板去取值,老是取不到,但是明明我redis中已经存入值了。现在在这里记录一下两种模板的区别。

      StringRedisTemplate
      采用的String序列化方式,redis中存储的key和value都是可读的。
      在上面的代码中,我们使用的就是此模板来进行存值的,所以在redis中,我们能够很直观的看到key和value。
    在这里插入图片描述

      RedisTemplate
      采用的JDK序列化方式,将key和value序列化为字节数组之后,再存储到redis中,当取值的时候,再将redis中的值反序列化之后进行返回。

      我们在测试controller中,使用redisTemplate模板来存值,看一下redis中的值是什么款式

    @RestController
    public class testController {
    
    	@Autowired
    //	private StringRedisTemplate stringRedisTemplate;
    
    	/**
    	 *在redis中有两个模板可以使用,最后专门说明
    	 */
    	private RedisTemplate<Object, Object> redisTemplate;
    
    	@RequestMapping("/set")
    	@ResponseBody
    	public Object setValue() {
    		redisTemplate.opsForValue().set("name", "zhangsan");
    		return "走了  set ";
    	}
    
    
    	@RequestMapping("/get")
    	@ResponseBody
    	public Object getValue() {
    
    		return redisTemplate.opsForValue().get("name");
    	}
    
    
    }
    

    在这里插入图片描述
    总结:
      1.因为两种模板的序列化方式不同,所以存储的数据互不相同。也就是说:
       用RedisTemplate存的值不能用StringRedisTemplate来取值
       用StringRedisTemplate存的值不能用RedisTemplate来取值

      2.两种模板如何选择?
       StringRedisTemplate适合用来存储字符串类型的数据
       RedisTemplate适合用来存储复杂的对象类型的数据

  • 相关阅读:
    线程运行boost库在工作(22)任务之二
    vi 帮助文档 man vi
    跳槽关系三国演义告诉我们的60条真理
    后台端口虚拟主机wdcp的相关问题以及解决方法
    格式化字符串android 格式化时间
    对象查询HQL多表联合查询的问题
    myeclipse8.6中svn插件的安装
    乱码解决方法
    Restfull风格是什么意思?
    poj3013
  • 原文地址:https://www.cnblogs.com/wgty/p/12810482.html
Copyright © 2011-2022 走看看