【Redis】RedisTemplate序列化传输数据

使用自定义的序列化器

使用RedisTemplate默认的序列化器发送数据,会将key全都当成Object处理,从而按照对象的方式转成json格式发送到服务器,这样会导致两个问题。一是不方便阅读,二是会大大浪费内存。因此,建议自定义RedisTemplate的序列化器,将key按照String方式传输,value按照json方式传输,下面是代码。

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.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        // 创建RedisTemplate<String, Object>对象
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();

        // 设置RedisTemplate的连接工厂
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        // 设置RedisTemplate的序列化器
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();

        // key和hashKey的序列化器采用String
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());

        // value和hashValue的序列化器采用jsonRedisSerializer
        redisTemplate.setValueSerializer(jsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jsonRedisSerializer);
        return redisTemplate;
    }
}

使用StringRedisTemplate

上述方法在传输数据时候,存在一个问题。上述方法在传输在redis数据库中时候,会将数据类型也传上去,占用了的很大的内存,如下图所示:

    @Test
    void contextLoads() {
        User u = new User("李斯", 20);
        redisTemplate.opsForValue().set("newName", u);
        System.out.println(redisTemplate.opsForValue().get("newName"));
    }

在这里插入图片描述
解决方案是使用StringRedisTemplate:

 @Autowired
    StringRedisTemplate stringRedisTemplate;

    // json工具
    static final ObjectMapper objectMapper = new ObjectMapper();

    @Test
    void testStringRedisTemplate() throws Exception {
        User u = new User("李斯", 20);
        // 将对象转换为json字符串
        String json = objectMapper.writeValueAsString(u);
        stringRedisTemplate.opsForValue().set("user:200", json);

        // 从redis中取出json字符串
        String result = stringRedisTemplate.opsForValue().get("user:200");
        // 将json字符串转换为对象
        User user = objectMapper.readValue(result, User.class);
        System.out.println(user);
    }

在这里插入图片描述

相关推荐

  1. PHP序列基础概念:深入理解数据存储与传输

    2024-03-11 10:22:04       9 阅读
  2. 序列和反序列、pytest-DDT数据驱动

    2024-03-11 10:22:04       34 阅读
  3. protobuf 序列协议之数据结构

    2024-03-11 10:22:04       33 阅读
  4. RabbitMQ传递序列/反序列自定义对象时踩坑

    2024-03-11 10:22:04       13 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-11 10:22:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-11 10:22:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-11 10:22:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-11 10:22:04       20 阅读

热门阅读

  1. 佛祖保佑,永不宕机,永无BUG

    2024-03-11 10:22:04       21 阅读
  2. BUG:Enigma Virtual Box打包.net独立程序不正常

    2024-03-11 10:22:04       20 阅读
  3. 判断cursor是否为空

    2024-03-11 10:22:04       22 阅读
  4. CocoaPods 安装使用

    2024-03-11 10:22:04       23 阅读
  5. 解读电影级视频生成模型 MovieFactory

    2024-03-11 10:22:04       28 阅读
  6. 物联网行业如何发展新质生产力

    2024-03-11 10:22:04       25 阅读
  7. python实现--顺序查找

    2024-03-11 10:22:04       22 阅读