废话不多说,直接上料~
搭建boot环境(此步骤省略,自行百度)
我这里boot的版本是2.2.13.RELEASE
pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
这里需要注意,boot2.x之后,redis底层不再是jedis,而是lettuce。我在demo测试的时候:
报错Caused by: java.lang.ClassNotFoundException: org.apache.commons.pool2.impl.GenericObjectPoolConfig!
所以需要添加commons-pool2依赖。
配置yml中的redis
spring:
application:
name: boot-test
redis:
database: 0
host: 127.0.0.1
lettuce:
pool:
max-active: 8 #最大连接数据库连接数,设 0 为没有限制
max-idle: 8 #最大等待连接中的数量,设 0 为没有限制
max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
min-idle: 0 #最小等待连接中的数量,设 0 为没有限制
shutdown-timeout: 100ms
password: ''
port: 6379
这里为了体现lettuce,所以加了其连接池,正常做单机测试,只写host,port,database就可以了,而且查阅源码,如果默认的localhost,可以不写。
创建《String,Object》类型的自定义RedisTemplate模板
如果你使用的类型为《String,String》,那么可以直接使用StringRedisTemplate就可以了,这是封装好的,直接使用。
@Autowired
StringRedisTemplate redisTemplate;
redisTemplate.opsForValue().set("String-key", "String-value");
log.info("输出value为: {}",redisTemplate.opsForValue().get("String-key"));
对于自定义模板,这里在启动器里注入,和自己写一个configuration类道理一样.
大致进行一个解释说明:
因为RedisTemplate默认给的是《Object,Object》,在我们使用的时候不是很方便,所以一般都自定义《String,Object》模板,这里同时设置了序列化,将value的Object序列化原本由JDK改为jackson序列化。
所有的key由StringRedisSerializer序列化。
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.ANY);
om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance ,
ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
jackson2JsonRedisSerializer.setObjectMapper(om);
//key
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
//value
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
至此,完成对RedisTempalte<String,Obecjt>自定义模板的配置。
注意:非spring注入使用RedisTemplate,需先调用afterPropertiesSet()方法
test测试
这里首先需要对User实体进行序列化,不然会没有序列化的错:
Failed to serialize object using DefaultSerializer;
nested exception is java.lang.IllegalArgumentException: **DefaultSerializer requires a Serializable payload but received an object of type [com.sk.user.entity.User]**
简单的一个service业务类
@Service
@Slf4j
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Autowired
private RedisTemplate redisTemplate;
@Override
public User findById(Integer id) {
User user=userMapper.findById(id);
redisTemplate.opsForValue().set("user",user);
log.info("---获取redis中的user内容--- {}",redisTemplate.opsForValue().get("user"));
return user;
}
redis中查看,也正常显示:
至此完成所有操作。