springboot2.x 与 1.x 配置 redis 区别
SpringBoot 1.X Redis
redis maven 依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.7.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
配置文件
# Redis 数据库索引(默认为0) spring.redis.database = 0 # Redis 服务器地址 spring.redis.host = 192.168.110.1 # Redis 服务器连接端口 spring.redis.port = 6379 # Redis 服务器连接密码(默认为空) spring.redis.password = # 连接池最大连接数(使用负值表示没有限制) spring.redis.pool.max-active = 8 # 连接池最大阻塞等待时间(使用负值表示没有限制) spring.redis.pool.max-wait = -1 # 连接池中的最大空闲连接 spring.redis.pool.max-idle = 8 # 连接池中的最小空闲连接 spring.redis.pool.min-idle = 0 # 连接超时时间(毫秒) spring.redis.timeout = 0 #集群节点 spring.redis.cluster.nodes = 192.168.110.2:6379,192.168.110.3:6380,192.168.110.4:6381,192.168.110.5:6382,191.168.110.6:6384,192.168.110.7:6385 spring.redis.cluster.max-redirects = 3 spring.redis.cluster.timeout = 5000
SpringBoot 2.X redis 配置
springboot 2.X redis maven 依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
配置文件
# Redis 数据库索引(默认为0) spring.redis.database = 0 # Redis 服务器地址 spring.redis.host = 192.168.110.1 # Redis 服务器连接端口 spring.redis.port = 6379 # Redis 服务器连接密码(默认为空) spring.redis.password = # 连接超时时间(毫秒) spring.redis.timeout = 10000ms # 连接池最大连接数(使用负值表示没有限制) spring.redis.lettuce.pool.max-active = 8 # 连接池最大阻塞等待时间(使用负值表示没有限制) spring.redis.lettuce.pool.max-wait = -1 # 连接池中的最小空闲连接 spring.redis.lettuce.pool.min-idle = 0 # 连接池中的最大空闲连接 spring.redis.lettuce.pool.max-idle = 8 #集群节点 spring.redis.cluster.nodes = 192.168.110.2:6379,192.168.110.3:6380,192.168.110.4:6381,192.168.110.5:6382,191.168.110.6:6384,192.168.110.7:6385
#获取失败 最大重定向次数 spring.redis.cluster.max-redirects = 3
RedisTemplate 序列化
在 Spring Boot 中,我们其实更习惯使用 Spring Data Redis 来操作 Redis,不过默认的 RedisTemplate 有一个小坑,就是序列化用的是 JdkSerializationRedisSerializer,不知道小伙伴们有没有注意过,直接用这个序列化工具将来存到 Redis 上的 key 和 value 都会莫名其妙多一些前缀,这就导致你用命令读取的时候可能会出错。
例如存储的时候,key 是 name,value 是 mingtian,但是当你在命令行操作的时候,get name
却获取不到你想要的数据,原因就是存到 redis 之后 name 前面多了一些字符,此时只能继续使用 RedisTemplate 将之读取出来。
我们用 Redis 做限流会用到 Lua 脚本,使用 Lua 脚本的时候,就会出现上面说的这种情况,所以我们需要修改 RedisTemplate 的序列化方案。
注意:可能有小伙伴会说为什么不用 StringRedisTemplate 呢?StringRedisTemplate 确实不存在上面所说的问题,但是它能够存储的数据类型不够丰富。如果只是操作String 类型的数据,推荐使用 StringRedisTemplate。反之推荐使用 RedisTemplate。
修改 RedisTemplate 序列化方案,代码如下:
package com.example.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; 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.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; /** * @Description: RedisConfig redis 配置 使用 Lettuce 连接池 * @Author: mingtian * @CreateDate: 2020/6/9 9:58 * @Version: 1.0 */ @Configuration @AutoConfigureAfter(RedisAutoConfiguration.class) public class RedisConfig { @Bean public RedisTemplate<String, Object> redisCacheTemplate(LettuceConnectionFactory redisConnectionFactory) { // 设置序列化,使用Jackson2JsonRedisSerialize 替换默认序列化(默认采用的是JDK序列化) Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); //配置 redisTemplate RedisTemplate<String, Object> template = new RedisTemplate<>(); //设置redis连接工厂 template.setConnectionFactory(redisConnectionFactory); RedisSerializer<?> stringSerializer = new StringRedisSerializer(); // key 序列化 template.setKeySerializer(stringSerializer); // value 序列化 template.setValueSerializer(jackson2JsonRedisSerializer); template.setHashKeySerializer(stringSerializer); template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; } }
SpringBoot+redis限流:https://mp.weixin.qq.com/s/hVgXH1ZZ_5cJhdI3TR_pyg