若依使用RedisCache需要注意的事项

发布于:2025-06-11 ⋅ 阅读:(16) ⋅ 点赞:(0)

存入redis对象的时候会带一个@type字段,此处需要注意

在这里插入图片描述

存入方:

此处需要注意,存入redis的时候会带一个@type,也就是类的路径名

redisCache.setCacheObject(screenPlayQueueName, userDemondDto,
                userDemondDto.getPlayDuration().intValue(), TimeUnit.SECONDS);

package com.pmkz.core.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;
/**
 * @version 1.0
 * @description
 * @date 2025/5/26 16:57
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserOnDemandDto {
    private Long reId; //资源id
    private String isLoopPlay; //是否循环播放
    private Long timestamp;
    private Long userId;
    private String contentType;
    private Long playDuration; //持续时间为s
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date displayTime; //开始时间
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date displayEndTime; //结束时间
    private double longitude; //经度
    private double latitude; //纬度
    private Long logId;//日志id
}
取出方

此处可以看出取出方的类的路径名与存入redis的不一致,就会出现类型转换的错误

 UserOnDemandDto userOnDemandDtoCache = redisCache.getCacheObject(screenPlayQueueName);


package com.lxsq.service.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.util.Date;

/**
 * @author 陈丹阳
 * @version 1.0
 * @description
 * @date 2025/6/9 8:57
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UserOnDemandDto {
    private Long reId; //资源id
    private String isLoopPlay; //是否循环播放
    private Long timestamp;
    private Long userId;
    private String contentType;
    private Long playDuration; //持续时间为s
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date displayTime; //开始时间
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date displayEndTime; //结束时间
    private double longitude; //经度
    private double latitude; //纬度
    private Long logId;//日志id
}

临时解决方法
        Object result  = redisCache.getCacheObject(screenPlayQueueName);
        if (result instanceof String) {
            String jsonStr = (String) result;
            // 移除@type信息
            jsonStr = jsonStr.replaceAll("\"@type\":\"[^\"]+\",?", "");
            jsonStr = jsonStr.replaceAll(",}", "}").replaceAll(",]", "]");
            // 转换为目标对象
            userOnDemandDtoCache = JSON.parseObject(jsonStr, UserOnDemandDto.class);
        }

永久解决办法(在RedisConfig中进行配置)
@SuppressWarnings(value = { "unchecked", "rawtypes" })
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
    RedisTemplate<Object, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(connectionFactory);

    // 配置FastJson的ParserConfig
    ParserConfig parserConfig = new ParserConfig();
    parserConfig.setAutoTypeSupport(true); // 开启自动类型支持
    parserConfig.addAccept("com.yourpackage."); // 添加允许的包名前缀

    FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);
    serializer.setFastJsonConfig(new FastJsonConfig());
    serializer.getFastJsonConfig().setParserConfig(parserConfig);

    template.setKeySerializer(new StringRedisSerializer());
    template.setValueSerializer(serializer);
    template.setHashKeySerializer(new StringRedisSerializer());
    template.setHashValueSerializer(serializer);

    template.afterPropertiesSet();
    return template;
}