public void putAttributes(
      final String database, final IDeviceID deviceId, final Map<String, Binary> attributeMap) {
    readWriteLock.readLock().lock();
    try {
      // Avoid stale table
      if (Objects.isNull(
          DataNodeTableCache.getInstance().getTable(database, deviceId.getTableName()))) {
        return;
      }
      dualKeyCache.update(
          new TableId(database, deviceId.getTableName()),
          deviceId,
          new TableDeviceCacheEntry(),
          entry -> entry.setAttribute(database, deviceId.getTableName(), attributeMap),
          true);
    } finally {
      readWriteLock.readLock().unlock();
    }
  }
In table model: {@literal <}{@link QualifiedObjectName}, {@link IDeviceID}, lastCache /
attributes{@literal >}

<p>In tree model: {@literal <}Pair{@literal <}{@code null}, tableName(translated){@literal >},
{@link IDeviceID}(translated), Map{@literal <}Measurement, Schema{@literal
>}/templateInfo{@literal >}
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TableDeviceSchemaCache.java