解决redis序列号和反序列化问题

最近遇到了一个问题,将

复制代码
List<Map<String, Object>>
类型数据以list形式存入到redis之后,发现取出来时数据格式完全不对,根据报错信息发现是反序列化问题,遇到类似问题,主要有两种解决方案

1.使用序列号工具

例如,Java中常用的序列化工具有Jackson、Gson等。这些工具能够将对象序列化为字符串,并能够准确地将字符串反序列化为对象。

java 复制代码
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class RedisUtils {
    private static final ObjectMapper objectMapper = new ObjectMapper();

    public static String serialize(Object object) throws JsonProcessingException {
        return objectMapper.writeValueAsString(object);
    }

    public static <T> T deserialize(String json, Class<T> clazz) throws JsonProcessingException {
        return objectMapper.readValue(json, clazz);
    }
}

使用Jackson的ObjectMapper来进行序列化和反序列化操作,serialize方法将对象序列化为字符串,deserialize方法将字符串反序列化为对象

2.使用JSON字符串存储(推荐)

直接使用JSON字符串进行存储。我们可以将对象转换为JSON字符串,并存储到Redis中。当需要获取数据时,我们可以将存储的JSON字符串转换为对象。

java 复制代码
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

// 将 List<Map<String, Object>> 转换为 JSON 字符串
        ObjectMapper objectMapper = new ObjectMapper();
        String json;
        try {
            json = objectMapper.writeValueAsString(list);
        } catch (JsonProcessingException e) {
            logger.error("在listInRedis方法中处理Redis时发生错误", e);
            throw new RuntimeException(e);
        }
        // 存储到 Redis
        redisTemplate.opsForValue().set(key, json);
java 复制代码
// 从 Redis 获取 JSON 字符串
        String value = (String) redisTemplate.opsForValue().get(key);

        // 将 JSON 字符串转换回 List<Map<String, Object>>
        try {
            List<Map<String, Object>> listOfMaps = objectMapper.readValue(value,
                    new TypeReference<List<Map<String, Object>>>() {
                    });
            logger.info("listInRedis从redis中查询到的结果Key:{}-----::{}", key, listOfMaps);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
相关推荐
敏姐的后花园2 小时前
模考倒计时网页版
java·服务器·前端
小满、2 小时前
MySQL :实用函数、约束、多表查询与事务隔离
数据库·mysql·事务·数据库函数·多表查询
百***35333 小时前
PostgreSQL_安装部署
数据库·postgresql
Dcs4 小时前
Java 中 UnaryOperator 接口与 Lambda 表达式的应用示例
java·后端
thekenofdis5 小时前
Lua脚本执行多个redis命令提示“CROSSSLOT Keys in request don‘t hash to the same slot“问题
redis·lua·哈希算法
rayylee5 小时前
生活抱怨与解决方案app
数据库·生活
bagadesu6 小时前
使用Docker构建Node.js应用的详细指南
java·后端
没有bug.的程序员6 小时前
Spring Cloud Gateway 性能优化与限流设计
java·spring boot·spring·nacos·性能优化·gateway·springcloud
Lucifer三思而后行7 小时前
使用 BR 备份 TiDB 到 AWS S3 存储
数据库·tidb·aws