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适合用来存储复杂的对象类型的数据

  • 相关阅读:
    OSCP Learning Notes Buffer Overflows(3)
    OSCP Learning Notes Buffer Overflows(5)
    OSCP Learning Notes Exploit(3)
    OSCP Learning Notes Exploit(4)
    OSCP Learning Notes Exploit(1)
    OSCP Learning Notes Netcat
    OSCP Learning Notes Buffer Overflows(4)
    OSCP Learning Notes Buffer Overflows(1)
    OSCP Learning Notes Exploit(2)
    C++格式化输出 Learner
  • 原文地址:https://www.cnblogs.com/wgty/p/12810482.html
Copyright © 2011-2022 走看看