iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java带有过期时间的LRU实现方法是什么
  • 626
分享到

Java带有过期时间的LRU实现方法是什么

2023-06-16 08:06:31 626人浏览 泡泡鱼
摘要

本篇内容主要讲解“Java带有过期时间的LRU实现方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java带有过期时间的LRU实现方法是什么”吧!一、什么是LRULRU全称是Least

本篇内容主要讲解“Java带有过期时间的LRU实现方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java带有过期时间的LRU实现方法是什么”吧!

一、什么是LRU

LRU全称是Least Recently  Used,即最近最久未使用的意思。也就是说:如果一个数据在最近一段时间没有被使用,将来被使用的机会也比较小。

通常的使用场景就是缓存,比如说操作系统中的页面置换算法。实现的方案有很多,我看了很多博客,大多是给了四五种。这里为了简洁,只给出一种,是带有过期时间的。其他的实现类似,就交给聪明的你吧!!

解决方案:利用链表加HashMap

每次来一个新数据,首先判断map中是否含有,有的话就移动到队头,没有的话就新建一个节点,然后放进来就好,对于带过期时间的功能,只需要为每一个节点放一个过期时间,只要到了这个时间就直接删除即可。

还有一个问题:多线程环境下应该加,为了保证锁的灵活性,我们使用ConcurrentHashMap

OK,下面我们就开始实现:

二、代码实现

1、定义节点

//这个node对用HashMap中每一个节点 class Node implements Comparable<Node> {     private String key;     private Object value;     private long expireTime;//注意这个过期时间是一个时间点,如11点11分     public Node(String key, Object value, long expireTime) {         this.value = value;         this.key = key;         this.expireTime = expireTime;     }     //按照过期时间进行排序     @Override     public int compareTo(Node o) {         long r = this.expireTime - o.expireTime;         if (r > 0)  return 1;         if (r < 0) return -1;         return 0;     } }

2、LRU实现

