code: @Override
      public synchronized void cacheJwt(Jwt.Key cachedKey, Jwt jwt) {
          //update the expire time
          LongestExpireCacheKey leCachKey = new LongestExpireCacheKey(cachedKey);
          leCachKey.setExpiry(jwt.getExpire());
          if(cachedJwts.size() >= capacity) {
              if(expiryQueue.contains(leCachKey)) {
                  expiryQueue.remove(leCachKey);
              } else {
                  cachedJwts.remove(expiryQueue.peek().getCacheKey());
                  expiryQueue.poll();
              }
          } else {
              if(expiryQueue.contains(leCachKey)) {
                  expiryQueue.remove(leCachKey);
              }
          }
          expiryQueue.add(leCachKey);
          cachedJwts.put(cachedKey, jwt);
      }
docs: This method is to cache a jwt LongestExpireCacheStrategy based on a given Jwt.Key and a Jwt.
  Every time it updates the expiry time of a jwt, and shift it up to a proper position.
  Since the PriorityQueue is implemented by heap, the average O(n) should be O(log n).
  @param cachedKey Jwt.Key the key to be used to cache
  @param jwt Jwt the jwt to be cached