Redis是一种支持key-value等多种数据结构的存储系统。可用于缓存,事件发布或订阅,高速队列等场景。使用C语言编写,支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化。

废话不多说,直接开干!
教程是基于spring boot,spring项目的也是差不多的道理

  1. 第一步依旧是最简单的导入依赖
<!--此处省略其他代码-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
  1. 配置Redis
spring.redis.database=0
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=(输入你的密码。没有就空着~)

(配置是不是比spring的简单!)

  1. 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站账号 “遇见狂神说”
或者关注他的微信公众号 “狂神说”

  1. 测试
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"));
      
   }
}

redis默认序列化 redis设置序列化_redis默认序列化

这是 idea 控制台输出的结果


redis默认序列化 redis设置序列化_redis默认序列化_02

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


redis默认序列化 redis设置序列化_java_03

redis默认序列化 redis设置序列化_spring_04


这是可视化界面获取的value,一切正常!

redis序列化配置到这里就结束了~



下面插入一段小知识点:

在配置json序列化时 idea 提示 enableDefaultTyping 已过时

查看源码

redis默认序列化 redis设置序列化_redis_05


我们去 debug 一下,当我们一步一步点进去会发现,就算使用了过时的方法,它最后还是调用了新的方法,也就是上图中的3。

activateDefaultTyping 方法有三个参数

参数1:getPolymorphicTypeValidator()

参数2:applicability

参数3:includeAs

由下图可见,第一个参数传入的是 LaissezFaireSubTypeValidator 的实例,

第二个参数是 ObjectMapper.DefaultTyping.NON_FINAL,第三个是.WRAPPER_ARRAY

redis默认序列化 redis设置序列化_redis默认序列化_06


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