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 java.net.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, JsonTypeInfo.As.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,第三个是JsonTypeInfo.As.WRAPPER_ARRAY
到这里,activateDefaultTyping 方法的使用我们就知道了
版权声明:本文为weixin_43769525原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。