forked from github/dataease
Merge pull request #12695 from dataease/pr@dev-v2@perf_redis_cache
perf(X-Pack): 集群环境中redis缓存清除机制
This commit is contained in:
commit
5d5cdf0be6
@ -1,10 +1,13 @@
|
|||||||
package io.dataease.cache.impl;
|
package io.dataease.cache.impl;
|
||||||
|
|
||||||
import io.dataease.cache.DECacheService;
|
import io.dataease.cache.DECacheService;
|
||||||
|
import io.dataease.utils.CommonBeanFactory;
|
||||||
import jakarta.annotation.PostConstruct;
|
import jakarta.annotation.PostConstruct;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import org.apache.commons.lang3.ObjectUtils;
|
import org.apache.commons.lang3.ObjectUtils;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
|
||||||
|
import org.springframework.cache.Cache;
|
||||||
|
import org.springframework.cache.CacheManager;
|
||||||
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.data.redis.core.RedisTemplate;
|
||||||
import org.springframework.data.redis.core.ValueOperations;
|
import org.springframework.data.redis.core.ValueOperations;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
@ -20,11 +23,21 @@ public class RedisCacheImpl implements DECacheService {
|
|||||||
@Resource
|
@Resource
|
||||||
private RedisTemplate redisTemplate;
|
private RedisTemplate redisTemplate;
|
||||||
|
|
||||||
|
private static CacheManager cacheManager;
|
||||||
|
|
||||||
|
|
||||||
|
private static CacheManager getCacheManager() {
|
||||||
|
if (cacheManager == null)
|
||||||
|
cacheManager = CommonBeanFactory.getBean(CacheManager.class);
|
||||||
|
return cacheManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private ValueOperations ops() {
|
private ValueOperations ops() {
|
||||||
ValueOperations valueOperations = redisTemplate.opsForValue();
|
ValueOperations valueOperations = redisTemplate.opsForValue();
|
||||||
return valueOperations;
|
return valueOperations;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void put(String cacheName, String key, Object value, Long expTime, TimeUnit unit) {
|
public void put(String cacheName, String key, Object value, Long expTime, TimeUnit unit) {
|
||||||
ValueOperations ops = ops();
|
ValueOperations ops = ops();
|
||||||
@ -57,7 +70,10 @@ public class RedisCacheImpl implements DECacheService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void keyRemove(String cacheName, String key) {
|
public void keyRemove(String cacheName, String key) {
|
||||||
redisTemplate.delete(cacheName + SEPARATOR + key);
|
// redisTemplate.delete(cacheName + SEPARATOR + key);
|
||||||
|
Cache cache = getCacheManager().getCache(cacheName);
|
||||||
|
if (null == cache) return;
|
||||||
|
cache.evictIfPresent(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
|
@ -0,0 +1,56 @@
|
|||||||
|
package io.dataease.listener;
|
||||||
|
|
||||||
|
import io.dataease.utils.LogUtil;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
|
||||||
|
import org.springframework.boot.context.event.ApplicationReadyEvent;
|
||||||
|
import org.springframework.context.ApplicationListener;
|
||||||
|
import org.springframework.core.annotation.Order;
|
||||||
|
import org.springframework.data.redis.core.Cursor;
|
||||||
|
import org.springframework.data.redis.core.RedisTemplate;
|
||||||
|
import org.springframework.data.redis.core.ScanOptions;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@ConditionalOnExpression("'${spring.cache.type}'.equals('redis')")
|
||||||
|
@Component
|
||||||
|
@Order(100)
|
||||||
|
public class RedisCacheListener implements ApplicationListener<ApplicationReadyEvent> {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private RedisTemplate redisTemplate;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onApplicationEvent(ApplicationReadyEvent event) {
|
||||||
|
try {
|
||||||
|
deleteKeysContainingString(redisTemplate, "de_v2_");
|
||||||
|
} catch (Exception e) {
|
||||||
|
LogUtil.error(e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void deleteKeysContainingString(RedisTemplate<String, String> redisTemplate, String searchString) {
|
||||||
|
// 扫描所有的key
|
||||||
|
ScanOptions scanOptions = ScanOptions.scanOptions().match("*" + searchString + "*").count(1000).build();
|
||||||
|
Cursor<byte[]> cursor = redisTemplate.getConnectionFactory()
|
||||||
|
.getConnection()
|
||||||
|
.scan(scanOptions);
|
||||||
|
|
||||||
|
List<byte[]> keysToDelete = new ArrayList<>();
|
||||||
|
while (cursor.hasNext()) {
|
||||||
|
keysToDelete.add(cursor.next());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!keysToDelete.isEmpty()) {
|
||||||
|
List<String> keys = new ArrayList<>(keysToDelete.size());
|
||||||
|
for (byte[] key : keysToDelete) {
|
||||||
|
keys.add(new String(key, StandardCharsets.UTF_8));
|
||||||
|
}
|
||||||
|
redisTemplate.delete(keys);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user