diff --git a/common/cache/src/main/java/org/thingsboard/server/cache/CaffeineTbTransactionalCache.java b/common/cache/src/main/java/org/thingsboard/server/cache/CaffeineTbTransactionalCache.java index 4ce6571f1c..d2ea960e68 100644 --- a/common/cache/src/main/java/org/thingsboard/server/cache/CaffeineTbTransactionalCache.java +++ b/common/cache/src/main/java/org/thingsboard/server/cache/CaffeineTbTransactionalCache.java @@ -54,11 +54,6 @@ public abstract class CaffeineTbTransactionalCache get(K key, boolean transactionMode) { - return get(key); - } - @Override public void put(K key, V value) { lock.lock(); diff --git a/common/cache/src/main/java/org/thingsboard/server/cache/RedisTbCacheTransaction.java b/common/cache/src/main/java/org/thingsboard/server/cache/RedisTbCacheTransaction.java index 3dcb6e878f..fb852493ce 100644 --- a/common/cache/src/main/java/org/thingsboard/server/cache/RedisTbCacheTransaction.java +++ b/common/cache/src/main/java/org/thingsboard/server/cache/RedisTbCacheTransaction.java @@ -31,7 +31,7 @@ public class RedisTbCacheTransaction get(K key) { - return get(key, false); - } - - @Override - public TbCacheValueWrapper get(K key, boolean transactionMode) { if (!cacheEnabled) { return null; } try (var connection = connectionFactory.getConnection()) { - byte[] rawKey = getRawKey(key); - byte[] rawValue = doGet(connection, rawKey, transactionMode); + byte[] rawValue = doGet(key, connection); if (rawValue == null || rawValue.length == 0) { return null; } else if (Arrays.equals(rawValue, BINARY_NULL_VALUE)) { @@ -114,8 +108,8 @@ public abstract class RedisTbTransactionalCache get(K key); - TbCacheValueWrapper get(K key, boolean transactionMode); - void put(K key, V value); void putIfAbsent(K key, V value); @@ -53,7 +51,7 @@ public interface TbTransactionalCache cacheValueWrapper = get(key, true); + TbCacheValueWrapper cacheValueWrapper = get(key); if (cacheValueWrapper != null) { return cacheValueWrapper.get(); } @@ -66,7 +64,7 @@ public interface TbTransactionalCache R getAndPutInTransaction(K key, Supplier dbCall, Function cacheValueToResult, Function dbValueToCacheValue, boolean cacheNullValue) { - TbCacheValueWrapper cacheValueWrapper = get(key, true); + TbCacheValueWrapper cacheValueWrapper = get(key); if (cacheValueWrapper != null) { V cacheValue = cacheValueWrapper.get(); return cacheValue != null ? cacheValueToResult.apply(cacheValue) : null; @@ -92,7 +90,7 @@ public interface TbTransactionalCache cacheValueWrapper = get(key, true); + TbCacheValueWrapper cacheValueWrapper = get(key); if (cacheValueWrapper != null) { var cacheValue = cacheValueWrapper.get(); return cacheValue == null ? null : cacheValueToResult.apply(cacheValue); diff --git a/common/cache/src/main/java/org/thingsboard/server/cache/VersionedCacheKey.java b/common/cache/src/main/java/org/thingsboard/server/cache/VersionedCacheKey.java new file mode 100644 index 0000000000..f339d9def3 --- /dev/null +++ b/common/cache/src/main/java/org/thingsboard/server/cache/VersionedCacheKey.java @@ -0,0 +1,26 @@ +/** + * Copyright © 2016-2024 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.cache; + +import java.io.Serializable; + +public interface VersionedCacheKey extends Serializable { + + default boolean isVersioned() { + return false; + } + +} diff --git a/common/cache/src/main/java/org/thingsboard/server/cache/VersionedCaffeineTbCache.java b/common/cache/src/main/java/org/thingsboard/server/cache/VersionedCaffeineTbCache.java index f9c22ecc32..535fa64cd9 100644 --- a/common/cache/src/main/java/org/thingsboard/server/cache/VersionedCaffeineTbCache.java +++ b/common/cache/src/main/java/org/thingsboard/server/cache/VersionedCaffeineTbCache.java @@ -22,7 +22,7 @@ import org.thingsboard.server.common.data.util.TbPair; import java.io.Serializable; -public abstract class VersionedCaffeineTbCache extends CaffeineTbTransactionalCache implements VersionedTbCache { +public abstract class VersionedCaffeineTbCache extends CaffeineTbTransactionalCache implements VersionedTbCache { public VersionedCaffeineTbCache(CacheManager cacheManager, String cacheName) { super(cacheManager, cacheName); diff --git a/common/cache/src/main/java/org/thingsboard/server/cache/VersionedRedisTbCache.java b/common/cache/src/main/java/org/thingsboard/server/cache/VersionedRedisTbCache.java index 6ef3918a68..e9b64822e9 100644 --- a/common/cache/src/main/java/org/thingsboard/server/cache/VersionedRedisTbCache.java +++ b/common/cache/src/main/java/org/thingsboard/server/cache/VersionedRedisTbCache.java @@ -30,7 +30,7 @@ import java.io.Serializable; import java.util.Arrays; @Slf4j -public abstract class VersionedRedisTbCache extends RedisTbTransactionalCache implements VersionedTbCache { +public abstract class VersionedRedisTbCache extends RedisTbTransactionalCache implements VersionedTbCache { private static final int VERSION_SIZE = 8; private static final int VALUE_END_OFFSET = -1; @@ -79,15 +79,20 @@ public abstract class VersionedRedisTbCache extends TbTransactionalCache { +public interface VersionedTbCache extends TbTransactionalCache { TbCacheValueWrapper get(K key); diff --git a/common/cache/src/main/java/org/thingsboard/server/cache/device/DeviceCacheKey.java b/common/cache/src/main/java/org/thingsboard/server/cache/device/DeviceCacheKey.java index ed6258842d..2a0819851e 100644 --- a/common/cache/src/main/java/org/thingsboard/server/cache/device/DeviceCacheKey.java +++ b/common/cache/src/main/java/org/thingsboard/server/cache/device/DeviceCacheKey.java @@ -19,17 +19,17 @@ import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.RequiredArgsConstructor; +import org.thingsboard.server.cache.VersionedCacheKey; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.TenantId; import java.io.Serial; -import java.io.Serializable; @Getter @EqualsAndHashCode @RequiredArgsConstructor @Builder -public class DeviceCacheKey implements Serializable { +public class DeviceCacheKey implements VersionedCacheKey { @Serial private static final long serialVersionUID = 6366389552842340207L; @@ -61,4 +61,9 @@ public class DeviceCacheKey implements Serializable { } } + @Override + public boolean isVersioned() { + return deviceId != null; + } + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/asset/AssetProfileCacheKey.java b/dao/src/main/java/org/thingsboard/server/dao/asset/AssetProfileCacheKey.java index 1e91d43a8f..aa3f6ce89f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/asset/AssetProfileCacheKey.java +++ b/dao/src/main/java/org/thingsboard/server/dao/asset/AssetProfileCacheKey.java @@ -16,14 +16,14 @@ package org.thingsboard.server.dao.asset; import lombok.Data; +import org.thingsboard.server.cache.VersionedCacheKey; import org.thingsboard.server.common.data.id.AssetProfileId; import org.thingsboard.server.common.data.id.TenantId; import java.io.Serial; -import java.io.Serializable; @Data -public class AssetProfileCacheKey implements Serializable { +public class AssetProfileCacheKey implements VersionedCacheKey { @Serial private static final long serialVersionUID = 8220455917177676472L; @@ -63,4 +63,9 @@ public class AssetProfileCacheKey implements Serializable { } } + @Override + public boolean isVersioned() { + return assetProfileId != null; + } + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/attributes/AttributeCacheKey.java b/dao/src/main/java/org/thingsboard/server/dao/attributes/AttributeCacheKey.java index 2cbd444f80..def2c6c45c 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/attributes/AttributeCacheKey.java +++ b/dao/src/main/java/org/thingsboard/server/dao/attributes/AttributeCacheKey.java @@ -18,16 +18,16 @@ package org.thingsboard.server.dao.attributes; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; +import org.thingsboard.server.cache.VersionedCacheKey; import org.thingsboard.server.common.data.AttributeScope; import org.thingsboard.server.common.data.id.EntityId; import java.io.Serial; -import java.io.Serializable; @EqualsAndHashCode @Getter @AllArgsConstructor -public class AttributeCacheKey implements Serializable { +public class AttributeCacheKey implements VersionedCacheKey { @Serial private static final long serialVersionUID = 2013369077925351881L; @@ -41,4 +41,9 @@ public class AttributeCacheKey implements Serializable { return "{" + entityId + "}" + scope + "_" + key; } + @Override + public boolean isVersioned() { + return true; + } + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceProfileCacheKey.java b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceProfileCacheKey.java index ad886b6a7c..55e8aa66eb 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceProfileCacheKey.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceProfileCacheKey.java @@ -16,15 +16,15 @@ package org.thingsboard.server.dao.device; import lombok.Data; +import org.thingsboard.server.cache.VersionedCacheKey; import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.id.DeviceProfileId; import org.thingsboard.server.common.data.id.TenantId; import java.io.Serial; -import java.io.Serializable; @Data -public class DeviceProfileCacheKey implements Serializable { +public class DeviceProfileCacheKey implements VersionedCacheKey { @Serial private static final long serialVersionUID = 8220455917177676472L; @@ -74,4 +74,9 @@ public class DeviceProfileCacheKey implements Serializable { return tenantId + "_" + name; } + @Override + public boolean isVersioned() { + return deviceProfileId != null; + } + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/entity/CachedVersionedEntityService.java b/dao/src/main/java/org/thingsboard/server/dao/entity/CachedVersionedEntityService.java index 356fafbbff..46045ab928 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/entity/CachedVersionedEntityService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/entity/CachedVersionedEntityService.java @@ -16,12 +16,13 @@ package org.thingsboard.server.dao.entity; import org.springframework.beans.factory.annotation.Autowired; +import org.thingsboard.server.cache.VersionedCacheKey; import org.thingsboard.server.cache.VersionedTbCache; import org.thingsboard.server.common.data.HasVersion; import java.io.Serializable; -public abstract class CachedVersionedEntityService extends AbstractCachedEntityService { +public abstract class CachedVersionedEntityService extends AbstractCachedEntityService { @Autowired protected VersionedTbCache cache; diff --git a/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewCacheKey.java b/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewCacheKey.java index 59df403165..deb1d85b78 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewCacheKey.java +++ b/dao/src/main/java/org/thingsboard/server/dao/entityview/EntityViewCacheKey.java @@ -18,17 +18,17 @@ package org.thingsboard.server.dao.entityview; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; +import org.thingsboard.server.cache.VersionedCacheKey; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.EntityViewId; import org.thingsboard.server.common.data.id.TenantId; import java.io.Serial; -import java.io.Serializable; @Getter @EqualsAndHashCode @Builder -public class EntityViewCacheKey implements Serializable { +public class EntityViewCacheKey implements VersionedCacheKey { @Serial private static final long serialVersionUID = 5986277528222738163L; @@ -68,4 +68,9 @@ public class EntityViewCacheKey implements Serializable { } } + @Override + public boolean isVersioned() { + return entityViewId != null; + } + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/timeseries/TsLatestCacheKey.java b/dao/src/main/java/org/thingsboard/server/dao/timeseries/TsLatestCacheKey.java index 9880f21cc1..593bc55e1e 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/timeseries/TsLatestCacheKey.java +++ b/dao/src/main/java/org/thingsboard/server/dao/timeseries/TsLatestCacheKey.java @@ -18,15 +18,15 @@ package org.thingsboard.server.dao.timeseries; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; +import org.thingsboard.server.cache.VersionedCacheKey; import org.thingsboard.server.common.data.id.EntityId; import java.io.Serial; -import java.io.Serializable; @EqualsAndHashCode @Getter @AllArgsConstructor -public class TsLatestCacheKey implements Serializable { +public class TsLatestCacheKey implements VersionedCacheKey { @Serial private static final long serialVersionUID = 2024369077925351881L; @@ -39,4 +39,9 @@ public class TsLatestCacheKey implements Serializable { return "{" + entityId + "}" + key; } + @Override + public boolean isVersioned() { + return true; + } + }