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

原文地址:https://www.cnblogs.com/wgty/p/12810482.html