如何使用 Ehcache 3 缓存空值
How to cache null values with Ehcache 3
我需要使用 Ehcache 3 缓存空值。
对于 Ehcache 2,我在此处找到了示例:
// 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 ...
是否有针对 Ehcache 3 的示例,因为它似乎 net.sf.ehcache.Element 不再存在?
我也看到了这个评论:https://github.com/ehcache/ehcache3/issues/1607
Indeed, you cannot cache a null value, this is also the behaviour of the JCache specification.
If you need this in your application, either create a sentinel value or wrap your values from your application.
当然,如果我的 return 对象为 null,我可以构建一些逻辑,将其放入另一个 Set,如果我只存储 null 元素的键。当然,为了阅读,我还需要检查我的 ehcache 和我的 "special" Set.
您的问题包含答案,您需要使用 null object pattern 或相关解决方案来包装/隐藏您的 null
。
在 Ehcache 3 中不支持也不会支持 null
键或值。
我只是创建了一个空占位符 class。
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));
我需要使用 Ehcache 3 缓存空值。 对于 Ehcache 2,我在此处找到了示例:
// 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 ...
是否有针对 Ehcache 3 的示例,因为它似乎 net.sf.ehcache.Element 不再存在?
我也看到了这个评论:https://github.com/ehcache/ehcache3/issues/1607
Indeed, you cannot cache a null value, this is also the behaviour of the JCache specification. If you need this in your application, either create a sentinel value or wrap your values from your application.
当然,如果我的 return 对象为 null,我可以构建一些逻辑,将其放入另一个 Set,如果我只存储 null 元素的键。当然,为了阅读,我还需要检查我的 ehcache 和我的 "special" Set.
您的问题包含答案,您需要使用 null object pattern 或相关解决方案来包装/隐藏您的 null
。
在 Ehcache 3 中不支持也不会支持 null
键或值。
我只是创建了一个空占位符 class。
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));