Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用SpringDataRedis2.x通过SpringBoot从redis缓存获取所有密钥?_Java_Spring_Redis - Fatal编程技术网

Java 如何使用SpringDataRedis2.x通过SpringBoot从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

我正在尝试获取由Redis支持的Spring引导缓存中的条目,该缓存使用1.x的Spring数据Redis,当前版本对本机缓存使用
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());
    });
  }
}