当前位置: 首页 > 知识库问答 >
问题:

java - Java中memcached 如何获取所有未过期的key?

高正初
2023-12-18

Java中memcached 如何获取所有未过期的key?下面写了一个获取所有key的方法,但是会得到过期的key,如何过滤掉?

public static List<String> getAllKey(String reg) {        List<String> keylist = new ArrayList<String>();        Map<String, Map<String, String>> statsItems = memcachedClient.statsItems(); //获取所有items        Map<String, String> statsItems_sub = null;        String server = null;        String statsItems_sub_key = null;        int items_number = 0;        Map<String, Map<String, String>> statsCacheDump = null;        Map<String, String> statsCacheDump_sub = null;        String statsCacheDumpsub_key = null;        for (Iterator<String> iterator = statsItems.keySet().iterator(); iterator.hasNext(); ) {            server = iterator.next(); //server地址            keylist.add(server);            statsItems_sub = statsItems.get(server);            for (Iterator<String> iterator_item = statsItems_sub.keySet().iterator(); iterator_item.hasNext(); ) {                statsItems_sub_key = iterator_item.next();                if (statsItems_sub_key.toUpperCase().startsWith("items:".toUpperCase()) && statsItems_sub_key.toUpperCase().endsWith(":number".toUpperCase())) {                    items_number = Integer.parseInt(statsItems_sub.get(statsItems_sub_key).trim());                    statsCacheDump = memcachedClient.statsCacheDump(new String[]{server}, Integer.parseInt(statsItems_sub_key.split(":")[1].trim()), items_number); //获取一个item                    for (Iterator<String> statsCacheDump_iterator = statsCacheDump.keySet().iterator(); statsCacheDump_iterator.hasNext(); ) {                        statsCacheDump_sub = statsCacheDump.get(statsCacheDump_iterator.next());                        for (Iterator<String> iterator_keys = statsCacheDump_sub.keySet().iterator(); iterator_keys.hasNext(); ) {                            statsCacheDumpsub_key = (String) iterator_keys.next(); //获取item的key                            if(statsCacheDumpsub_key.contains(reg)){                                keylist.add(statsCacheDumpsub_key);                            }                        }                    }                }            }        }        return keylist;    }

共有1个答案

颛孙智勇
2023-12-18

首先,需要理解statsCacheDump方法返回的是服务器上所有缓存的详细信息,包括键、大小、最后修改时间、到期时间等。这些信息被组织成不同的块,每个块包含一组缓存项。每个缓存项都包含一个键、一个值以及与之相关的元数据。

在你的代码中,你正在遍历每个缓存项的键,并检查它们是否包含你提供的正则表达式。但是,这并没有过滤掉过期的键,因为过期的键和不过期的键在缓存项的元数据中都有相同的键。

为了过滤掉过期的键,你需要查看每个缓存项的到期时间。在Memcached中,每个缓存项都有一个与之相关的到期时间,这个时间表示该缓存项在多少秒后过期。你可以查看这个到期时间,并过滤掉那些已经过期的缓存项。

不幸的是,Java的Memcached客户端库并不直接提供获取所有未过期键的方法。你需要自己编写代码来遍历所有缓存项,并检查它们的到期时间。以下是一个可能的解决方案:

public static List<String> getAllNonExpiredKeys(String reg) {    List<String> keylist = new ArrayList<String>();    Map<String, Map<String, String>> statsItems = memcachedClient.statsItems(); //获取所有items    Map<String, String> statsItems_sub = null;    String server = null;    String statsItems_sub_key = null;    int items_number = 0;    Map<String, Map<String, String>> statsCacheDump = null;    Map<String, String> statsCacheDump_sub = null;    String statsCacheDumpsub_key = null;    for (Iterator<String> iterator = statsItems.keySet().iterator(); iterator.hasNext(); ) {        server = iterator.next(); //server地址        keylist.add(server);        statsItems_sub = statsItems.get(server);        for (Iterator<String> iterator_item = statsItems_sub.keySet().iterator(); iterator_item.hasNext(); ) {            statsItems_sub_key = iterator_item.next();            if (statsItems_sub_key.toUpperCase().startsWith("items:".toUpperCase()) && statsItems_sub_key.toUpperCase().endsWith(":number".toUpperCase())) {                items_number = Integer.parseInt(statsItems_sub.get(statsItems_sub_key).trim());                statsCacheDump = memcachedClient.statsCacheDump(new String[]{server}, Integer.parseInt(statsItems_sub_key.split(":")[1].trim()), items_number); //获取一个item                for (Iterator<String> statsCacheDump_iterator = statsCacheDump.keySet().iterator(); statsCacheDump_iterator.hasNext(); ) {                    statsCacheDump_sub = statsCacheDump.get(statsCacheDump_iterator.next());                    for (Iterator<String> iterator_keys = statsCacheDump_sub.keySet().iterator(); iterator_keys.hasNext(); ) {                        statsCacheDumpsub_key = (String) iterator_keys.next(); //获取item的key                        if(statsCacheDumpsub_key.contains(reg) && !isExpired(statsCacheDumpsub_key, statsCacheDump_sub)){                            keylist.add(statsCacheDumpsub_key);                        }                    }                }            }        }    }    return keylist;}private static boolean isExpired(String key, Map<String, String> item) {    // 获取过期时间字符串,例如 "exptime:1647434807"    String expTimeStr = item.get("exptime");     if (expTimeStr != null) {        long expTime = Long.parseLong(expTimeStr.split(":")[1]); // 解析过期时间(秒)        return System.currentTimeMillis() / 1000 > expTime; // 检查是否过期(当前时间大于过期时间)    } else {        return false; // 如果未设置过期时间,则认为未过期    }}

在这个代码中,我增加了一个名为isExpired的方法来检查每个缓存项是否已经过期。这个方法首先获取缓存项的过期时间字符串,然后解析这个字符串以获取过期时间(以秒为单位)。然后,它检查当前时间是否大于过期时间,如果是,则认为该缓存项已经过期。

 类似资料:
  • 问题内容: 我有一个日期,以及如何使所有日期都落在给定日期所属的一周的Java中? 有人可以帮我这个吗。 我正在尝试获取给定日期的星期日期,我已经解释了为什么这个问题不是重复的,请在评论前阅读。 问题答案: 您可以尝试以下方式, 输出值

  • 问题内容: 我遇到了这个问题,我不知道需要迭代其实际值的实际类型。 任何想法如何从enumValue中提取其可能的值? 问题答案:

  • 问题内容: 我最近遇到了一项任务,必须在日期范围内获得所有星期五。我写了一小段代码,很惊讶地看到一些奇怪的行为。 下面是我的代码: 现在,当我运行代码时,我注意到缺少2011年的星期五。经过一些调试和在线浏览后,我发现这是特定于区域设置的,我必须使用它来修复它。 因此,在上面的代码中未注释相关行。 据我了解,一年的第一周应该从一年的整个星期开始。 例如,2010年1月1日是星期五。但它不会显示在结

  • 问题内容: 在新API中是否有可能获取 两个日期之间的所有日期? 假设我有这部分代码: 现在我需要介于和之间的所有日期。 我正在考虑获取两个日期中的一个并进行迭代: 有没有更好的方法来获取日期? 问题答案: 假设您主要想在日期范围内进行迭代,那么创建一个可迭代的类将很有意义。那可以让你写: 就像是: 添加equals和hashcode方法,getter可能很有意义,也许有一个静态工厂+私有构造函数

  • 我希望以(或)的格式,以60秒为增量生成两个日期之间的日期+时间列表。 到目前为止,我已经能够使用对象生成两个日期之间的所有日期: } 但是,我希望修改它,以便它每次使用对象以60秒的增量生成(即,它将生成1440个值,而不是每天生成一个值,因为假设开始和结束时间只有一天,每小时有60分钟,每天24小时) 谢谢