【问题标题】:hello world example for ehcache?ehcache 的 hello world 示例?
【发布时间】:2011-06-02 11:45:54
【问题描述】:

ehcache 是一个高度可配置的野兽,示例相当复杂,通常涉及多层接口。

有没有人遇到过最简单的例子,它只是在内存中缓存单个数字之类的东西(不是分布式的,没有 XML,尽可能少的 java 行)。然后该数字会被缓存 60 秒,然后下一个读取请求会使其获得一个新值(例如,通过调用 Random.nextInt() 或类似方法)

使用单例和一点同步来编写我们自己的缓存是否更快/更容易?

请不要春天。

【问题讨论】:

    标签: ehcache


    【解决方案1】:

    EhCache 带有故障安全配置,具有合理的过期时间(120 秒)。这足以让它启动并运行。

    进口:

    import net.sf.ehcache.CacheManager;
    import net.sf.ehcache.Element;
    

    那么,创建缓存就很简单了:

    CacheManager.getInstance().addCache("test");
    

    这会创建一个名为test 的缓存。您可以拥有许多不同的、单独的缓存,它们都由同一个CacheManager 管理。将(key, value) 对添加到此缓存中非常简单:

    CacheManager.getInstance().getCache("test").put(new Element(key, value));
    

    检索给定键的值很简单:

    Element elt = CacheManager.getInstance().getCache("test").get(key);
    return (elt == null ? null : elt.getObjectValue());
    

    如果您在默认的 120 秒过期时间之后尝试访问元素,缓存将返回 null(因此检查 elt 是否为 null)。您可以通过创建自己的 ehcache.xml 文件来调整过期期限 - ehcache 网站上的文档很不错。

    【讨论】:

    • 非常好,谢谢!但是,这并没有提供任何通过 (now-updatedat)>timeout 检查的单例。理想情况下,缓存应该在它关闭并获取新结果时返回旧结果,以避免所有读取线程被阻塞几秒钟。 ehcache 可以做到这一点,还是我应该坚持使用单例和同步?非常感谢!
    • EhCache,据我所知,没有内置功能来检查上次更新的时间。您可以在更新时擦除缓存条目,也可以在从缓存中抓取之前自行检查。 EhCache 将有一个插入对象的时间戳,这样就为您完成了。当缓存填满时,它还将处理不经常使用的对象的删除。最后,如果您愿意,它可以让您在未来做更多的事情。但是,是的,有时自己编写会更简单。
    • 如果缓存本身的存储对象值由于某种原因为空怎么办?
    • 如果您关心知道缓存条目是否为空(不在缓存中)与数据是否为空,则必须添加一些逻辑。但如果需要,系统会缓存空值。
    【解决方案2】:

    jbrookover 答案的有效实现:

    import net.sf.ehcache.CacheManager;
    import net.sf.ehcache.Element;
    import net.sf.ehcache.Cache;
    
    public class EHCacheDemo  {
        public static final void main(String[] igno_red)  {
            CacheManager cchm = CacheManager.getInstance();
    
            //Create a cache
            cchm.addCache("test");
    
            //Add key-value pairs
            Cache cch = cchm.getCache("test");
            cch.put(new Element("tarzan", "Jane"));
            cch.put(new Element("kermit", "Piggy"));
    
            //Retrieve a value for a given key
            Element elt = cch.get("tarzan");
            String sPartner = (elt == null ? null : elt.getObjectValue().toString());
    
            System.out.println(sPartner);  //Outputs "Jane"
    
            //Required or the application will hang
            cchm.removeAllCaches();  //alternatively: cchm.shutdown();
        }
    }
    

    【讨论】:

    • 使用 EHCache 的人需要知道的大部分方法的甜美简短教程!
    猜你喜欢
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 2021-09-26
    • 1970-01-01
    相关资源
    最近更新 更多