CacheKey

作者: 93张先生 | 来源:发表于2020-09-07 12:00 被阅读0次

    CacheKey

    创建缓存时,缓存的 key。
    CacheKey 对象由 MappedStatement id 、对应的 offset limit SQL 语句(包含“?”占位符)、用户传递的实参以及 Environment id 这五部分构成。

    public class CacheKey implements Cloneable, Serializable {
    
      private static final long serialVersionUID = 1146682552656046210L;
    
      public static final CacheKey NULL_CACHE_KEY = new CacheKey(){
        @Override
        public void update(Object object) {
          throw new CacheException("Not allowed to update a null cache key instance.");
        }
        @Override
        public void updateAll(Object[] objects) {
          throw new CacheException("Not allowed to update a null cache key instance.");
        }
      };
    
      private static final int DEFAULT_MULTIPLIER = 37;
      private static final int DEFAULT_HASHCODE = 17;
    
      // 参与计算 hashcode ,默认值 37
      private final int multiplier;
      // CacheKey 对象的 hashcode ,初始位是 17
      private int hashcode;
      // 校验和
      private long checksum;
      // updateList 集合个数
      private int count;
      // 8/21/2017 - Sonarlint flags this as needing to be marked transient.  While true if content is not serializable, this is not always true and thus should not be marked transient.
      private List<Object> updateList;
    
      public CacheKey() {
        this.hashcode = DEFAULT_HASHCODE;
        this.multiplier = DEFAULT_MULTIPLIER;
        this.count = 0;
        this.updateList = new ArrayList<>();
      }
    
      public CacheKey(Object[] objects) {
        this();
        updateAll(objects);
      }
    
      public int getUpdateCount() {
        return updateList.size();
      }
    
      /**
       * 添加 CacheKey 中 列属性
       * @param object
       */
      public void update(Object object) {
        int baseHashCode = object == null ? 1 : ArrayUtil.hashCode(object);
        // 重新计算 count checksum hashcode 的值
        count++;
        checksum += baseHashCode;
        baseHashCode *= count;
    
        hashcode = multiplier * hashcode + baseHashCode;
        // 将 object 加到 updateList 集合中
        updateList.add(object);
      }
    
      public void updateAll(Object[] objects) {
        for (Object o : objects) {
          update(o);
        }
      }
    
      @Override
      public boolean equals(Object object) {
        // 是否是同一对象
        if (this == object) {
          return true;
        }
        // 是否类型相同
        if (!(object instanceof CacheKey)) {
          return false;
        }
    
        final CacheKey cacheKey = (CacheKey) object;
        // 比较 hashCode
        if (hashcode != cacheKey.hashcode) {
          return false;
        }
        // 比较 checkSum
        if (checksum != cacheKey.checksum) {
          return false;
        }
        // 比较 count
        if (count != cacheKey.count) {
          return false;
        }
        // 比较 updateList 中每一项
        for (int i = 0; i < updateList.size(); i++) {
          Object thisObject = updateList.get(i);
          Object thatObject = cacheKey.updateList.get(i);
          if (!ArrayUtil.equals(thisObject, thatObject)) {
            return false;
          }
        }
        return true;
      }
    
      @Override
      public int hashCode() {
        return hashcode;
      }
    
      @Override
      public String toString() {
        StringJoiner returnValue = new StringJoiner(":");
        returnValue.add(String.valueOf(hashcode));
        returnValue.add(String.valueOf(checksum));
        updateList.stream().map(ArrayUtil::toString).forEach(returnValue::add);
        return returnValue.toString();
      }
    
      @Override
      public CacheKey clone() throws CloneNotSupportedException {
        CacheKey clonedCacheKey = (CacheKey) super.clone();
        clonedCacheKey.updateList = new ArrayList<>(updateList);
        return clonedCacheKey;
      }
    
    }
    

    相关文章

      网友评论

        本文标题:CacheKey

        本文链接:https://www.haomeiwen.com/subject/cwbkektx.html