当前位置: 首页 > article >正文

SpringBoot中设置超时30分钟自动删除元素的List和Map

简介

在 Spring Boot 中,你可以使用多种方法来实现自动删除超时元素的 List 或 Map。以下是两种常见的方式:

  • 如果你需要简单的功能并且不介意引入外部依赖,可以选择 Guava Cache。
  • 如果你想要更灵活的控制,使用 Spring 的调度功能也是一个不错的选择。

1. 使用 Scheduled Task

你可以使用 Spring 的 @Scheduled 注解来定期清理过期的元素。

import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Component
@EnableScheduling
public class CacheManager {

    //by https://zhengkai.blog.csdn.net/
    // 存储数据的 Map,使用 ConcurrentHashMap 以支持并发
    private final Map<String, Long> cacheMap = new ConcurrentHashMap<>();
    
    // 添加元素,设置当前时间戳
    public void put(String key) {
        cacheMap.put(key, System.currentTimeMillis());
    }

    // 定期清理超时元素
    @Scheduled(fixedRate = 60000) // 每分钟执行一次
    public void cleanUp() {
        long currentTime = System.currentTimeMillis();
        long timeout = 30 * 60 * 1000; // 30 分钟超时

        Iterator<Map.Entry<String, Long>> iterator = cacheMap.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, Long> entry = iterator.next();
            if (currentTime - entry.getValue() > timeout) {
                iterator.remove(); // 删除超时元素
            }
        }
    }

    // 获取元素
    public Boolean get(String key) {
        return cacheMap.containsKey(key);
    }
}

在上面的代码中,我们创建了一个 CacheManager 类,它使用 ConcurrentHashMap 来存储元素及其添加时间。@Scheduled 注解用于定义定期清理超时元素的任务。定期任务每分钟执行一次,检查并删除 30 分钟之前添加的元素。

2. 使用 Guava Cache

如果你希望更简单地管理缓存,可以使用 Guava 的 Cache。它提供了过期策略的支持。

示例代码

首先,确保在 pom.xml 中添加 Guava 依赖:

<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>33.3.1-jre</version>
</dependency>

然后,使用 Guava Cache:

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.concurrent.TimeUnit;

@Component
public class CacheManager {

    private Cache<String, String> cache;

    @PostConstruct
    public void init() {
        // 创建一个支持过期的缓存,30分钟后过期。 by https://zhengkai.blog.csdn.net/
        cache = CacheBuilder.newBuilder()
                .expireAfterWrite(30, TimeUnit.MINUTES)
                .build();
    }

    // 添加元素
    public void put(String key, String value) {
        cache.put(key, value);
    }

    // 获取元素
    public String get(String key) {
        return cache.getIfPresent(key);
    }
}

在这个例子中,我们使用 Guava 的 CacheBuilder 创建了一个具有 30 分钟自动过期策略的缓存。使用 put 方法可以添加元素,而使用 getIfPresent 方法可以获取当前元素。


http://www.kler.cn/a/404733.html

相关文章:

  • pdf文档动态插入文字水印,45度角,旋转倾斜,位于文档中央,多行水印可插入中文
  • 【倍数问题——同余系】
  • 深入理解Spring(二)
  • ElasticSearch7.x入门教程之中文分词器 IK(二)
  • 从0安装mysql server
  • 新华三H3CNE网络工程师认证—子接口技术
  • 内存、显存和GPU在Transformer架构中承担什么计算任务
  • 【如何用更少的数据作出更好的决策】-gpt生成
  • 华为云容器监控平台
  • 【面试题系列Vue07】Vuex是什么?使用Vuex的好处有哪些?
  • 快速排序-java版本
  • 【开源免费】基于Vue和SpringBoot的私人健身与教练预约管理系统(附论文)
  • WTV芯片在智能电子锁语音留言上的应用方案解析
  • 用Python做一个websocket服务端
  • Nvidia 系列显卡大解析 B100、A40、A100、A800、H100、H800、V100 该如何选择,各自的配置详细与架构详细介绍,分别运用于哪些项目场景
  • VMware如何安装img镜像,VMware如何安装openwrt软路由(含相关工具镜像)
  • OceanBase 中常用的查询语句
  • Linux Xterm字体修改
  • IDEA一键启动多个微服务
  • 汽车资讯新视角:Spring Boot技术革新
  • Android 日常使用整理
  • 详解php://filter--理论
  • vue3的attr透传属性详解和使用法方式。以及在css样式的伪元素中实现
  • 2446.学习周刊-2024年46周
  • 深入解析QP算法及其Python实现
  • 沃丰科技智能质检与传统质检的对比