docs: function (view, options, uaIdentity, str) {
              logger.info('try to write cache for: ', view);
              var key = genKey(view, uaIdentity);
              var optsKey = JSON.stringify(options);
              var pool;
              var found;
  
              cache[key] = cache[key] || [];
              pool = cache[key];
              found = _.findWhere(pool, {options: optsKey});
              // 写入cache
              if (found) {
                  found.str = str;
                  found.hit = found.hit + 1;
                  found.expireStamp = expireTime + new Date().getTime();
              } else {
                  pool.push({
                      options: optsKey,
                      str: str,
                      hit: 1,
                      expireStamp: expireTime + new Date().getTime()
                  });
              }
  
              // 调整cache, 优先按热度排序, 热度差小于deltaHitIgnore或热度小于maxHitIgnore时按时间排序
              pool.sort(function (left, right) {
                  var deltaHit = right.hit - left.hit;
                  var deltaTime = right.expireStamp - left.expireStamp;
                  var sortByHit = Math.abs(deltaHit) > deltaHitIgnore && (right.hit > maxHitIgnore || left.hit > maxHitIgnore);
                  return sortByHit ? deltaHit : deltaTime;
              });
              while (pool.length > maxCopyNum) {
                  pool.pop();
              }
              logger.trace({
                  pool: _.map(pool, function (t) {
                      return {
                          hit: t.hit,
                          expireStamp: new Date(t.expireStamp).toLocaleString()
                      };
                  })
              }, 'write cache success, current caches for', view);
              logger.info('write cache success, current caches for %j, copies: %s', view, pool.length)
          }