我是春季数据 redis 的新手。我使用了弹簧启动数据 redis 2.0.3,如下所示(来自我的 gradle 构建)
compile('org.springframework.boot:spring-boot-starter-data-redis:2.0.3.RELEASE')
compile('io.lettuce:lettuce-core:5.1.3.RELEASE')
当我尝试创建 create(PUT) 或 get(GET) 时,它在 Redis 桌面管理器中注意到,密钥在提到的存储桶中装箱,但在存储桶下的空白命名空间(文件夹)中。但是我只想在存储桶(命名空间)下创建缓存键,而不是像另一个空命名空间那样在空白子文件夹中创建缓存键(文件夹 - 我可以从 Redis 桌面管理器中看到)
@Bean
LettuceConnectionFactory lettuceClientConfigurationConnectionFactory() {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setHostName(redisHostName);
redisStandaloneConfiguration.setPort(redisPort);
redisStandaloneConfiguration.setPassword(RedisPassword.of(redisAuth));
redisStandaloneConfiguration.setDatabase(0);
LettuceClientConfiguration.LettuceClientConfigurationBuilder lettuceClientConfiguration = LettuceClientConfiguration.builder();
lettuceClientConfiguration.useSsl();
LettuceConnectionFactory lettuceConFactory = new LettuceConnectionFactory(redisStandaloneConfiguration,
lettuceClientConfiguration.build());
return lettuceConFactory;
}
@Bean
public RedisCacheConfiguration cacheConfiguration() {
RedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
RedisSerializer stringRedisSerializer = new StringRedisSerializer();
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.disableCachingNullValues()
.entryTtl(Duration.ofHours(1))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(stringRedisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer));
redisCacheConfiguration.usePrefix();
return redisCacheConfiguration;
}
@Bean
@Primary
public CacheManager initRedisCacheManager(LettuceConnectionFactory factory) {
RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager
.RedisCacheManagerBuilder.fromConnectionFactory(factory);
builder.cacheDefaults(cacheConfiguration());
builder.transactionAware();
RedisCacheManager cacheManager = builder.build();
cacheManager.afterPropertiesSet();
return cacheManager;
}
我可以通过确保每个缓存桶设置前缀KyesWith来解决问题,因此放置和获取操作会寻找正确的存储/读取位置。
/** * 获取 Redis 缓存编写器 * @return RedisCacheWriter */ @Bean RedisCacheWriter redisCacheWriter() { 返回 RedisCacheWriter.lockingRedisCacheWriter(lettuceClientConfigurationConnectionFactory()); }
/** * 获取缓存管理器 * @return缓存管理器 */ @Bean @Primary CacheManager cacheManager() { RedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); Map cacheNamesConfigurationMap = new HashMap<>();
// configure catch buckets with prefixKeysWith information
cacheNamesConfigurationMap.put(CacheBucket.A, RedisCacheConfiguration.defaultCacheConfig().prefixKeysWith(CacheBucket.A+":")
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer)));
cacheNamesConfigurationMap.put(CacheBucket.B, RedisCacheConfiguration.defaultCacheConfig().prefixKeysWith(CacheBucket.B+":")
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer)));
cacheNamesConfigurationMap.put(CacheBucket.D, RedisCacheConfiguration.defaultCacheConfig().prefixKeysWith(CacheBucket.D+":")
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer)));
cacheNamesConfigurationMap.put(CacheBucket.E, RedisCacheConfiguration.defaultCacheConfig().prefixKeysWith(CacheBucket.E+":")
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer)));
cacheNamesConfigurationMap.put(CacheBucket.F, RedisCacheConfiguration.defaultCacheConfig().prefixKeysWith(CacheBucket.F+":")
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer)));
RedisCacheManager cacheManager = new RedisCacheManager(redisCacheWriter(), cacheConfiguration(), cacheNamesConfigurationMap);
cacheManager.setTransactionAware(true);
cacheManager.afterPropertiesSet();
return cacheManager;
}