Spring数据Redis,过期和Redis群集

问题描述

我有一个使用的应用

  • 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 (将#修改为@)