RedisCatalogCacheStore.java
package com.ecommerce.catalog.infrastructure.cache;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import java.time.Duration;
import java.util.List;
import java.util.Optional;
public class RedisCatalogCacheStore implements CatalogCacheStore {
private static final DefaultRedisScript<Long> UNLOCK_SCRIPT = new DefaultRedisScript<>("""
if redis.call('get', KEYS[1]) == ARGV[1] then
return redis.call('del', KEYS[1])
end
return 0
""", Long.class);
private final StringRedisTemplate redisTemplate;
public RedisCatalogCacheStore(StringRedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
@Override
public Optional<String> get(String key) {
return Optional.ofNullable(redisTemplate.opsForValue().get(key));
}
@Override
public void put(String key, String value, Duration ttl) {
redisTemplate.opsForValue().set(key, value, ttl);
}
@Override
public void delete(String key) {
redisTemplate.delete(key);
}
@Override
public boolean tryLock(String key, String token, Duration ttl) {
return Boolean.TRUE.equals(redisTemplate.opsForValue().setIfAbsent(key, token, ttl));
}
@Override
public void unlock(String key, String token) {
redisTemplate.execute(UNLOCK_SCRIPT, List.of(key), token);
}
@Override
public void publish(String channel, String message) {
redisTemplate.convertAndSend(channel, message);
}
}