Java中使用ConcurrentHashMap实现带有过期时间的缓存

通过ConcurrentHashMap实现简单的本地缓存-----过期 本地缓存适用于数据访问频繁,数据本身稳定,不会轻易修改的情况下,在这里我们利用ConcurrentHashMap实现一个简单的本地缓存,该本地缓存具有时效性,如果超过一定时间没有被使用则被清空,使其系统中不会使用到过期数据。 代码如下: public final class AccessTokenUtils { public static final Map<S... 阅读详情
AI摘要

本文介绍了一种使用ConcurrentHashMap实现带过期时间的缓存管理方式,提供了默认及自定义缓存时效的方法,包括缓存的存取、删除及全部清除功能。

package me.xueyao.cache;

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

/**
 * ConcurrentHashMap 实现带过期时间的缓存
 *
 * @author zkx
 * @date 2020-03-26 11:34
 **/
public class ConcurrentHashMapUtil {
	
    /**
     * 预缓存信息
     */
    private static final Map<String, Object> CACHE_MAP = new ConcurrentHashMap<>();

    /**
     * 每个缓存生效时间2小时
     */
    public static final long CACHE_HOLD_TIME_2H = 2 * 60 * 60 * 1000L;

    /**
     * 每个缓存生效时间12小时
     */
    public static final long CACHE_HOLD_TIME_12H = 12 * 60 * 60 * 1000L;

    /**
     * 每个缓存生效时间24小时
     */
    public static final long CACHE_HOLD_TIME_24H = 24 * 60 * 60 * 1000L;

    /**
     * 存放一个缓存对象,默认保存时间2小时
     *
     * @param cacheName
     * @param obj
     */
    public static void put(String cacheName, Object obj) {
        put(cacheName, obj, CACHE_HOLD_TIME_2H);
    }

    /**
     * 存放一个缓存对象,保存时间为holdTime
     *
     * @param cacheName
     * @param obj
     * @param holdTime
     */
    public static void put(String cacheName, Object obj, long holdTime) {
        if (checkCacheName(cacheName)) {
            return;
        }
        CACHE_MAP.put(cacheName, obj);
        //缓存失效时间
        CACHE_MAP.put(cacheName + "_HoldTime", System.currentTimeMillis() + holdTime);
    }

    /**
     * 取出一个缓存对象
     *
     * @param cacheName
     * @return
     */
    public static Object get(String cacheName) {
        if (checkCacheName(cacheName)) {
            return CACHE_MAP.get(cacheName);
        }
        return null;
    }

    /**
     * 删除所有缓存
     */
    public static void removeAll() {
        CACHE_MAP.clear();
    }

    /**
     * 删除某个缓存
     *
     * @param cacheName
     */
    public static void remove(String cacheName) {
        CACHE_MAP.remove(cacheName);
        CACHE_MAP.remove(cacheName + "_HoldTime");
    }

    /**
     * 检查缓存对象是否存在,
     * 若不存在,则返回false
     * 若存在,检查其是否已过有效期,如果已经过了则删除该缓存并返回false
     *
     * @param cacheName
     * @return
     */
    public static boolean checkCacheName(String cacheName) {
        Long cacheHoldTime = (Long) CACHE_MAP.get(cacheName + "_HoldTime");
        if (cacheHoldTime == null || cacheHoldTime == 0L) {
            return false;
        }
        if (cacheHoldTime < System.currentTimeMillis()) {
            remove(cacheName);
            return false;
        }
        return true;
    }

}



使用ConcurrentHashMap实现缓存 说实话在各种第三方工具和缓存机制的成熟方案太多了,使用Java原生的ConcurrentHashMap意义实在不大,但是有时候自己想偷懒就用个简单的缓存ConcurrentHashMap还是能用的上的,首先我们要了解ConcurrentHashMap是什么? ConcurrentHashMap的简要总结: 1、public V get(Object key)不涉及到锁,也就是说获得对象时没有使... 阅读详情

相关推荐

手把手教你实现线程安全并且可以设置过期时间的LRU缓存。安排

目录: 1. LRU 缓存介绍 2. ConcurrentLinkedQueue简单介绍 3. ReadWriteLock简单介绍 4.ScheduledExecutorService 简单介绍 5. 徒手撸一个线程安全的 LRU 缓存 6. 实现一个线程安全并且带有过期时间的 LRU 缓存 很多人就会问了:“网上已经有这么多现成的缓存了!为什么面试官还要我们自己实现一个呢?” 。咳咳咳,当然是为了面试需要。哈哈!开个玩笑,我个人觉得更多地是为了学习吧! 实现一个线程安全的 LRU 缓存 实

代码界的扛把子 1920

ConcurrentHashMap 实现带过期时间的缓存(亲测可用)

ConcurrentHashMap 实现带过期时间的缓存

3632

expirable-map:用Java编写的带有过期时间设置的Expirable Map

过期地图 用Java编写的带有过期时间设置的Expirable Map 样本 Map<Integer> map = new CacheMap<Integer>(1000 * 5); map.put(1, "value"); 然后map.get(1)将在 5 分钟后过期。

带过期时间的map

带过期时间的Map import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; /** * <p> * Title: ExpireMap * </p> * * <p> * Description: 设置map过期时间 * </p> * * <

weixin_43893430的博客 717

Java缓存Map设置过期时间实现解析

主要介绍了Java缓存Map设置过期时间实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

PDPS16.0单机版与SPLMLicenseServer授权避坑指南:从安装到冲突解决

本文详细解析了PDPS16.0单机版的安装与授权流程,重点阐述了如何正确配置SPLMLicenseServer本地许可证服务器以实现软件激活。针对安装过程中常见的许可证冲突问题,提供了清晰的排查思路和解决方案,并介绍了通过设置环境变量等替代授权方法,帮助用户高效避坑,确保Tecnomatix Process Simulate顺利运行。

weixin_29231221的博客 565

java缓存集合_map集合实现缓存

package com.linmingliang.myblog.utils;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;/** * @Author: lml * @Date: 2018/6/1 17:15 * @Description: */public class MapCache { private...

weixin_39646021的博客 268

[OrCad电路板设计系统].Orcad.Pspice.9.2下载安装

Orcad.Pspice.9.2详细下载安装图文步骤1 安装前准备工作1.1 下载安装包1.2 解压2 安装时步骤2.1 安装文件2.2 破解文件3 安装完成 1 安装前准备工作 1.1 下载安装包 打开百度网盘APP 链接:https://pan.baidu.com/s/1cMFxHUvuh5iEhFVT-lvciQ 提取码:7m65 1.2 解压 解压下载好的安装包 2 安装时步骤 2.1 安装文件 1.点击Setup安装文件,出现警告对话框,告诉你应该关闭所有病毒防火墙,点击确定 2.进入安装界面,

weixin_48924581的博客 1万+

java lru 队列_带有过期时间的LRU实现(java版)

在很早之前学操作系统的时候见过这个算法,后来见到的越来越多,以至于刷面经的时候也看到了,总结一下:一、什么是LRULRU全称是Least Recently Used,即最近最久未使用的意思。也就是说:如果一个数据在最近一段时间没有被使用,将来被使用的机会也比较小。通常的使用场景就是缓存,比如说操作系统中的页面置换算法。实现的方案有很多,我看了很多博客,大多是给了四五种。这里为了简洁,只给出一种,是...

weixin_33437929的博客 1219

PCB线路板的制作工艺流程分享!2021-08-21

Pcb板制作工艺流程:开料-钻孔-沉铜-压膜-曝光-显影-电铜-电锡-退膜-蚀刻-退锡-光学检测-印阻焊油-阻焊曝光、显影-字符-表面处理-成型-电测-终检-抽测-包装。具体如下:1、开料(CUT) 将原始的覆铜板切割成可以用在生产线上制作的板子过程2、钻孔 使PCB板层间产生通孔,以达到连通层间的目的。 3、沉铜 经过钻孔后的线路板在沉铜缸内会发生氧化还原反应,形成铜层对孔进行孔金属化,使原来绝缘的基材表面沉积上铜,达到层间电性相通。 4、压膜 压膜后的PCB板上面压了一层蓝色的干膜, 干膜是一个载体

jdbpcb88的博客 3247

MST-GAT: Enhancing Anomaly Detection in Multimodal Time Series with Intra- and Inter-Modal Attention

本文深入解析了MST-GAT模型,这是一种通过模态内与模态间注意力机制增强多模态时间序列异常检测的新方法。它通过构建图结构显式建模传感器间的复杂时空依赖,并结合时间卷积网络与联合优化策略,有效降低了传统方法中常见的误报与漏报问题,在工业监控等场景中展现出卓越性能。

weixin_29079671的博客 150

java 带超时时间lru_带有过期时间的LRU实现(java版)

在很早之前学操作系统的时候见过这个算法,后来见到的越来越多,以至于刷面经的时候也看到了,总结一下:一、什么是LRULRU全称是Least Recently Used,即最近最久未使用的意思。也就是说:如果一个数据在最近一段时间没有被使用,将来被使用的机会也比较小。通常的使用场景就是缓存,比如说操作系统中的页面置换算法。实现的方案有很多,我看了很多博客,大多是给了四五种。这里为了简洁,只给出一种,是...

weixin_42393576的博客 446

R语言dplyr包recode函数、recode_factor函数数值或因子替换实战

R语言dplyr包recode函数、recode_factor函数数值或因子替换实战 目录 R语言dplyr包recode函数、recode_factor函数数值或因子替换实战 #导入dplyr包 #recode函数进行数值替换 #recode_factor函数对因子变量进行替换 #导入dplyr包 install.packages("dplyr") # Install & load dplyr library("dpl.

data+scenario+science+insight 1590

java中的缓存工具类

package com.zhizhi.util; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * Map 缓存实现 * Created by winterchen on 2018/4/30. */ public class MapCache { /** * 默认存储1024个缓存 */ private static final int DEFAULT_CACH

weixin_45058750的博客 437

华为OD机考双机位C卷 - 补种未成活胡杨 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 补种未成活胡杨(OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 2418

OmniDrive(2):环境搭建

项目中使用的是全量的数据集(full dataset v1.0), 数据量比较大,训练验证(trainval) + test 总计200多G的数据,单独一个个下载会比较慢。参数,否则安装的时候会自动卸载已安装好的torch,重新安装最新版本的torch,这是不允许的。在cuDNN官网下载,默认下载的是最新版本的cuDNN,我们这里点击。,== 博文中详细介绍了完整的cuda和cudnn的安装过程==分析: 这是因为yapf 安装的版本不对,需要安装特定的版本。出现训练的loss变化,就说明可以正常训练了。

@bangbang的博客 623

缓存-缓存的几种方法

缓存的几种方法 FIFO+过期时间 基于LinkedHashMap进行存储。 静态字段,一个存放数据的map,一个定时线程池。 // 存放缓存的集合 private Map<String, CacheData> cacheDatas = null; // 定时器线程池,用于清楚过期缓存 private final static ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(5); // FIFO p

hgkdzbf6的博客 291

App 抓包难?Frida Hook 实战:绕过 SSL Pinning (证书绑定) 抓取某大厂 App 核心接口

当我们使用 Charles 抓包 HTTPS 时,本质上是实施了MITM(中间人攻击)。Charles 伪装成服务器,发给 App 一个自己的证书(伪造证书)。Charles 伪装成 App,拿着真正的证书去请求服务器。如果 App 只是简单校验“证书是否由受信任的 CA 签发”,那你把 Charles 的根证书安装到手机系统里,就能骗过它。但是,是 App 内置了服务器证书的Hash(指纹)。

BUG猿的博客 916

基于delayqueue的缓存

/** * All rights Reserved, Designed By www.tydic.com * @Title: CacheClass.java * @Package com.andy.jcu.cachetest * @Description: TODO(用一句话描述该文件做什么) * @author: andyzhu * @date:...

549

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

4.5.7 DelayQueue实现缓存设计

实体: public class MyDelayed implements Delayed { private String key; private long currentTime; private long expireTime; public MyDelayed(String key, long expireTime) { this.key=key; this.expireTime=expireTime; this

一点光辉的博客 288

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

线程安全的可控制最大容量且带有过期时间的本地缓存

作者|buren编辑|包包最近在公司优化一个接口的时候打算使用一个key-value结构的本地缓存。需要实现的功能非常简单:1、可以控制本地缓存的最大对象数量。2、线程安...

ifeves的博客 407

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

@cacheable 设置过期时间_手把手教你实现线程安全并且可以设置过期时间的LRU缓存。安排!

目录:1. LRU 缓存介绍2. ConcurrentLinkedQueue简单介绍3. ReadWriteLock简单介绍4.ScheduledExecutorService 简单介绍5. 徒手撸一个线程安全的 LRU 缓存6. 实现一个线程安全并且带有过期时间的 LRU 缓存很多人就会问了:“网上已经有这么多现成的缓存了!为什么面试官还要我们自己实现一个呢?” 。咳咳咳,当然是为了面试需要。哈...

weixin_39692830的博客 1097

Java使用ConcurrentHashMap实现简单的内存式缓存

需求说明: 实际项目中我打算把用户和组织信息放到缓存中,基于此提出以下几点需求: 1.数据存储在内存中; 2.允许以键值对的方式存储对象类数据并带有过期策略; 3.不限制内存使用,但cache也不能给我报出OutOfMemoryErrormemory异常; 4.cache要自动清理过期对象 5.线程安全 为了满足以上需求,本例子中主要使用了以下技术: 1.ConcurrentHashMap...

老徐的博客只有干货 3977

Java过期时间缓存-ConcurrentHashMap实现

LocalCache 实现代码 package xyz.biandeshen.commonstests.util; import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.util.Objects; import java.util.concurrent.*; import java.util....

biandesheng的博客 1438

设计一个带有过期时间的缓存系统

本文设计并实现了一个简单的带有过期时间的缓存系统。通过CacheItem和Cache类的设计,我们实现了一个基于时间戳的过期机制,确保缓存数据在过期后能够被正确清除。通过使用,我们保证了缓存系统在多线程环境下的安全性。这样的缓存系统能够广泛应用于需要高效缓存和数据过期管理的场景,尤其是在处理大量动态数据时,缓存能够显著提高应用的性能。改进与扩展:LRU:可以为缓存添加 LRU(最近最少使用)策略,以便在缓存满时自动清除最久未使用的缓存项。持久化。

lssffy的博客 1141

高薪必备:如何实现带有过期时间的LRU?(java版)

在很早之前学操作系统的时候见过这个算法,后来见到的越来越多,以至于刷面经的时候也看到了,总结一下: 一、什么是LRU LRU全称是Least Recently Used,即最近最久未使用的意思。也就是说:如果一个数据在最近一段时间没有被使用,将来被使用的机会也比较小。 通常的使用场景就是缓存,比如说操作系统中的页面置换算法。实现的方案有很多,我看了很多博客,大多是给了四五种。这里为了简洁,只给出一种,是带有过期时间的。其他的实现类似,就交给聪明的你吧!! 解决方案:利用链表加HashMap 每次来一个新数

冯冬冬的博客 1万+
上一篇: Java集合之Map集合(HashMap、Hashtable、TreeMap和 LinkHashMap)详细介绍
下一篇: Java8 新特性 使用lambda表达式对map集合求和,或平均值、最大值、最小值
Monika、
博客等级 码龄7年 16粉丝 67原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Monika、

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

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

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

打赏作者

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

抵扣说明:

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

余额充值