private void mergeToHeap(
        ActionCombinerValue newValList,
        UserActiveHistory oldVal,
        UserActiveHistory.Builder updatedBuilder) {
      HashSet<String> alreadyIn = new HashSet<String>();

      for (String newItem : newValList.getActRecodeMap().keySet()) {
        if (updatedBuilder.getActRecordsCount() >= topNum) {
          break;
        }

        if (!alreadyIn.contains(newItem)) {
          updatedBuilder.addActRecords(newValList.getActRecodeMap().get(newItem));
          alreadyIn.add(newItem);
        }
      }

      if (oldVal != null) {
        for (Recommend.UserActiveHistory.ActiveRecord eachOldVal : oldVal.getActRecordsList()) {
          if (updatedBuilder.getActRecordsCount() >= topNum) {
            break;
          }
          if (alreadyIn.contains(eachOldVal.getItem())) {
            continue;
          }
          updatedBuilder.addActRecords(eachOldVal);
        }
      }
    }
 private void Save(UserActiveHistory.Builder mergeValueBuilder) {
   UserActiveHistory putValue = mergeValueBuilder.build();
   for (ClientAttr clientEntry : mtClientList) {
     TairOption putopt = new TairOption(clientEntry.getTimeout(), (short) 0, dataExpireTime);
     try {
       Future<Result<Void>> future =
           clientEntry
               .getClient()
               .putAsync((short) nsTableId, this.key.getBytes(), putValue.toByteArray(), putopt);
       clientEntry
           .getClient()
           .notifyFuture(
               future,
               putCallBack,
               new UpdateCallBackContext(clientEntry, key, putValue.toByteArray(), putopt));
     } catch (Exception e) {
       logger.error(e.getMessage(), e);
     }
   }
 }