【发布时间】:2020-10-07 13:43:51
【问题描述】:
我有一个应用正在使用
- Spring Boot 2.2.6.RELEASE (spring-boot-starter-data-redis)
- 绝地武士 3.1.0.
我有一个包含 6 个节点的 Redis 5.0.7 集群:3 个主节点和 3 个从节点,复制为 127.0.0.1:7000-7005(只是示例值)。
我已经这样配置了我的应用程序:
@Configuration
@EnableRedisRepositories(basePackages = "my.package.of.dtos", enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP)
public class RedisConfiguration {
@Bean
JedisConnectionFactory jedisConnectionFactory() {
return new JedisConnectionFactory(
new RedisClusterConfiguration(List.of(
"127.0.0.1:7000",
"127.0.0.1:7001",
"127.0.0.1:7002",
"127.0.0.1:7003",
"127.0.0.1:7004",
"127.0.0.1:7005")));
}
@Bean
public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory jedisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(jedisConnectionFactory);
return template;
}
}
我有几个 DTO,例如:
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
@RedisHash(value = "Foo", timeToLive = 300)
public class Foo {
private String id;
@Indexed
private String fooIndexedField;
private String fooField1;
private String fooField2;
}
和存储库:
@Repository
public interface FooRepository extends CrudRepository<Foo, String> {
List<Foo> findByFooIndexedField(String fooIndexedField);
}
我的用例:我有一个流量处理应用程序,我将数据写入 Redis 并希望通过索引字段读取实体列表。数据仅在一段时间内相关,因此我正在利用 Redis 的过期功能。
在我注意到 Redis 中的数据没有按预期过期之前,一切似乎都正常。当我连接到 Redis 集群(使用RedisClusterConfiguration)时,一旦哈希过期,与之关联并由 Spring Data Redis 写入的其余数据仍然存在,幻影会在 5 分钟后自行过期,但附加集 ex @987654325 @(包含所有 ID)、Foo:testId1:idx(值 Foo:fooIndexedField:testIndex1)和 Foo:fooIndexedField:testIndex1(值 testId1)仍然存在。
我已将 redis 配置换成RedisStandaloneConfiguration(单节点,用于测试目的),当哈希过期时所有数据都消失了。
到目前为止,我在 Spring 文档中找到的唯一内容是:Define and pin keyspaces by using @RedisHash("{yourkeyspace}") to specific slots when you use Redis cluster. 这不是我能做的。一些哈希需要分布在所有节点上,因为我不能假设它们适合一个节点。
唯一使我的集群不会因为孤立索引而耗尽内存的是设置maxmemory_policy:allkeys-lru 覆盖它们。这很麻烦,因为我看到我的所有节点一直在使用最大内存。
在我的应用程序、Spring Data Redis 或 Redis 集群设置中有什么遗漏了吗?
编辑: 使用 Redisson redisson-spring-data-22 版本 3.13.5 配置:
@Configuration
@EnableRedisRepositories(basePackages = "my.package.of.dtos", enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP)
public class RedisConfiguration {
@Bean
public RedissonConnectionFactory redissonConnectionFactory() {
Config config = new Config();
config.useClusterServers().addNodeAddress("redis://127.0.0.1:7000", "redis://127.0.0.1:7001", "redis://127.0.0.1:7002", "redis://127.0.0.1:7003", "redis://127.0.0.1:7004", "redis://127.0.0.1:7005");
return new RedissonConnectionFactory(config);
}
@Bean
public RedisTemplate<String, Object> redisTemplate(RedissonConnectionFactory redissonConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redissonConnectionFactory);
return template;
}
}
不幸的是,给出了相同的结果。
【问题讨论】:
标签: java redis spring-data-redis jedis