ehcache中的element源码学习

it2023-11-08  81

在cache中存放数据的数据结构就是element类,主要就是存放key、value

下面是element类的介绍,其中@Deprecated的方法以及删除,一些简单的属性就不解释了

//实现序列化,克隆接口,因为如果只是作为内存缓存,则不需要对它做序列化。 public class Element implements Serializable, Cloneable { private static final long serialVersionUID = 1098572221246444544L; private static final Logger LOG = LoggerFactory.getLogger(Element.class.getName()); //该方式不必将字段hitCount设置为原子变量,利用反射直接以原子方式操作字段 private static final AtomicLongFieldUpdater<Element> HIT_COUNT_UPDATER = AtomicLongFieldUpdater.newUpdater(Element.class, "hitCount"); //当且仅当以参数命名的系统属性存在,且等于 “true” 字符串时,才返回 true。 private static final boolean ELEMENT_VERSION_AUTO = Boolean.getBoolean("net.sf.ehcache.element.version.auto"); private static final long NOT_SET_ID = 0L;//不晓得 @IgnoreSizeOf private final Object key; private final Object value; //感觉没啥用,如果net.sf.ehcache.element.version.auto系统属性设置为true,则当Element加入到Cache中时会被更新为当前系统时间。此时,用户设置的值会丢失。 private volatile long version; //与LFU(least frequently used)缓存策略有关,最少被使用,缓存的元素hitCount属性,hitCount值最小的将会被清出缓存。 //其他两种缓存策略 //FIFO,先进先出 //LRU(least recently used),最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。 private volatile long hitCount; //一个元素从构建到消亡的最大时间间隔值,单位秒 private volatile int timeToLive; //两次访问时间的最大时间间隔值,如果超出这个时间间隔,即使时间还没有到timeToLive规定的时间,元素也自动过期 private volatile int timeToIdle; //当缓存在放入的时候记录一个放入时间,比如:1603287988647 private transient long creationTime; //上次访问(执行了与该element有关的操作,比如修改一些属性)时间,比如:1603287992538 private transient long lastAccessTime; //元素属性的修改时间 private volatile long lastUpdateTime; //如果timeToLive和timeToIdle没有手动设置,该值为true,使用配置文件或配置类timeTiLive、timeToIdle的值,否则使用Element自身的值。 private volatile boolean cacheDefaultLifespan; private volatile long id;//不晓得 //过滤了一些方法,写法值得学习 //判断两个element是否想等。只比较key的值 public final boolean equals(Object object) { if (object != null && object instanceof Element) { Element element = (Element)object; return this.key != null && element.getObjectKey() != null ? this.key.equals(element.getObjectKey()) : false; } else { return false; } } //判断是否过期 public boolean isExpired() { //如果自己设置了时间并且不是永久缓存 if (this.isLifespanSet() && !this.isEternal()) { long now = this.getCurrentTime(); long expirationTime = this.getExpirationTime(); return now > expirationTime; } else { return false; } } public boolean isLifespanSet() { return this.timeToIdle != -2147483648 || this.timeToLive != -2147483648; } public boolean isExpired(CacheConfiguration config) { if (this.cacheDefaultLifespan) { if (config.isEternal()) { this.timeToIdle = 0; this.timeToLive = 0; } else { this.timeToIdle = TimeUtil.convertTimeToInt(config.getTimeToIdleSeconds()); this.timeToLive = TimeUtil.convertTimeToInt(config.getTimeToLiveSeconds()); } } return this.isExpired(); } //重要方法 public long getExpirationTime() { if (this.isLifespanSet() && !this.isEternal()) { long expirationTime = 0L; //预期过期时间 long ttlExpiry = this.creationTime + TimeUtil.toMillis(this.getTimeToLive()); //最近访问时间 long mostRecentTime = Math.max(this.creationTime, this.lastAccessTime); //最近将要过期时间 long ttiExpiry = mostRecentTime + TimeUtil.toMillis(this.getTimeToIdle()); if (this.getTimeToLive() == 0 || this.getTimeToIdle() != 0 && this.lastAccessTime != 0L) { if (this.getTimeToLive() == 0) { expirationTime = ttiExpiry; } else { expirationTime = Math.min(ttlExpiry, ttiExpiry); } } else { expirationTime = ttlExpiry; } return expirationTime; } else { return 9223372036854775807L; } } }
最新回复(0)