cecilia/src/main/java/com/darkness/common/util/redis/RedisTemplateProviderImpl.java
2024-12-24 15:22:53 +08:00

96 lines
3.9 KiB
Java

package com.darkness.common.util.redis;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* @author fuhouyin
* @time 2023/4/11 9:30
*/
@Component
public class RedisTemplateProviderImpl implements RedisTemplateProvider {
public static final RedisSerializer<Object> JDK_SERIALIZER = new JdkSerializationRedisSerializer();
public static final RedisSerializer<String> STRING_SERIALIZER = new StringRedisSerializer();
private final Map<String, RedisTemplate<String, Object>> redisTemplateMap = new HashMap();
private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private final Lock r;
private final Lock w;
private final RedisConnectionFactory redisStoreConnectionFactory;
public RedisTemplateProviderImpl(RedisConnectionFactory redisStoreConnectionFactory) {
this.r = this.rwl.readLock();
this.w = this.rwl.writeLock();
this.redisStoreConnectionFactory = redisStoreConnectionFactory;
}
public RedisTemplate<String, Object> getTemplate() {
return this.getTemplate(STRING_SERIALIZER);
}
public RedisTemplate<String, Object> getTemplate(RedisSerializer valueSerializer) {
return this.getTemplate(STRING_SERIALIZER, valueSerializer);
}
private RedisTemplate<String, Object> getTemplate(RedisSerializer<String> keySerializer, RedisSerializer valueSerializer) {
String cacheKey = this.getTemplateCacheKey(keySerializer, valueSerializer);
try {
this.r.lock();
RedisTemplate<String, Object> template = (RedisTemplate)this.redisTemplateMap.get(cacheKey);
if (template != null) {
RedisTemplate var5 = template;
return var5;
}
} finally {
this.r.unlock();
}
return this.createAndPut(keySerializer, valueSerializer, cacheKey);
}
private RedisTemplate<String, Object> createAndPut(RedisSerializer<String> keySerializer, RedisSerializer valueSerializer, String cacheKey) {
RedisTemplate var5;
try {
this.w.lock();
RedisTemplate<String, Object> template = (RedisTemplate)this.redisTemplateMap.get(cacheKey);
if (template == null) {
template = this.createRedisTemplate(keySerializer, valueSerializer);
this.redisTemplateMap.put(cacheKey, template);
}
var5 = template;
} finally {
this.w.unlock();
}
return var5;
}
private RedisTemplate<String, Object> createRedisTemplate(RedisSerializer<String> keySerializer, RedisSerializer valueSerializer) {
RedisTemplate<String, Object> template = new RedisTemplate();
template.setKeySerializer(keySerializer);
template.setHashKeySerializer(keySerializer);
template.setHashValueSerializer(valueSerializer);
template.setValueSerializer(valueSerializer);
template.setConnectionFactory(this.redisStoreConnectionFactory);
template.afterPropertiesSet();
return template;
}
private String getTemplateCacheKey(RedisSerializer keySerializer, RedisSerializer valueSerializer) {
Assert.notNull(keySerializer, "keySerializer should not null");
Assert.notNull(valueSerializer, "valueSerializer should not null");
return keySerializer.getClass().getName() + "-" + valueSerializer.getClass().getName();
}
}