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; }
首先,需要理解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中? 有人可以帮我这个吗。 我正在尝试获取给定日期的星期日期,我已经解释了为什么这个问题不是重复的,请在评论前阅读。 问题答案: 您可以尝试以下方式, 输出值
假设我的XML如下所示
问题内容: 我遇到了这个问题,我不知道需要迭代其实际值的实际类型。 任何想法如何从enumValue中提取其可能的值? 问题答案:
问题内容: 我最近遇到了一项任务,必须在日期范围内获得所有星期五。我写了一小段代码,很惊讶地看到一些奇怪的行为。 下面是我的代码: 现在,当我运行代码时,我注意到缺少2011年的星期五。经过一些调试和在线浏览后,我发现这是特定于区域设置的,我必须使用它来修复它。 因此,在上面的代码中未注释相关行。 据我了解,一年的第一周应该从一年的整个星期开始。 例如,2010年1月1日是星期五。但它不会显示在结
问题内容: 在新API中是否有可能获取 两个日期之间的所有日期? 假设我有这部分代码: 现在我需要介于和之间的所有日期。 我正在考虑获取两个日期中的一个并进行迭代: 有没有更好的方法来获取日期? 问题答案: 假设您主要想在日期范围内进行迭代,那么创建一个可迭代的类将很有意义。那可以让你写: 就像是: 添加equals和hashcode方法,getter可能很有意义,也许有一个静态工厂+私有构造函数
我希望以(或)的格式,以60秒为增量生成两个日期之间的日期+时间列表。 到目前为止,我已经能够使用对象生成两个日期之间的所有日期: } 但是,我希望修改它,以便它每次使用对象以60秒的增量生成(即,它将生成1440个值,而不是每天生成一个值,因为假设开始和结束时间只有一天,每小时有60分钟,每天24小时) 谢谢