Redis是一种支持key-value等多种数据结构的存储系统。可用于缓存,事件发布或订阅,高速队列等场景。使用C语言编写,支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化。
废话不多说,直接开干!
教程是基于spring boot,spring项目的也是差不多的道理
- 第一步依旧是最简单的导入依赖
<!--此处省略其他代码-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>- 配置Redis
spring.redis.database=0
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=(输入你的密码。没有就空着~)(配置是不是比spring的简单!)
- Redis的序列化配置
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.PolymorphicTypeValidator;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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 .UnknownHostException;
/**
* Author: Richard
* Create: 2020/11/08 16:39:00
*/
@Configuration
public class RedisConfig {
@Bean
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
// Json序列化配置
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// enableDefaultTyping 方法已经过时,使用新的方法activateDefaultTyping
// objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, .WRAPPER_ARRAY);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
// String序列化
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key 序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value的序列化方式(json序列化)
template.setValueSerializer(jackson2JsonRedisSerializer);
// value的序列化方式(String序列化,value 不是String类型会报错,建议使用json序列化)
// template.setValueSerializer(stringRedisSerializer);
// hash的value序列化方式(json序列化)
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}这里的序列化配置都是参考狂神,打个小广告!
大家可以关注他的B站账号 “遇见狂神说”
或者关注他的微信公众号 “狂神说”
- 测试
import com.example.demojpa.model.AyUser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.*;
import javax.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
@SpringBootTest
class DemojpaApplicationTests {
@Resource
@Qualifier("redisTemplate")
private RedisTemplate redisTemplate;
@Resource
private StringRedisTemplate stringRedisTemplate;
@Test
void test() throws JsonProcessingException {
// StringRedisTemplate是专门处理 String 字符串的
// 如果使用RedisTemplate 的话,取出来的 value 会有转义字符 \
// 因为前面 template.setValueSerializer(jackson2JsonRedisSerializer); ,这里设置为 json 序列化
stringRedisTemplate.opsForValue().set("a1", "哈哈哈哈");
User a2 = new User(1,"name","ss");
redisTemplate.opsForValue().set("a2", a2);
System.out.println(stringRedisTemplate.opsForValue().get("a1"));
System.out.println(stringRedisTemplate.opsForValue().get("a2"));
}
}
这是 idea 控制台输出的结果

这是命令行窗口获取的value(a1乱码是编码问题)


这是可视化界面获取的value,一切正常!
redis序列化配置到这里就结束了~
下面插入一段小知识点:
在配置json序列化时 idea 提示 enableDefaultTyping 已过时
查看源码

我们去 debug 一下,当我们一步一步点进去会发现,就算使用了过时的方法,它最后还是调用了新的方法,也就是上图中的3。
activateDefaultTyping 方法有三个参数
参数1:getPolymorphicTypeValidator()
参数2:applicability
参数3:includeAs
由下图可见,第一个参数传入的是 LaissezFaireSubTypeValidator 的实例,
第二个参数是 ObjectMapper.DefaultTyping.NON_FINAL,第三个是.WRAPPER_ARRAY

到这里,activateDefaultTyping 方法的使用我们就知道了
















