`
zysnba
  • 浏览: 183779 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

java带有效期的map

阅读更多
package com.www.test;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
* * * @Description: 带有效期map 简单实现 实现了基本的方法 * @author: zysnba * @date: 2018-10-19
* 下午5:08:46 * @param <K> * @param <V>
*/
public class ExpiryMap<K, V> extends HashMap<K, V> {
private static final long serialVersionUID = 1L;
/** * default expiry time 2m */
private long EXPIRY = 1000 * 60 * 2;
private HashMap<K, Long> expiryMap = new HashMap<>();

public ExpiryMap() {
super();
}

public ExpiryMap(long defaultExpiryTime) {
this(1 << 4, defaultExpiryTime);
}

public ExpiryMap(int initialCapacity, long defaultExpiryTime) {
super(initialCapacity);
this.EXPIRY = defaultExpiryTime;
}

public V put(K key, V value) {
expiryMap.put(key, System.currentTimeMillis() + EXPIRY);
return super.put(key, value);
}

public boolean containsKey(Object key) {
return !checkExpiry(key, true) && super.containsKey(key);
}

/** * @param key * @param value * @param expiryTime 键值对有效期 毫秒 * @return */
public V put(K key, V value, long expiryTime) {
expiryMap.put(key, System.currentTimeMillis() + expiryTime);
return super.put(key, value);
}

public int size() {
return entrySet().size();
}

public boolean isEmpty() {
return entrySet().size() == 0;
}

public boolean containsValue(Object value) {
if (value == null)
return Boolean.FALSE;
Set<java.util.Map.Entry<K, V>> set = super.entrySet();
Iterator<java.util.Map.Entry<K, V>> iterator = set.iterator();
while (iterator.hasNext()) {
java.util.Map.Entry<K, V> entry = iterator.next();
if (value.equals(entry.getValue())) {
if (checkExpiry(entry.getKey(), false)) {
iterator.remove();
return Boolean.FALSE;
} else
return Boolean.TRUE;
}
}
return Boolean.FALSE;
}

public Collection<V> values() {
Collection<V> values = super.values();
if (values == null || values.size() < 1)
return values;
Iterator<V> iterator = values.iterator();
while (iterator.hasNext()) {
V next = iterator.next();
if (!containsValue(next))
iterator.remove();
}
return values;
}

public V get(Object key) {
if (key == null)
return null;
if (checkExpiry(key, true))
return null;
return super.get(key);
}

/**
* * * @Description: 是否过期 * @param key * @return null:不存在或key为null -1:过期
* 存在且没过期返回value 因为过期的不是实时删除,所以稍微有点作用
*/
public Object isInvalid(Object key) {
if (key == null)
return null;
if (!expiryMap.containsKey(key)) {
return null;
}
long expiryTime = expiryMap.get(key);
boolean flag = System.currentTimeMillis() > expiryTime;
if (flag) {
super.remove(key);
expiryMap.remove(key);
return -1;
}
return super.get(key);
}

public void putAll(Map<? extends K, ? extends V> m) {
for (Map.Entry<? extends K, ? extends V> e : m.entrySet())
expiryMap.put(e.getKey(), System.currentTimeMillis() + EXPIRY);
super.putAll(m);
}

public Set<Map.Entry<K, V>> entrySet() {
Set<java.util.Map.Entry<K, V>> set = super.entrySet();
Iterator<java.util.Map.Entry<K, V>> iterator = set.iterator();
while (iterator.hasNext()) {
java.util.Map.Entry<K, V> entry = iterator.next();
if (checkExpiry(entry.getKey(), false))
iterator.remove();
}
return set;
}

/**
* * * @Description: 是否过期 * @author: zysnba * @date: 2018-10-19 下午5:05:02
* * @param expiryTime true 过期 * @param isRemoveSuper true super删除 * @return
*/
private boolean checkExpiry(Object key, boolean isRemoveSuper) {
if (!expiryMap.containsKey(key)) {
return Boolean.FALSE;
}
long expiryTime = expiryMap.get(key);
boolean flag = System.currentTimeMillis() > expiryTime;
if (flag) {
if (isRemoveSuper)
super.remove(key);
expiryMap.remove(key);
}
return flag;
}

public static void main(String[] args) throws InterruptedException {
// 5000毫秒数,默认两分钟
ExpiryMap<String, String> map = new ExpiryMap<>(5000);
map.put("test", "zysnba");
map.put("test1", "zysnba");
map.put("test2", "zysnba", 3000);// 三秒过期
Thread.sleep(4000);
System.out.println("isInvalid:" + map.isInvalid("test"));
System.out.println("size:" + map.size());
System.out.println("size:" + ((HashMap<String, String>) map).size());
Thread.sleep(3000);
for (Map.Entry<String, String> m : map.entrySet()) {
System.out.println("isInvalid:" + map.isInvalid(m.getKey()));
map.containsKey(m.getKey());
System.out.println("key:" + m.getKey() + " value:" + m.getValue());
}
System.out.println("test1" + map.get("test"));
}
}
分享到:
评论

相关推荐

    ExpiryMap.java

    有效期map 单例 有效期map 有效期map 单例 有效期map 有效期map 单例 有效期map 有效期map 单例 有效期map

    java map 实现缓存技术

    缓存中的数据不是永久存储的,通常会有一个有效期,过了这个期限,数据就会被自动清除,以防止占用过多内存或保持数据的新鲜度。这里的时间Out参数表示缓存的超时时间,将其乘以1000是为了将秒转换为毫秒,因为Java...

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

    ExpiryMap是继承至HashMap,重写了所有对外的方法,对每个key值都设置了有效期。它使用单例模式获取map,确保线程安全。 5. Java缓存Map设置过期时间实现解析的优点: 使用Java缓存Map设置过期时间可以解决项目中...

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

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

    进击的Java 第16期

    ### 进击的Java 第16期:提升与探索 #### 概述 本期主题聚焦于Java编程语言的提升与探索,旨在通过一系列的技术文章、人物访谈和技术实践,帮助读者更好地理解和掌握Java及其周边生态。从Java语言本身的优势讨论到...

    优惠券有效期

    ### 优惠券有效期判断知识点详解 #### 一、概述 在电子商务系统中,优惠券是一种常用的促销手段,通过设置不同的优惠条件吸引用户消费。而优惠券的有效期管理是确保用户体验和商家利益的重要环节之一。本文将围绕...

    Java利用ConcurrentHashMap实现本地缓存demo

    Java利用ConcurrentHashMap实现本地缓存demo;...基本功能有缓存有效期、缓存最大数、缓存存入记录、清理线程、过期算法删除缓存、LRU算法删除、获取缓存值等功能。 复制到本地项目的时候,记得改包路径哦~

    侯捷-java编程思想.pdf

    4. **集合框架**:Java集合框架是编程中的重要部分,书中详尽解析了List、Set、Queue和Map接口,以及ArrayList、LinkedList、HashSet、HashMap等具体实现类的使用和特性。 5. **泛型**:侯捷讲解了Java泛型的引入,...

    黑马程序员java基础试题、笔记

    前几期学员入学面试总结包含了过往学员面试的经验和常见问题,可以帮助学习者了解面试官通常关注的知识点,以及如何有效地准备面试。这其中包括了对Java集合框架的理解(List、Set、Map接口及其实现类)、异常处理、...

    黑马程序员_Java基础辅导班教程课件[第01期]第14天

    集合框架包括List、Set和Map接口,以及ArrayList、LinkedList、HashSet、HashMap等具体实现类。了解并熟练使用这些集合类,可以有效地管理和操作数据。 总的来说,黑马程序员的Java基础辅导班教程旨在通过第14天的...

    java核心卷I源码

    4. **掌握接口和泛型**:Java的核心卷I源码会涵盖接口的使用,以及泛型在容器类(如List、Set、Map)中的应用,这对于编写可复用和类型安全的代码至关重要。 5. **理解集合框架**:Java集合框架是编程中常用的工具...

    黑马程序员_Java基础辅导班教程课件[第01期]第15天

    《黑马程序员_Java基础辅导班教程课件[第01期]第15天》是针对初学者设计的一堂深入浅出的Java编程课程,旨在帮助学员巩固和深化Java基础知识。这堂课件涵盖的内容广泛且实用,对于想要在IT行业中开启Java开发旅程的...

    java学习150个经典的例子

    7. **集合框架**:Java集合框架包括List、Set、Map等接口和ArrayList、HashSet、HashMap等实现类。通过实例,你可以学习如何存储和操作数据,理解它们之间的区别和应用场景。 8. **输入输出流**:Java I/O流用于...

    又拍云 java对接

    例如,生成一个有效期为30分钟的下载链接: ```java Date expires = new Date(new Date().getTime() + 1800 * 1000); // 30分钟后过期 String signedUrl = upyun.getDownloadURL("/remotePath", expires, null); ...

    Java实现五分钟内重复获取返回同一个短信验证码

    当我们生成一个新的验证码时,先检查当前用户(通过手机号或者其他标识)是否已有未过期的验证码,如果有则直接返回,否则生成新的验证码并设置有效期为5分钟: ```java import java.util.HashMap; import java....

    java操作Redis缓存设置过期时间的方法

    Java 操作 Redis 缓存设置过期时间的方法 Java 操作 Redis 缓存设置过期时间是指在 Java 应用程序中使用 Redis 缓存时设置缓存项的过期时间,以便自动删除缓存项。下面将详细介绍 Java 操作 Redis 缓存设置过期...

    java自定义实现验证码功能

    - 添加时间戳或会话ID,限制验证码的有效期。 - 使用更复杂的图像噪声,避免被OCR识别。 - 考虑使用更安全的存储方式,如加密验证码后存入Session。 这个自定义验证码功能易于集成和维护,可以根据项目的具体需求...

Global site tag (gtag.js) - Google Analytics