springboot 整合redis(lettuce)
首先确保电脑上装了redis。最好能用redisDesktop查看一下数据情况
- redis是一款非常流行的Nosql数据库。redis的功能非常强大,因为Nosql在查询上的速度特别快。(在算法上的hash和数组查询的差距)在web上常用作缓存(消息队列等)。本文只介绍redis和springboot的集成,不介绍缓存部分下文将介绍缓存部分。
- 目前流行的redis集成到java环境有jedis和lettuce。在之前版本中jedis可能更受青睐。但是在springboot2.0之后官方推荐的默认就是lettuce连接。因为jedis数据池虽然线程安全,但是占用的资源较大,而lettuce基于netty和nio相关实现,性能更加强悍,占用的资源也比较少,并且使用起来也不难。
- redis默认有16个分区(表),不配置情况默认用0个
- 项目采取lettuce方式整合redis。lettuce性能更强点,喜欢jedis配合连接池也是线程安全的
- redis 默认五种基本类型:String,set,hash,zset(有序集合),list
- spring中redis 有StringRedisTemplate和RedisTemplate
- 对于StringRedisTemplate,继承RedisTemplate,只能存String类型的数据。不方面存对象,一般用的不是特别多(特定场景除外)。
- 比较麻烦,存入的key和value都是字符型。
- 对于RedisTemplate,默认是类型。如果不做配置,他会对key和value默认序列化成二进制文件看不懂。不利于观察。一般重新配置redisTeamplate的一个bean。设置这个bean的key,value, 以及hashkey等等的序列化方式。一般是key序列化为string,value序列化为json,这样,你就可以在存入对象时候它自动帮你序列化成字符或者json。方便观察。
- 对于整合redis你只需pom.xml引入相应依赖。在application.properties中填写相应配置
- 账号密码之类。在重写RedisTemplate这个bean。配置他的序列化规则。注意就是注入bean的时候名称要和重写的名一样。因为这个对象是 spring帮你生成好的给你使用。而如果你随便瞎起名字的话spring会根据原始重新生成对象。相当于引用未序列化的redisTemplate。
- 更多的用法请百度。如果要存对象,那么pojo一定要继承序列化。否则无法存入redis。至于redis缓存,将在整合Springcache中介绍
- 确保有无参构造方法和继承序列化!
springboot官方的整合redis这么说的
- You can also register an arbitrary number of beans that implement LettuceClientConfigurationBuilderCustomizer for more advanced customizations. If you use Jedis, JedisClientConfigurationBuilderCustomizer is also available.
- If you add your own @Bean of any of the auto-configured types, it replaces the default (except in the case of RedisTemplate, when the exclusion is based on the bean name, redisTemplate, not its type). By default, if commons-pool2 is on the classpath, you get a pooled connection factory.
*
项目的目录为
在这里插入图片描述
- 首先,在创建Springboot项目时候勾选redis选项或者在pom.xml中添加:
org.springframework.boot spring-boot-starter-data-redis org.apache.commons commons-pool2
- 在application.properties添加一下配置:
spring.redis.host=127.0.0.1spring.redis.password=spring.redis.port= 6379spring.redis.timeout=10000spring.cache.type=redis# Redis默认情况下有16个分片,这里配置具体使用的分片,默认是0spring.redis.database=2# 连接池最大连接数(使用负值表示没有限制) 默认 8spring.redis.lettuce.pool.max-active=8# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1spring.redis.lettuce.pool.max-wait=-1# 连接池中的最大空闲连接 默认 8spring.redis.lettuce.pool.max-idle=8# 连接池中的最小空闲连接 默认 0spring.redis.lettuce.pool.min-idle=0
- redis默认模板只能存储,你也可以用但是每次都要转成json字符串传输可能很麻烦,这样你可以重写一个模板程序自动加载,可以存 . 这是一个很重要的加载类,它声明redis存储类型:
import org.springframework.boot.autoconfigure.AutoConfigureAfter;import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;import java.io.Serializable;@Configuration@AutoConfigureAfter(RedisAutoConfiguration.class)public class RedisConfiguration { @Bean public RedisTemplate redisCacheTemplate(LettuceConnectionFactory redisConnectionFactory) { RedisTemplate template = new RedisTemplate<>(); GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); // 设置键(key)的序列化采用StringRedisSerializer。 template.setKeySerializer(new StringRedisSerializer()); // 设置值(value)的序列化采用jackson的序列化。 template.setValueSerializer(jackson2JsonRedisSerializer); template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(jackson2JsonRedisSerializer); template.setConnectionFactory(redisConnectionFactory); return template; }}
- redisTest如下:
- user类:
package com.redis.pojo;import java.io.Serializable;public class user implements Serializable { //private static final Long private String name; private String password; private String sex; public user(){} @Override public String toString() { return "name:" name " password" password " sex" sex; } public user(String name, String password, String sex) { this.name=name; this.password=password; this.sex=sex; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; }}
controller
import com.redis.pojo.user;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class redisController { private final static Logger log= LoggerFactory.getLogger(redisController.class); /* 注入的名称要和RedisConfiguration的名称一致 否则注入的默认的redisTemplate 如果不喜欢序列化可以直接给config文件夹删除,哈哈 */ @Autowired(required = false) RedisTemplate redisCacheTemplate; //如果RedisTemplate redisTemplate就相当没配置序列化等 @Autowired(required = false) StringRedisTemplate stringRedisTemplate; @Autowired(required = false) RedisTemplate redisTemplate; @GetMapping("test1")//StringRedistemplate 存String public String test1() { stringRedisTemplate.opsForValue().set("test1