返回顶部
首页 > 资讯 > 后端开发 > Python >Java如何设置过期时间的map的几种方法
  • 508
分享到

Java如何设置过期时间的map的几种方法

2024-04-02 19:04:59 508人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录一、技术背景二、技术效果三、ExpiringMap3.1功能简介3.2源码3.3示例四、LoadinGCache4.1功能简介4.2示例4.3移除机制4.4其他五、HashMap

一、技术背景

在实际的项目开发中,我们经常会使用到缓存中间件(如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()。

五、HashMap的封装

我们可以参考上面两个工具包的思路,自己封装一个可以设置过时时间的HashMap来实现我们想要的效果。

到此这篇关于Java如何设置过期时间的map的几种方法的文章就介绍到这了,更多相关Java 过期时间map内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java如何设置过期时间的map的几种方法

本文链接: https://lsjlt.com/news/142700.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java如何设置过期时间的map的几种方法
    目录一、技术背景二、技术效果三、ExpiringMap3.1功能简介3.2源码3.3示例四、LoadingCache4.1功能简介4.2示例4.3移除机制4.4其他五、HashMap...
    99+
    2024-04-02
  • localStorage过期时间设置的几种方法
    目录问题描述 1. 初级解法 2. 中级解法 3. 高级解法 4. 骨灰级解法 聊到 localStorage 想必熟悉前端的朋友都不会陌生, 我们可以使用它提供的 getItem,...
    99+
    2024-04-02
  • Java怎么设置过期时间的map
    这篇文章给大家分享的是有关Java怎么设置过期时间的map的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、技术背景在实际的项目开发中,我们经常会使用到缓存中间件(如redis、MemCache等)来帮助我们提高...
    99+
    2023-06-29
  • 如何设置localStorage的过期时间
    这期内容当中小编将会给大家带来有关如何设置localStorage的过期时间,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。<script type="text/javascrip...
    99+
    2023-06-09
  • redis如何设置过期时间
    redis如何设置过期时间?相信很多新手小白还没学会这个技能,通过这篇文章的总结,希望你能学会这个技能。以下资料是实现的步骤。1、Redis中key的过期时间通过EXPIRE key seconds命令来设...
    99+
    2024-04-02
  • 如何设置合适的redis过期时间
    这篇文章运用简单易懂的例子给大家介绍如何设置合适的redis过期时间,代码非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。          ...
    99+
    2024-04-02
  • Springsecurity Oauth2如何设置token的过期时间
    1.设置token的过期时间 如果我们是从数据库来读取客户端信息的话 我们只需要在数据库设置token的过期时间 1.1 oauth_client_details表每个列的作...
    99+
    2024-04-02
  • php redis如何设置过期时间
    本文将为大家详细介绍“php redis如何设置过期时间”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“php redis如何设置过期时间”能够给你意想不到的收获,请大家跟着小编的思路慢慢深入,具体内容如下,一...
    99+
    2023-06-06
  • redis如何设置不过期时间
    在 Redis 中设置键不过期的方法有两种:1. 不设置过期时间:在设置键时,不指定过期时间参数即可。例如使用 `SET key v...
    99+
    2023-09-05
    redis
  • localStorage设置有效期和过期时间的简单方法
    目录前言实现思路实现代码总结前言 总所周知localStorage默认是不会过期的,也没有可设置过期的api,如果要实现过期清除就需要自己实现一个api 实现思路 在Storage原...
    99+
    2024-04-02
  • Redis设置key的过期时间
    Redis中可以设置数据的过期时间,一旦过期自动删除数据。 1.设置过期时间 expire 127.0.0.1:6379> set name "ok" //设置10s后过期,e...
    99+
    2023-01-28
    Redis设置key过期时间 Redis key过期时间
  • springboot项目如何设置session的过期时间
    目录这里我们只介绍springboot2.0的session时间设置下面这种方式是设置24小时的或者使用第二种方式springboot设置session失效的几种方式如果是1.5.6...
    99+
    2024-04-02
  • 聊聊Vue提示框设置时间的几种方法
    Vue是一种流行的JavaScript框架,用于构建现代和交互式的Web应用程序。提示框是一个常用的UI组件,可以帮助用户在需要时快速了解信息。在Vue中,可以使用各种库和组件来创建提示框,其中包括一些具有时间参数的选项。本文将讨论Vue提...
    99+
    2023-05-14
  • PHP如何将cookie的过期时间设置为过去
    这篇文章主要介绍了PHP如何将cookie的过期时间设置为过去,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。将cookie的过期时间设置为过去<phpsetcookie...
    99+
    2023-06-17
  • localStorage如何设置有效期和过期时间
    这篇文章将为大家详细讲解有关localStorage如何设置有效期和过期时间,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。实现思路在Storage原型上新增两个方法setCanExpireLocal,ge...
    99+
    2023-06-29
  • redis缓存过期时间如何设置
    在Redis中,可以通过使用EXPIRE命令来设置缓存的过期时间。语法如下:```EXPIRE key seconds```其中,k...
    99+
    2023-08-30
    redis
  • 如何使用localStorage 设置过期时间
    这篇文章将为大家详细讲解有关如何使用localStorage 设置过期时间,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。localStorage除非人为手动清除,否则会一直存放在浏览器中,但...
    99+
    2023-06-09
  • redis如何批量设置过期时间
    在Redis中,可以使用EXPIRE命令来为多个key设置过期时间,例如: EXPIRE key1 10 EXPIRE key2 2...
    99+
    2024-04-09
    redis
  • 如何在Redis中设置过期时间
    在Redis中设置过期时间可以使用EXPIRE命令或者EXPIREAT命令。 使用EXPIRE命令设置过期时间: EXPIRE ...
    99+
    2024-04-09
    Redis
  • asp中设置session过期时间方法总结
    在ASP中,可以使用以下几种方法来设置session过期时间:1. 在web.config文件中配置session过期时间:可以在w...
    99+
    2023-08-17
    asp
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作