我需要用eHcache 3缓存null值。对于ehcache 2,我在这里找到了类似的示例:
- http://www.ehcache.org/documentation/2.8/recipes/cachenull.html
// cache an explicit null value:
cache.put(new Element("key", null));
Element element = cache.get("key");
if (element == null) {
// nothing in the cache for "key" (or expired) ...
} else {
// there is a valid element in the cache, however getObjectValue() may be null:
Object value = element.getObjectValue();
if (value == null) {
// a null value is in the cache ...
} else {
// a non-null value is in the cache ...
- https://codereview.stackexchange.com/questions/60393/ususe-ehcache-the-right-way
是否有ehcache 3的示例,因为它似乎是net.sf.ehcache.element不再存在了吗?
我也看过以下评论:https://github.com/ehcache/ehcache3/issues/1607
的确,您不能缓存零值,这也是JCACHE规范的行为。 如果您需要在应用程序中使用此功能,则可以创建哨兵值或从应用程序中包装您的值。
当然,如果我的返回对象为null,则可以构建一些逻辑,如果我仅存储我的钥匙,则可以将其放在另一组中。当然,我还需要检查我的ehcache和我的"特殊"集。
您的问题包含答案,您需要使用NULL对象模式或相关解决方案包装/隐藏null
s。
没有,并且不会有对null
键的支持或EHCACHE3。
我只是创建了一个零占位符类。
public class EHCache3Null implements Serializable {
private static final long serialVersionUID = -1542174764477971324L;
private static EHCache3Null INSTANCE = new EHCache3Null();
public static Serializable checkForNullOnPut(Serializable object) {
if (object == null) {
return INSTANCE;
} else {
return object;
}
}
public static Serializable checkForNullOnGet(Serializable object) {
if (object != null && object instanceof EHCache3Null) {
return null;
} else {
return object;
}
}
}
然后,当我使用缓存时,我对PUT操作的以下内容:
cache.put(element.getKey(), EHCache3Null.checkForNullOnPut(element.getValue()));
,然后在我的Get操作中:
Serializable value = EHCache3Null.checkForNullOnGet((Serializable) cache.get(key));