Java Spring数据Redis、Expiring和Redis集群

Java Spring数据Redis、Expiring和Redis集群,java,redis,spring-data-redis,jedis,Java,Redis,Spring Data Redis,Jedis,我有一个应用程序使用 Spring Boot 2.2.6.RELEASE(Spring Boot starter数据redis) 绝地武士3.1.0 我有一个Redis 5.0.7集群,包含6个节点:3个主节点和3个从节点,复制127.0.0.1:7000-7005(只是示例值) 我已按以下方式配置了我的应用程序: @Configuration @EnableRedisRepositories(basePackages = "my.package.of.dtos", en

我有一个应用程序使用

  • Spring Boot 2.2.6.RELEASE(Spring Boot starter数据redis)
  • 绝地武士3.1.0
我有一个Redis 5.0.7集群,包含6个节点: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;
    }
}
和存储库:

@Repository
public interface FooRepository extends CrudRepository<Foo, String> {
    List<Foo> findByFooIndexedField(String fooIndexedField);
}

不幸的是,给出了相同的结果。

尝试使用Redisson库的更多功能和缓存管理、调度

我特别在分布式任务事务中使用它


这里列出了所有功能:

结果表明,SpringDataRedis对我来说并不合适。 我对Spring Data Redis的体验:

  • 将部分数据过期进程从Redis委托给使用它的应用程序
  • 仅当来自一个哈希的数据位于同一群集节点上时才有效
  • 当应用程序水平缩放时,它无法正常工作
  • 与实际数据大小相比,峰值内存使用量增加了一倍,这是因为它可以保存数据和数据
  • 主索引和辅助索引可能会变得非常昂贵
在彻底阅读Redis文档之后,我解决了所有这些问题。事实证明,Redis开发者对如何使用Redis有着非常清晰的愿景。任何偏离这条道路的行为都会导致奇怪的问题。另一方面,保持“正确的道路”意味着您将不费吹灰之力就获得所有Redis的好处

我所做的:

  • 将Redis库更改为Jedis,并在此基础上实现了我自己的非常简单的客户端
  • 将保存的数据限制到最低限度
  • 手动控制所有保存数据的TTL
  • 使用
    {PART\u of_KEY}
    手动控制实体开槽(例如,
    存在于多个键上,要求所有键都在一个槽上)
我得到的结果是:

  • 将单个数据大小从~60KB减少到~60B,消除了所有索引、重复等,从而使我可以瞬间保存比以前多几个数量级的数据
  • 利用Redis优化的数据过期功能,没有TTL就不会保存任何数据,因此瞬时内存使用始终是准确的
  • 由于只有在需要时才进行选择性的时隙设置,我仍然可以利用集群中的所有节点,但同时我可以利用所有以性能为中心的Redis调用-我从不在多个键上循环Redis调用,因为所有这些调用都可以在具有多个参数的单个调用中完成

免责声明:当我开始做这项工作时,我只知道有关Redis的流行语,我没有意识到它的真正潜力,也没有意识到它的开发人员所设想的用途。起初,这一切似乎都是逆潮流而动,但我越是根据Redis提供的功能调整代码,就越能感受到重新编写代码的效果。我认为Spring Data Read是用于快速原型制作的一个非常棒的工具,但我觉得它的ORM类方法就像是反对AdvyRead提供的。

正如您所建议的,我使用ReaSpring Spring DATA22版本3.3.5,创建了<代码> CONFIG/<代码>,用<代码> UECULSTECSEVER()/<代码>设置,添加了带有<代码>地址的节点。"redis://127.0.0.1:7000“,…)
并创建了
新RedisonConnectionFactory(config)
bean。然后我用它创建了
RedisTemplate
bean。效果是一样的-哈希过期后,我仍然有相同的孤立键剩余。
@Repository
public interface FooRepository extends CrudRepository<Foo, String> {
    List<Foo> findByFooIndexedField(String fooIndexedField);
}
@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;
    }
}