【Redis】RedisTemplate序列化传输数据

news/2024/7/5 12:14:03

使用自定义的序列化器

使用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);
    }

在这里插入图片描述


http://lihuaxi.xjx100.cn/news/2085924.html

相关文章

遥感与ChatGPT:科研中的强强联合

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已逐渐渗透到各个领域&#xff0c;为传统行业带来了前所未有的变革。其中&#xff0c;遥感技术作为观测和解析地球的重要手段&#xff0c;正逐渐与AI技术相结合&#xff0c;为地球科学研究与应用提供了全新的…

Linux软件高级编程-网络--TCP通信--day14

TCP包头: 1.序号:发送端发送数据包的编号 2.确认号:已经确认接收到的数据的编号(只有当ACK为1时,确认号才有用) TCP为什么安全可靠: 1.在通信前建立三次握手连接 SYN SYNACK ACK 2.在通信过程中通过序列号和确认号保障数据传输的完整性 本次发送序列号:上次收到的确…

C++构造函数详解

目录 如果对你有帮助&#xff0c;点个赞吧&#xff01; 构造函数&#xff1a; 1、函数名与类名相同 2、无返回值 3、对象实例化时编译器自动调用对用的构造函数 4、构造函数可以重载 5、如果我们没有显式定义构造函数&#xff0c;编译器会自动生成一个构造函数&#xff…

蓝桥杯历年真题 java b组 2015年 第六届 牌型种数

一、题目 牌型种数 小明被劫持到X赌城&#xff0c;被迫与其他3人玩牌。 一副扑克牌&#xff08;去掉大小王牌&#xff0c;共52张&#xff09;&#xff0c;均匀发给4个人&#xff0c;每个人13张。 这时&#xff0c;小明脑子里突然冒出一个问题&#xff1a; 如果不考虑花色&…

系统质量属性与架构评估

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/136565452 一. 软考系统质量属性 1、软件系统质量属性是一个系统的可测量或可测试的属性&#xff0c;基于软件系统的生命周期&#xff0c;可将软件系统的质量属性分为开发期质量属性和运行期质量属性 …

后端八股笔记------Redis

Redis八股 上两种都有可能导致脏数据 所以使用两次删除缓存的技术&#xff0c;延时是因为数据库有主从问题需要更新&#xff0c;无法达到完全的强一致性&#xff0c;只能达到控制一致性。 一般放入缓存中的数据都是读多写少的数据 业务逻辑代码&#x1f447; 写锁&#x1f4…

不要在代码中随便使用try...catch了

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 目录 背景 js中的try...catch try...catch运行机制 js的事件循环机制 try...c…

如何在Linux部署FastDFS文件服务并实现无公网IP远程访问内网文件——“cpolar内网穿透”

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…