Java 如何使用SpringDataRedis2.x通过SpringBoot从redis缓存获取所有密钥?
我正在尝试获取由Redis支持的Spring引导缓存中的条目,该缓存使用1.x的Spring数据Redis,当前版本对本机缓存使用Java 如何使用SpringDataRedis2.x通过SpringBoot从redis缓存获取所有密钥?,java,spring,redis,Java,Spring,Redis,我正在尝试获取由Redis支持的Spring引导缓存中的条目,该缓存使用1.x的Spring数据Redis,当前版本对本机缓存使用DefaultRedisCacheWriter。我几年前在Spring Boot 2中就这样做了(因此不确定这是否适用于v1),但我记得Redis缓存实际上是建立在许多缓存之上的,每个缓存都有一个名称。这通常是在@配置类中设置的。然后,每个缓存只是键值对的映射,这是应用程序将提供的 这只是这个用例的一个例子(开发人员完全控制缓存),因为我对用于缓存方法响应的Sprin
DefaultRedisCacheWriter
。我几年前在Spring Boot 2中就这样做了(因此不确定这是否适用于v1),但我记得Redis缓存实际上是建立在许多缓存之上的,每个缓存都有一个名称。这通常是在@配置
类中设置的。然后,每个缓存只是键值对的映射,这是应用程序将提供的
这只是这个用例的一个例子(开发人员完全控制缓存),因为我对用于缓存方法响应的Spring注释方法并不感兴趣
在我的配置类中,我创建了一个CacheManager
对象,该对象配置了我打算在应用程序中使用的各种缓存,这些缓存包括hashmap中提供的名称及其TTL值
以下是一些代码(未经测试,因此您可能需要对其进行调整):
@Autowired
专用缓存管理器缓存管理器;
@自动连线
私有再贴现模板;
公共字符串getValue(字符串缓存名称、字符串键){
cacheManager.getCache(cacheName).get(key);
}
公共映射getCache(字符串cacheName){
返回模板
.key(cacheName+“*”)
.parallelStream()
.map(键->{
Map cacheEntries=newhashmap();
put(key,getValue(cacheName,key));
返回缓存条目;
}
)
.collect(Collectors.toList());
}
public void getAllCaches(){
cacheManager.getCacheNames().forEach(cacheName->{
Map cacheObject=getCache(cacheName);
cacheObject.entrySet().stream().peek(条目->{
System.out.println(entry.getKey()+“=”+entry.getValue());
});
}
}
对我不起作用,因为我没有Autowire的“RedisTemplate”,spring boot docs说它是可用的:那是1.x版的,我在spring-data-redis-2.3.5上。我链接的那一个也使用1.x版,因此我创建了这一个,并为2.x显式地加了标题。这段代码适用于所有版本。注意,我确实声明了“spring boot 2”我最初是针对v2.1.0编写代码的,您只需要将redistemplate/cachemanager对象配置为带注释的bean。
@Autowired
private CacheManager cacheManager;
@Autowired
private RedisTemplate redisTemplate;
public String getValue(String cacheName, String key) {
cacheManager.getCache(cacheName).get(key);
}
public Map<String, String> getCache(String cacheName) {
return redisTemplate
.keys(cacheName+"*")
.parallelStream()
.map(key -> {
Map<String, String> cacheEntries = new HashMap<>();
cacheEntries.put(key, getValue(cacheName, key));
return cacheEntries;
}
)
.collect(Collectors.toList());
}
public void getAllCaches() {
cacheManager.getCacheNames().forEach(cacheName -> {
Map<String, String> cacheObject = getCache(cacheName);
cacheObject.entrySet().stream().peek(entry -> {
System.out.println(entry.getKey() + " = " + entry.getValue());
});
}
}