springboot中集成spring-data-redis

本文介绍如何配置RedisTemplate和StringRedisTemplate来使用Jackson进行序列化,提高数据可读性和节省存储空间,并展示了具体的Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RedisConfig序列化配置

在这里插入图片描述

key的序列化
  • RedisTemplate将String、hash、list、set等分类,分为不同的对象,底层使用序列化实现的
  • 默认使用的是jdk序列化实现的(ObjectInputStream),但是它有缺点,结果如下图
    • 可读性差,下图不知道那一串是键 name
    • 序列化后流太大,占用空间
    • 不能跨语言

在这里插入图片描述

  • 使用jackson序列化
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.impl.LaissezFaireSubTypeValidator;
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;

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);

        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
        jackson2JsonRedisSerializer.setObjectMapper(om);

        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}
@SpringBootTest
class RedisDemoApplicationTests {

	//使用泛型指定key和值的数据类型比较好
    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    @Test
    void testString() {
        // 写入一条String数据
        redisTemplate.opsForValue().set("name", "klz");
        // 获取string数据
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println("name = " + name);
    }
}

在这里插入图片描述

value的序列化
  • 使用上面的方法存值是对象的数据会出现字节码,浪费空间

在这里插入图片描述

  • 如果不要字节码需要我们手动实现value的序列化,将对象转为json存入redis,反序列时在将json转为对象,好处是节省了内存空间,坏处是手动序列化,反序列化是需要手动将字符串转为对象

  • 这种方式将RedisTemplate换为了StringRedisTemplate

@SpringBootTest
class RedisDemoApplicationTests {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    private static final ObjectMapper mapper = new ObjectMapper();

    @Test
    void testSaveUser() throws JsonProcessingException {
        // 写入数据
        User user = new User("klz",3);
        String json = mapper.writeValueAsString(user);
        stringRedisTemplate.opsForValue().set("user", json);
        // 获取数据
        String jsonUser =  stringRedisTemplate.opsForValue().get("user");
        User user2 = mapper.readValue(jsonUser, User.class);
        System.out.println("user = " + user2);
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值