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

最近遇到了一个问题,将

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

1.使用序列号工具

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

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字符串转换为对象。

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);
// 从 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);
        }

### 实现每年自增序列功能 为了实现在 Redis 中按年份生成自增序列的功能,可以利用 Redis 的键空间特性以及 Lua 脚本执行原子操作来确保线程安全。具体方法是在每次请求新的序列号时,先获取当前时间戳中的年份部分作为前缀构建唯一的键名,再对该键执行 `INCR` 命令。 下面是一个简单的 Python 客户端例子展示如何通过连接到 Redis 来创建这样的序列: ```python import time from redis import StrictRedis def get_yearly_auto_increment(redis_client, prefix=""): current_time = int(time.time()) year_str = str(current_time)[:4] # 获取当前年的字符串表示形式 key_name = f"{prefix}{year_str}" try: seq_num = redis_client.incr(key_name) formatted_seq = "{}/{}".format(year_str, seq_num) return formatted_seq except Exception as e: print(f"Error occurred while getting yearly auto increment value: {e}") raise if __name__ == "__main__": rdb = StrictRedis(host='localhost', port=6379, db=0) result = get_yearly_auto_increment(rdb, "order_") print(result) ``` 此脚本定义了一个名为 `get_yearly_auto_increment()` 函数,它接受两个参数:一个是用于访问 Redis 数据库实例的对象;另一个是可选的前缀字符串,默认为空串。函数体内首先计算出当前的时间戳并截取其中代表年的四位数字,之后将其与传入的前缀拼接成完整的键名称,在此基础上调用 Redis 的 INCR 方法完成计数器累加,并返回带有日期格式化的最终结果[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红烧柯基

感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值