问题描述
我有一个使用的应用
- Spring Boot 2.2.6.RELEASE(spring-boot-starter-data-redis)
- Jedis 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分钟后过期,但是会有额外的集合Foo
(具有所有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;
}
}
不幸的是,得到相同的结果。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)