Redis采用ZSet存入JSON字符串,取出后反序列化报错即解决方案

Redis 使用ZSet数据结构保存JSON格式的数据,在入到Redis后反序列化时发生了错误:

 原因是到Redis中存储时,给每一个字段前加上了反斜杠,不能直接使用JSON直接反序列化。

可以使用JSON.parse()方法在反序列化之前,对于字符串解析一下即可。

int setNum = (page - 1) * size / 20000;
int from = (page - 1) * size % 20000;
List<Object> zSetByRange = redisUtil.getZSetByRange("redis keyName",from,from+size-1);
Object parse = JSON.parse(zSetByRange.toString());
list= JSON.parseArray(JSON.toJSONString(parse), 反序列化的类.class);

redisUtil.getZSetByRange:等价于以下代码段

public List<Object> getZSetByRange(String key, int start, int end){
    Set<Object> range = redisTemplate.opsForZSet().range(key, start, end);
    return new ArrayList<>(range);
}

报错信息:

com.alibaba.fastjson.JSONException: field null expect '[', but string, pos 2509, line 1, column 2510"[{\"..............

下附一个Redis Template API支持的批量插入的代码模板:

/**批量保存至Redis*/
public <T>void saveDataToRedis(List<T> list,String setName) {
    RedisSerializer<String> keySerializer = (RedisSerializer<String>)redisTemplate.getKeySerializer();
    RedisSerializer<String> valueSerializer = (RedisSerializer<String>)redisTemplate.getValueSerializer();
//获取插入开始时间戳
    long startTime = System.currentTimeMillis();
    redisTemplate.executePipelined((RedisCallback<String>) connection -> {
        for (int i = 0; i < list.size(); i++) {
            connection.zSetCommands().zAdd(keySerializer.serialize(setName),i,valueSerializer.serialize(JSON.toJSONString(list.get(i))));
        }
        //设置超时时间
        connection.expire(keySerializer.serialize(setName), 3600L);
        return null;
    });
//获取插入结束时间戳,打印日志
    long endTime = System.currentTimeMillis();
    long costTime = endTime - startTime;
    log.info(">>>>>>saveDataToRedis add into redis by using pipeline for loop spent->" + costTime);
}
  • 24
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值