我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java怎么设置过期时间的map

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java怎么设置过期时间的map

这篇文章给大家分享的是有关Java怎么设置过期时间的map的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

一、技术背景

在实际的项目开发中,我们经常会使用到缓存中间件(如redis、MemCache等)来帮助我们提高系统的可用性和健壮性。

但是很多时候如果项目比较简单,就没有必要为了使用缓存而专门引入Redis等等中间件来加重系统的复杂性。那么Java本身有没有好用的轻量级的缓存组件呢。

答案当然是有喽,而且方法不止一种。常见的解决方法有:ExpiringMap、LoadingCache及基于HashMap的封装三种。

二、技术效果

  • 实现缓存的常见功能,如过时删除策略

  • 热点数据预热

三、ExpiringMap

3.1 功能简介

  • 可设置Map中的Entry在一段时间后自动过期。

  • 可设置Map最大容纳值,当到达Maximum size后,再次插入值会导致Map中的第一个值过期。

  • 可添加监听事件,在监听到Entry过期时调度监听函数。

  • 可以设置懒加载,在调用get()方法时创建对象。

3.2 源码

github地址

3.3 示例

添加依赖(Maven)

<dependency>     <groupId>net.jodah</groupId>     <artifactId>expiringmap</artifactId>     <version>0.5.8</version> </dependency>

示例源码

public class ExpiringMapApp {    public static void main(String[] args) {        // maxSize: 设置最大值,添加第11个entry时,会导致第1个立马过期(即使没到过期时间)        // expiration:设置每个key有效时间10s, 如果key不设置过期时间,key永久有效。        // variableExpiration: 允许更新过期时间值,如果不设置variableExpiration,不允许后面更改过期时间,一旦执行更改过期时间操作会抛异常UnsupportedOperationException        // policy:        //        CREATED: 只在put和replace方法清零过期时间        //        ACCESSED: 在CREATED策略基础上增加, 在还没过期时get方法清零过期时间。        //        清零过期时间也就是重置过期时间,重新计算过期时间.        ExpiringMap<String, String> map = ExpiringMap.builder()            .maxSize(10)            .expiration(10, TimeUnit.SECONDS)            .variableExpiration().expirationPolicy(ExpirationPolicy.CREATED).build();        map.put("token", "lkj2412lj1412412nmlkjl2n34l23n4");        map.put("name", "管理员", 20000, TimeUnit.SECONDS);        // 模拟线程等待...        try {            Thread.sleep(15000);        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.println("token ===> " + map.get("token"));        System.out.println("name ===> " + map.get("name"));        // 注意: 在创建map时,指定的那些参数如过期时间和过期策略都是全局的, 对map中添加的每一个entry都适用.        //        在put一个entry键值对时可以对当前entry 单独设置 过期时间、过期策略,只对当前这个entry有效.    }}

运行结果

token ===> null
name ===> 管理员

注意
在创建map时,指定的那些参数如过期时间和过期策略都是全局的, 对map中添加的每一个entry都适用。
在put一个entry键值对时可以对当前entry 单独设置 过期时间、过期策略,只对当前这个entry有效.

四、LoadingCache

4.1 功能简介

Google开源出来的一个线程安全的本地缓存解决方案。

特点:提供缓存回收机制,监控缓存加载/命中情况,灵活强大的功能,简单易上手的api。

4.2 示例

源码

public class LoadingCacheApp {    public static void main(String[] args) throws Exception {        // maximumSize: 缓存池大小,在缓存项接近该大小时, Guava开始回收旧的缓存项        // expireAfterAccess: 设置时间对象没有被读/写访问则对象从内存中删除(在另外的线程里面不定期维护)        // removalListener: 移除监听器,缓存项被移除时会触发的钩子        // recordStats: 开启Guava Cache的统计功能        LoadingCache<String, String> cache = CacheBuilder.newBuilder()            .maximumSize(100)            .expireAfterAccess(10, TimeUnit.SECONDS)            .removalListener(new RemovalListener<String, String>() {                @Override                public void onRemoval(RemovalNotification<String, String> removalNotification) {                    System.out.println("过时删除的钩子触发了... key ===> " + removalNotification.getKey());                }            })            .recordStats()            .build(new CacheLoader<String, String>() {                // 处理缓存键不存在缓存值时的处理逻辑                @Override                public String load(String key) throws Exception {                    return "不存在的key";                }            });        cache.put("name", "小明");        cache.put("pwd", "112345");        // 模拟线程等待...        try {            Thread.sleep(15000);        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.println("token ===> " + cache.get("name"));        System.out.println("name ===> " + cache.get("pwd"));    }}

运行结果

过时删除的钩子触发了... key ===> name
token ===> 不存在的key
过时删除的钩子触发了... key ===> pwd
name ===> 不存在的key

4.3 移除机制

guava做cache时候数据的移除分为被动移除和主动移除两种。

被动移除

  • 基于大小的移除:数量达到指定大小,会把不常用的键值移除