public class LRU {     // 变量1:用于设置清除过期数据的线程池     private static ScheduledExecutorService swapExpiredPool                    = new ScheduledThreadPoolExecutor(10);     // 变量2:用户存储数据,为了保证线程安全,使用了ConcurrentHashMap     private ConcurrentHashMap<String, Node> cache = new ConcurrentHashMap<>(1024);     // 变量3:保存最新的过期数据,过期时间最小的数据排在队列前     private PriorityQueue<Node> expireQueue = new PriorityQueue<>(1024);     // 构造方法:只要有缓存了,过期清除线程就开始工作     public LRU() {         swapExpiredPool.scheduleWithFixedDelay(new ExpiredNode(), 3,3,TimeUnit.SECONDS);     }     //还有代码。。。。。。。 }

现在我们定义了几个变量,然后还有一个构造方法,意思是只要启动了这个LRU,就开始清除。清除的线程是ExpiredNode。我们来看一下:

3、过期清除线程方法

这个方法也就是ExpiredNode,当做一个内部类在LRU中。

public class ExpiredNode implements Runnable {         @Override         public void run() {             // 第一步:获取当前的时间             long now = System.currentTimeMillis();             while (true) {                 // 第二步:从过期队列弹出队首元素,如果不存在,或者不过期就返回                 Node node = expireQueue.peek();                 if (node == null || node.expireTime > now)return;                 // 第三步:过期了那就从缓存中删除,并且还要从队列弹出                 cache.remove(node.key);                 expireQueue.poll();             }// 此过程为while(true),一直进行判断和删除操作         }     }

现在知道了过期清除方法,下面看看如何添加数据。

4、set方法

public Object set(String key, Object value, long ttl) {         // 第一步:获取过期时间点         long expireTime = System.currentTimeMillis() + ttl;         // 第二步:新建一个节点         Node newNode = new Node(key, value, expireTime);         // 第三步:cache中有的话就覆盖,没有就添加新的,过期时间队列也要添加         Node old = cache.put(key, newNode);         expireQueue.add(newNode);         // 第四步:如果该key存在数据,还要从过期时间队列删除         if (old != null) {             expireQueue.remove(old);             return old.value;         }         return null;     }

5、get方法

这个方法就比较简单了,直接获取即可。

public Object get(String key) {     //第一步:从cache直接获取,注意这个cache是一个HashMap     Node n = cache.get(key);     //第二步:如果n为空那就返回为null,不为空就返回相应的值     return n == null ? null : n.value; }

注意以上345的代码都存放在LRU中。

过期时间的我们已经知道了,其实就是添加了一个过期时间队列,和一个过期清除的线程,清除的时候使用while(true)每次判断队列队首是否过期,然后判断是否返回和清除。设置方法的时候还要把新的node添加到queue,把旧的移除掉。而且我们使用了ConcurrentHashMap保证了线程安全。

到此,相信大家对“Java带有过期时间的LRU实现方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Java带有过期时间的LRU实现方法是什么

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

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

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Java带有过期时间的LRU实现方法是什么
    本篇内容主要讲解“Java带有过期时间的LRU实现方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java带有过期时间的LRU实现方法是什么”吧!一、什么是LRULRU全称是Least ...
    99+
    2023-06-16
  • javascript实现日期转成时间戳的方法是什么
    本篇内容介绍了“javascript实现日期转成时间戳的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有...
    99+
    2024-04-02
  • LRU缓存算法的实现方法是什么
    这篇文章主要讲解了“LRU缓存算法的实现方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“LRU缓存算法的实现方法是什么”吧!LRU就是Least R...
    99+
    2024-04-02
  • localStorage设置有效期和过期时间的简单方法
    目录前言实现思路实现代码总结前言 总所周知localStorage默认是不会过期的,也没有可设置过期的api,如果要实现过期清除就需要自己实现一个api 实现思路 在Storage原...
    99+
    2024-04-02
  • java空间换时间的方法是什么
    Java空间换时间的方法是使用缓存。在程序运行过程中,将一些计算结果或者数据保存在缓存中,当需要使用的时候直接从缓存中取出,避免了重...
    99+
    2023-05-31
    java空间 java 空间
  • 什么时间是过期域名抢注的好时机
    什么时间是过期域名抢注的好时机?域名过期抢注是指在一个域名注册期满之后,未及时续费的情况下,其他人可以通过抢注来注册该域名。对于抢注者而言,选择一个好的时机是至关重要的。那么,什么时间是过期域名抢注的好时机呢?本文将对此进行讨论。 1.对...
    99+
    2024-01-23
    域名抢注 过期域名抢注 域名知识
  • oracle日期转成时间戳的方法是什么
    在Oracle中,可以使用TO_TIMESTAMP函数将日期转换为时间戳。以下是示例: SELECT TO_TIMESTAM...
    99+
    2024-04-09
    oracle
  • java实体类设置时间的方法是什么
    在Java中,可以使用`java.time`包中的类来设置时间。具体地,可以使用`LocalDateTime`类来设置日期和时间,使...
    99+
    2023-08-15
    java
  • Java如何设置过期时间的map的几种方法
    目录一、技术背景二、技术效果三、ExpiringMap3.1功能简介3.2源码3.3示例四、LoadingCache4.1功能简介4.2示例4.3移除机制4.4其他五、HashMap...
    99+
    2024-04-02
  • php将日期转为时间戳的方法是什么
    今天小编给大家分享一下php将日期转为时间戳的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、PHP日期转时间戳...
    99+
    2023-07-05
  • php将日期转成时间戳的方法是什么
    本文小编为大家详细介绍“php将日期转成时间戳的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“php将日期转成时间戳的方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、时间戳的定义时间戳是一...
    99+
    2023-07-05
  • php实现日期转unix时间戳的方法
    本文将为大家详细介绍“php实现日期转unix时间戳的方法”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“php实现日期转unix时间戳的方法”能够给你意想不到的收获,请大家跟着小编的思路慢慢深入,具体内容如下...
    99+
    2023-06-06
  • redis@Cacheable注解以及过期时间设置方式是什么
    redis@Cacheable注解以及过期时间设置方式是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。原理解释 友情链接  手写redis @ Ca...
    99+
    2023-06-22
  • Java生成日期时间存入Mysql数据库的实现方法
    目录一、创建数据库标准二、数据库表结构三、使用步骤一、创建数据库标准 1.表的必备三个字段:id、gmt_create、gmt_modified 2.gmt_create是创建时间,...
    99+
    2024-04-02
  • mongodb时间戳转时间的方法是什么
    在MongoDB中要将时间戳转换为时间,可以使用new Date(timestamp)方法。其中timestamp为时间戳的值,单位...
    99+
    2024-04-09
    mongodb
  • 网站ssl证书查询到期时间的方法是什么
    1. 使用浏览器查看SSL证书在浏览器中打开您的网站,然后点击地址栏左侧的锁图标,选择“证书”或“证书信息”等选项,即可查看SSL证...
    99+
    2023-05-24
    网站ssl证书查询 ssl证书
  • 过期域名抢注的方法是什么
    过期域名抢注的方法:1、关注域名到期时间,做好准备工作;2、保证网络速度,在域名到期后的数秒之内,尽快发起注册;3、使用专业的域名抢...
    99+
    2023-02-21
    过期域名抢注 域名
  • redis过期key处理的方法是什么
    Redis过期key的处理方法有以下几种:1. 被动删除:当客户端尝试访问一个已经过期的key时,Redis会立即删除该key,并返...
    99+
    2023-09-11
    redis
  • Unix中实时重定向的Java实现方法是什么?
    Unix系统中的实时重定向是一种非常实用的功能,它可以让我们将命令行输出直接重定向到指定的文件或设备上,而不需要等到命令执行完毕再进行输出。这种实时重定向在很多场景下都非常有用,比如在进行调试或者监控系统运行状态时,都可以使用实时重定向来...
    99+
    2023-10-02
    重定向 实时 unix
  • java实现mapreduce的方法是什么
    Java实现MapReduce的方法是使用Hadoop框架。Hadoop是一个开源的分布式计算框架,其中包含了MapReduce编程...
    99+
    2023-08-26
    java mapreduce
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作