cacheentry.java
来自「一个不错的cache」· Java 代码 · 共 312 行
JAVA
312 行
/* * Copyright (c) 2002-2003 by OpenSymphony * All rights reserved. */package com.opensymphony.oscache.base;import com.opensymphony.oscache.web.filter.ResponseContent;import java.io.Serializable;import java.util.Collection;import java.util.HashSet;import java.util.Set;/** * A CacheEntry instance represents one entry in the cache. It holds the object that * is being cached, along with a host of information about that entry such as the * cache key, the time it was cached, whether the entry has been flushed or not and * the groups it belongs to. * * @version $Revision: 1.1 $ * @author <a href="mailto:mike@atlassian.com">Mike Cannon-Brookes</a> * @author <a href="mailto:tgochenour@peregrine.com">Todd Gochenour</a> * @author <a href="mailto:fbeauregard@pyxis-tech.com">Francois Beauregard</a> */public class CacheEntry implements Serializable { /** * Default initialization value for the creation time and the last * update time. This is a placeholder that indicates the value has * not been set yet. */ private static final byte NOT_YET = -1; /** * Specifying this as the refresh period for the * {@link #needsRefresh(int)} method will ensure * an entry does not become stale until it is * either explicitly flushed or a custom refresh * policy causes the entry to expire. */ public static final int INDEFINITE_EXPIRY = -1; /** * The entry refresh policy object to use for this cache entry. This is optional. */ private EntryRefreshPolicy policy = null; /** * The actual content that is being cached. Wherever possible this object * should be serializable. This allows <code>PersistenceListener</code>s * to serialize the cache entries to disk or database. */ private Object content = null; /** * The set of cache groups that this cache entry belongs to, if any. */ private Set groups = null; /** * The unique cache key for this entry */ private String key; /** * <code>true</code> if this entry was flushed */ private boolean wasFlushed = false; /** * The time this entry was created. */ private long created = NOT_YET; /** * The time this emtry was last updated. */ private long lastUpdate = NOT_YET; /** * Construct a new CacheEntry using the key provided. * * @param key The key of this CacheEntry */ public CacheEntry(String key) { this(key, null); } /** * Construct a CacheEntry. * * @param key The unique key for this <code>CacheEntry</code>. * @param policy Object that implements refresh policy logic. This parameter * is optional. */ public CacheEntry(String key, EntryRefreshPolicy policy) { this(key, policy, null); } /** * Construct a CacheEntry. * * @param key The unique key for this <code>CacheEntry</code>. * @param policy The object that implements the refresh policy logic. This * parameter is optional. * @param groups The groups that this <code>CacheEntry</code> belongs to. This * parameter is optional. */ public CacheEntry(String key, EntryRefreshPolicy policy, String[] groups) { this.key = key; if (groups != null) { this.groups = new HashSet(groups.length); for (int i = 0; i < groups.length; i++) { this.groups.add(groups[i]); } } this.policy = policy; this.created = System.currentTimeMillis(); } /** * Sets the actual content that is being cached. Wherever possible this * object should be <code>Serializable</code>, however it is not an * absolute requirement when using a memory-only cache. Being <code>Serializable</code> * allows <code>PersistenceListener</code>s to serialize the cache entries to disk * or database. * * @param value The content to store in this CacheEntry. */ public synchronized void setContent(Object value) { content = value; lastUpdate = System.currentTimeMillis(); wasFlushed = false; } /** * Get the cached content from this CacheEntry. * * @return The content of this CacheEntry. */ public Object getContent() { return content; } /** * Get the date this CacheEntry was created. * * @return The date this CacheEntry was created. */ public long getCreated() { return created; } /** * Sets the cache groups for this entry. * * @param groups A string array containing all the group names */ public synchronized void setGroups(String[] groups) { if (groups != null) { this.groups = new HashSet(groups.length); for (int i = 0; i < groups.length; i++) { this.groups.add(groups[i]); } } else { this.groups = null; } lastUpdate = System.currentTimeMillis(); } /** * Sets the cache groups for this entry * * @param groups A collection containing all the group names */ public void setGroups(Collection groups) { if (groups != null) { this.groups = new HashSet(groups); } else { this.groups = null; } lastUpdate = System.currentTimeMillis(); } /** * Gets the cache groups that this cache entry belongs to. * These returned groups should be treated as immuatable. * * @return A set containing the names of all the groups that * this cache entry belongs to. */ public Set getGroups() { return groups; } /** * Get the key of this CacheEntry * * @return The key of this CacheEntry */ public String getKey() { return key; } /** * Set the date this CacheEntry was last updated. * * @param update The time (in milliseconds) this CacheEntry was last updated. */ public void setLastUpdate(long update) { lastUpdate = update; } /** * Get the date this CacheEntry was last updated. * * @return The date this CacheEntry was last updated. */ public long getLastUpdate() { return lastUpdate; } /** * Indicates whether this CacheEntry is a freshly created one and * has not yet been assigned content or placed in a cache. * * @return <code>true</code> if this entry is newly created */ public boolean isNew() { return lastUpdate == NOT_YET; } /** * Get the size of the cache entry in bytes (roughly).<p> * * Currently this method only handles <code>String<code>s and * {@link ResponseContent} objects. * * @return The approximate size of the entry in bytes, or -1 if the * size could not be estimated. */ public int getSize() { // a char is two bytes int size = (key.length() * 2) + 4; if (content.getClass() == String.class) { size += ((content.toString().length() * 2) + 4); } else if (content instanceof ResponseContent) { size += ((ResponseContent) content).getSize(); } else { return -1; } //add created, lastUpdate, and wasFlushed field sizes (1, 8, and 8) return size + 17; } /** * Flush the entry from cache. * note that flushing the cache doesn't actually remove the cache contents * it just tells the CacheEntry that it needs a refresh next time it is asked * this is so that the content is still there for a <usecached />. */ public void flush() { wasFlushed = true; } /** * Check if this CacheEntry needs to be refreshed. * * @param refreshPeriod The period of refresh (in seconds). Passing in * {@link #INDEFINITE_EXPIRY} will result in the content never becoming * stale unless it is explicitly flushed, or expired by a custom * {@link EntryRefreshPolicy}. Passing in 0 will always result in a * refresh being required. * * @return Whether or not this CacheEntry needs refreshing. */ public boolean needsRefresh(int refreshPeriod) { boolean needsRefresh; // needs a refresh if it has never been updated if (lastUpdate == NOT_YET) { needsRefresh = true; } // Was it flushed from cache? else if (wasFlushed) { needsRefresh = true; } else if (refreshPeriod == 0) { needsRefresh = true; } // check what the policy has to say if there is one else if (policy != null) { needsRefresh = policy.needsRefresh(this); } // check if the last update + update period is in the past else if ((refreshPeriod >= 0) && (System.currentTimeMillis() >= (lastUpdate + (refreshPeriod * 1000L)))) { needsRefresh = true; } else { needsRefresh = false; } return needsRefresh; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?