redis不能直接保存localDateTime

redis不能直接保存localDateTime对象,需要转为String类型,否则从redis中取出再和localDateTime比对是,即使转为localDateTime比对,也会失败。

// 计算文件名的哈希码(注意:这里使用文件名而不是文件路径)
        int hashCode = filename.hashCode();

        // 获取当前时间
        LocalDateTime currentTime = LocalDateTime.now();
        Map<String, Map<String, Object>> uploadFilePath = new HashMap<>();
        if(redisTemplate.hasKey("upload_file_path")){
           uploadFilePath = redisCache.getCacheMap("upload_file_path");

        }

        // 创建一个 DateTimeFormatter 对象,指定格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        // 使用 formatter 将 LocalDateTime 转换为 String
        String formattedDateTime = currentTime.format(formatter);

        // 创建存储对象(使用 HashMap)
        Map<String, Object> data = new HashMap<>();
        data.put("filepath", filename);
        data.put("timestamp", formattedDateTime);

        // 使用 HashMap 来存储文件名哈希码到数据的映射

        uploadFilePath.put(String.valueOf(hashCode), data); // 使用 String.valueOf 确保键是 String 类型

        // 调用 setCacheMap 方法存储数据到 Redis 中
        redisCache.setCacheMap("upload_file_path", uploadFilePath);
       // removeFileNameFromRedis(filename,true);

从redis中取出进行比对,超过多久的文件需要从redis中删除,并从文件系统Minio中删除附件

 /**
     *如果资源提交了,从redis 中移除文件名
     * @param filename 文件路径
     * @param boolean isremove 是否需要删除,资源删除成功了,需要从redis中清除记录
     */
    public void removeFileNameFromRedis(String filename,boolean isremove){
        int hashCode = filename.hashCode();
        String key = String.valueOf(hashCode);

        Map<String, Map<String, Object>> uploadFilePath = redisCache.getCacheMap("upload_file_path");
        Map<String, Object> data = uploadFilePath.get(key);
        String timestampStr = (String) data.get("timestamp");

        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");


        try {
            // 解析起始日期时间
            LocalDateTime timestamp = LocalDateTime.parse(timestampStr, dateTimeFormatter);
            System.out.println("文件时间========="+timestamp);
            LocalDateTime currentTime = LocalDateTime.now();

            System.out.println("当前时间====="+LocalDateTime.now());

            // 计算时间差
            Duration duration = Duration.between(timestamp, LocalDateTime.now());

            //超过60分钟,从redis中删除
            if (duration.toMinutes() > 60) {
                //redisCache.delCacheMapValue("upload_file_path", key);
                removeUploadFileFromRedisCache(key);
            } else {
                System.out.println("文件未超时");
            }
        } catch (DateTimeParseException e) {
            System.err.println("日期时间格式错误: " + e.getMessage());
        }
        if(isremove) {
            //删除附件
            String filepath = data.get("filepath").toString();         
            deleteFileFromMinio(filepath);
        }
    }

### 如何在 Redis 中缓存对象 为了有效地利用 Redis 缓存 Java 对象,通常会采用序列化的方式将对象转换成字符串形式存储于 Redis 中。当需要获取该对象时再将其反序列化回原始的对象形态。 #### 使用 `@Cacheable` 注解实现查询套餐缓存 可以直接在方法上添加 `@Cacheable` 注解并指定缓存名称以及构造用于 Redis 存储键值[^1]: ```java @Cacheable(value = "packageCache", key = "#id") public Package getPackageById(Long id) { // 查询数据库逻辑... } ``` 此方式简化了开发流程,使得开发者无需手动编写复杂的缓存管理代码即可轻松完成基本的缓存功能。 #### 处理读取 DB 方法返回的数据为空的情况 对于从数据库中未能成功检索到记录的情形下是否应该保存Redis 这一问题,则取决于业务需求。某些场景可能允许设置开关控制这种行为的发生与否[^2]。例如,在配置文件中定义属性决定是否开启此类特性;而在实际编码过程中则依据此配置项执行相应的分支处理路径。 #### 预防常见问题——缓存雪崩现象 为了避免大量缓存在同一时刻失效进而引发服务器压力骤增的问题(即所谓的“缓存雪崩”),可以采取为不同条目的 TTL 设置随机增量的方法来分散这些事件的时间分布[^3]。这有助于减轻因集中式的过期而导致的服务负载高峰。 #### 封装逻辑过期时间重置机制 考虑到缓存重建期间需同步更新其有效期限这一诉求,可设计专门负责此项工作的函数以便灵活调整各个实例的有效时段长度[^4]。下面给出了一段示范性的源码片段展示了怎样把一个商店实体及其对应的截止日期组合起来并通过 JSON 序列化的手段送入 Redis 内部: ```java public void saveShopToRedis(Long id, Long seconds) { // 1. 查询店铺数据 Shop shop = getById(id); // 创建包含店铺信息和有效期的对象 RedisData redisData = new RedisData(); redisData.setData(shop); redisData.setExpireTime(LocalDateTime.now().plusSeconds(seconds)); // 2. 将上述复合体转化为JSON串后存入Redis stringRedisTemplate.opsForValue() .set(RedisConstants.CACHE_SHOP_KEY + id, JSONUtil.toJsonStr(redisData)); } ``` 以上就是关于如何运用 Redis 来高效地管理和维护应用程序内的对象级缓存的一些指导方针和技术细节介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱吃萝卜的美羊羊

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值