当前位置: 首页 > 面试题库 >

在固定的超时时间内缓存单个对象的最佳方法是什么?

闾丘淇
2023-03-14
问题内容

Google
Guava具有CacheBuilder,它允许使用到期密钥创建ConcurrentHash,从而允许在固定的平局之后删除条目。但是,我只需要缓存一个特定类型的实例。

使用Google Guava在固定的超时时间内缓存单个对象的最佳方法是什么?


问题答案:

我会用番石榴的Suppliers.memoizeWithExpiration(供应商委托,持续时间长,TimeUnit单位)

public class JdkVersionService {

    @Inject
    private JdkVersionWebService jdkVersionWebService;

    // No need to check too often. Once a year will be good :) 
    private final Supplier<JdkVersion> latestJdkVersionCache
            = Suppliers.memoizeWithExpiration(jdkVersionSupplier(), 365, TimeUnit.DAYS);


    public JdkVersion getLatestJdkVersion() {
        return latestJdkVersionCache.get();
    }

    private Supplier<JdkVersion> jdkVersionSupplier() {
        return new Supplier<JdkVersion>() {
            public JdkVersion get() {
                return jdkVersionWebService.checkLatestJdkVersion();
            }
        };
    }
}

今天,我将使用JDK 8方法参考和构造函数注入来编写更清晰的代码,以不同的方式编写此代码:

import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import com.google.common.base.Suppliers;

@Service
public class JdkVersionService {

    private final Supplier<JdkVersion> latestJdkVersionCache;

    @Inject
    public JdkVersionService(JdkVersionWebService jdkVersionWebService) {
        this.latestJdkVersionCache = Suppliers.memoizeWithExpiration(
                jdkVersionWebService::checkLatestJdkVersion,
                365, TimeUnit.DAYS
        );
    }

    public JdkVersion getLatestJdkVersion() {
        return latestJdkVersionCache.get();
    }
}


 类似资料:
  • 问题内容: 我在想这样的UTC时间字符串可能是可以的,因为如果在视图键中使用它们,则可以正确排序,但是存储时区(例如)会使文档更具可读性。从可读性的角度来看,将日期转换为纪元整数似乎没有什么吸引力,但对于性能而言可能是最好的选择(或者是否有所作为?)。这里推荐的做法是什么? 问题答案: 时间是一维的东西。时间戳加上时区是二维的,描述了时间点和位置。Couch视图是一维的(但不是GeoCouch插件

  • 问题内容: 我们有两个PHP5对象,并希望将其中一个的内容合并到第二个中。它们之间没有子类的概念,因此以下主题中描述的解决方案不适用。 备注: 这些是对象,而不是类。 对象包含很多字段,所以 foreach 会很慢。 到目前为止,我们考虑将对象A和B转换为数组,然后在重新转换为对象之前使用 array_merge() 合并它们,但是我们不能为此感到骄傲。 问题答案: 如果您的对象仅包含字段(没有方

  • 问题内容: 我有一个应用程序,它读取带有大量数据行的CSV文件。我根据数据类型为用户提供了行数的摘要,但我想确保不会读取太多的数据行并导致OutOfMemoryErrors。每行转换为一个对象。有没有一种简便的方法以编程方式找出该对象的大小?是否有一个引用定义了一个原始类型和对象引用有多大VM? 现在,我的代码可以读取多达32,000行,但我还想让代码显示尽可能多地读取行,直到使用32 MB内存为

  • null 将整个object1作为完整的JSON存储在my key下。 将object2与它自己的键一起存储在我的object1序列化中,以将object2键作为引用,并且当从缓存中拉回时,也通过它的键拉出object2。 我觉得选项1是最好的实践,也是最有效的,但我有第二个想法,将大的嵌套对象存储在on键下。

  • 我遇到了一个问题。我的网页有一个控件。值更改后(通过选择不同的值),页面将刷新并呈现内容。 下面是我的代码: 第二部分:

  • 问题内容: 我正在使用一个表单小部件,供用户在文本输入中输入一天的时间(对于日历应用程序)。我想使用JavaScript(我们使用的是jQuery FWIW)来解析用户输入到JavaScript 对象中的文本的最佳方法,以便我可以轻松地执行比较和其他操作。 我尝试了该方法,但对于我的需求来说有点挑剔。我希望它能够成功地将以下示例输入时间(除了其他逻辑上相似的时间格式)解析为同一对象: 1:00 p