1.Spring Boot 整合 Redis
1.1 导入依赖
如果在创建 Spring Boot 项目的时候没有考虑过使用 redis ,而后期要用 redis 的话。导入下面一个依赖就可。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
1.2 配置链接属性
配置 redis 属性,用 application.xml 和 application.yml 都可以。这里我使用的是更简洁的 application.yml。
spring:
redis:
host: 127.0.0.1 #ip
database: 0 #数据库名称,默认 db0
password: 123456789 #密码
port: 6379 ¥端口
jedis:
pool: #链接池设置
max-idle: 8
min-idle: 0
max-active: 8
1.3 使用
RedisAutoConfiguration 为我们默认配置了 JedisConnectionFactory,RedisTemplate 以及 StringRedisTemplate,让我们可以直接的使用 Redis 作为数据储存。
@Resource
private RedisTemplate redisTemplate;
@Resource
private StringRedisTemplate stringRedisTemplate;
String Data Redis 为我们提供了 RedisTemplate 和 StringRedisTemplate 两个模版来进行数据操作,其中:StringRedisTemplate 只针对键值都是字符串的数据进行操作。
当我们的数据存储到 Redis 的时候,我们的键(key)和 值(value)都是通过 Spring 提供的 Serializer 序列化到数据可中的。
- RedisTemplate 默认使用的是 JdkSerializationRedisSerializer
- StringRedisTemplate 默认使用的是 StringRedisSerializer。
Spring Data JPA 为我们提供了下面的 Serializer
- GenericToStringSerializer
- Jackson2JsonRedisSerializer
- JdkSerializationRedisSerializer
- OxmSerializer
- StringRedisSerializer
2. 配置 RedisTemplate 序列化类型
Spring Boot 为我们自动配置了 RedisTemplate,而 RedisTemplate 使用的是 JdkSerializationRedisSerializer,这个对我们用 redis 图形化客户端很不直观,因为 JdkSerializationRedisSerializer 使用二进制形式储存数据,在此我们将自己配置 RedisTemplate 并定义 Serializer。
package com.changgou.seckill;
import com.changgou.seckill.config.TokenDecode;
import com.changgou.util.IdWorker;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.scheduling.annotation.EnableScheduling;
import tk.mybatis.spring.annotation.MapperScan;
@SpringBootApplication
@EnableEurekaClient
@EnableScheduling //这个注解作用是开启定时器, 如果不写这个注解, 在方法中写cron表达式是不起作用的
@MapperScan(basePackages = {"com.changgou.seckill.dao"})
public class SeckillApplication {
public static void main(String[] args) {
SpringApplication.run(SeckillApplication.class);
}
@Bean
public TokenDecode tokenDecode() {
return new TokenDecode();
}
@Bean
public IdWorker idWorker() {
return new IdWorker(1, 1);
}
/**
* 设置 redisTemplate 的序列化设置
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
//1.创建redisTemplate模板
RedisTemplate<Object, Object> template = new RedisTemplate<>();
//2.关联redisConnectionFactory
template.setConnectionFactory(redisConnectionFactory);
//3.创建序列化类
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
//4.设置可见度
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//5.启动默认的类型
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
//6.序列化类,对象映射设置
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
// 7.设置value的转化格式和key的转换格式
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setKeySerializer(new StringRedisSerializer());
template.afterPropertiesSet();
return template;
}
}
这样,我们从图形化客户端可以很直观的看出我们存储的数据。
序列化设置前:
序列化设置后:
参考:
Spring Boot 整合 Redis 并设置序列化类型
Redis序列化、RedisTemplate序列化方式大解读,介绍Genericjackson2jsonredisserializer序列化器的坑