  • 基于时间的移除:expireAfterAccess(long, TimeUnit) 根据某个键值对最后一次访问之后多少时间后移除。expireAfterWrite(long, TimeUnit) 根据某个键值对被创建或值被替换后多少时间移除

  • 基于引用的移除:主要是基于java的垃圾回收机制,根据键或者值的引用关系决定移除

主动移除

  • 单独移除:Cache.invalidate(key)

  • 批量移除:Cache.invalidateAll(keys)

  • 移除所有:Cache.invalidateAll()

如果配置了移除监听器RemovalListener,则在所有移除的动作时会同步执行该listener下的逻辑。

如需改成异步,使用:RemovalListeners.asynchronous(RemovalListener, Executor).

4.4 其他

  • 在put操作之前,如果已经有该键值,会先触发removalListener移除监听器,再添加

  • 配置了expireAfterAccess和expireAfterWrite,但在指定时间后没有被移除。

  • 删除策略逻辑:

CacheBuilder构建的缓存不会在特定时间自动执行清理和回收工作,也不会在某个缓存项过期后马上清理,它不会启动一个线程来进行缓存维护,因为首先线程相对较重,其次某些环境限制线程的创建。

它会在写操作时顺带做少量的维护工作,或者偶尔在读操作时做。当然,也可以创建自己的维护线程,以固定的时间间隔调用Cache.cleanUp()。

感谢各位的阅读!关于“Java怎么设置过期时间的map”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java怎么设置过期时间的map

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java怎么设置过期时间的map

这篇文章给大家分享的是有关Java怎么设置过期时间的map的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、技术背景在实际的项目开发中,我们经常会使用到缓存中间件(如redis、MemCache等)来帮助我们提高
2023-06-29

redis在java怎么设置过期时间

本篇文章详细介绍了在Java中使用Jedis和Lettuce库为Redis键设置过期时间的方法。过期时间的单位可以是秒、毫秒、微秒或毫微秒。过期时间可以覆盖现有过期时间,并可以近似获取键的剩余生存时间。除了上述方法,还可以使用PEXPIRE、PEXPIREAT和PXAT命令设置过期时间。
redis在java怎么设置过期时间
2024-04-02

redis怎么设置过期时间

redis中的过期时间自动删除超过生命周期的键,可有效缓存短暂有效期的数据。设置过期时间有两种方法:1. expire命令,设置过期时间(秒);2. pexpire命令,设置过期时间(毫秒)。可通过ttl命令查询过期时间,返回剩余过期时间(
redis怎么设置过期时间
2024-05-21

Redis怎么设置键的过期时间

在Redis中,可以使用EXPIRE命令或者SET命令的EX参数来设置键的过期时间。使用EXPIRE命令:EXPIRE key seconds其中,key是要设置过期时间的键名,seconds是过期的秒数。例如,要让键mykey在60秒
Redis怎么设置键的过期时间
2024-05-07

java如何设置redis过期时间

如何设置Redis过期时间(Java版)本文详细介绍了使用Java在Redis中设置过期时间的方法,包括EXPIRE、EXPIREAT、SETEX、PSETEX和PERSIST命令。还提供了最佳实践建议,例如根据键值对访问频率设置过期时间、使用SCAN命令删除过期键值对以及使用Redis的过期策略功能。
java如何设置redis过期时间
2024-04-02

redis怎么设置默认的过期时间

在Redis中,可以使用`EXPIRE`命令设置键的过期时间。但是,如果你想要为所有键设置一个默认的过期时间,可以使用Redis的`CONFIG`命令来修改`timeout`属性。下面是设置默认过期时间的步骤:1. 使用`CONFIG GE
2023-09-06

MySQL怎么设置数据过期时间

MySQL本身不支持设置数据的过期时间,但可以通过以下方法实现类似的功能:使用触发器:可以创建一个定时触发器,定期删除或更新过期的数据。使用定时任务:可以定期执行一个脚本或程序,删除或更新过期的数据。使用程序控制:在应用程序中设置数据的过期
MySQL怎么设置数据过期时间
2024-04-26

Redis怎么批量设置过期时间

这篇文章将为大家详细讲解有关Redis怎么批量设置过期时间,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Redis如何批量设置过期时间呢?不要说在foreach中通过set()函数批量设置过期时间我们引入
2023-06-21

asp中怎么设置session过期时间

在ASP中,可以通过设置Session对象的Timeout属性来设置Session的过期时间。Timeout属性表示Session的有效期,单位为分钟。例如,将Session的过期时间设置为30分钟:```Session.Timeout =
2023-08-18

Redis设置key的过期时间

本文主要介绍了Redis设置key的过期时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-01-28

springboot项目怎么设置session的过期时间

小编今天带大家了解springboot项目怎么设置session的过期时间,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“spring
2023-06-29

如何设置localStorage的过期时间

这期内容当中小编将会给大家带来有关如何设置localStorage的过期时间,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。