当前位置: 首页 > 知识库问答 >
问题:

Spring Data Redis,过期和Redis集群

凌长恨
2023-03-14

我有一个应用程序使用

  • Spring Boot 2.2.6.release(spring-boot-starter-data-redis)
  • Jedis 3.1.0.
@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;
    }
}
@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分钟后就会自己过期,但是附加集exfoo(使用所有ID)、foo:testId1:idx(valuefoo:fooindexedfield:testindex1)和foo:fooindexedfield:testindex1(valueTestid1)仍然存在。

我已经将redis配置交换到redisstandaloneConfiguration(单节点,出于测试目的),当hash过期时,所有数据都消失了。

到目前为止,我在Spring文档中找到的唯一一件事是:在使用Redis集群时,通过使用@redishash(“{yourkeyspace}”)定义和固定键空间到特定的插槽。这不是我能做的。有些散列需要分布在所有节点上,因为我不能假设它们适合一个节点。

唯一能防止集群因孤立索引而耗尽内存的是覆盖索引的设置maxmemory_policy:allkeys-lru。这很麻烦,因为我看到我的所有节点都在使用最大内存。

在我的应用程序、Spring Data Redis或Redis集群设置中,我是否遗漏了什么?

@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;
    }
}

共有1个答案

拓拔意
2023-03-14

结果Spring Data Redis不适合我。我使用Spring Data Redis的经验是:

  • 将部分数据过期过程从Redis委托给使用它的应用程序
  • 仅当来自一个哈希的数据位于同一个群集节点上时才起作用
  • 当应用程序水平伸缩时,它不能正常工作
  • 与实际数据大小相比,峰值内存使用量增加了一倍,这是因为它节省了数据和幻影
  • 主索引和次索引可能会变得相当昂贵

在彻底阅读了Redis文档后,我解决了所有这些问题。事实证明,Redis开发人员对如何使用Redis有一个非常清晰的愿景。任何偏离这条道路的行为都会导致奇怪的问题。另一方面,保持在“正确的道路”意味着你将获得所有Redis的好处,而不需要任何努力。

    null
    null

免责声明:当我开始做这方面的工作时,我只知道关于Redis的流行语,我没有意识到它的真正潜力,也没有开发人员预想的用法。起初,这一切似乎都在逆流而上,但我越是根据Redis提供的功能调整代码,就越觉得使用它有好处。我认为Spring Data Redis是一个用于快速原型的可怕工具,但我觉得它类似于ORM的方法与Redis提供的讨厌的东西背道而驰。

 类似资料:
  • 我在本地配置了redis sentinel,在两个不同的端口10001和10002上运行。我有相同的sentinel身份验证设置。 Redis哨兵配置 使用的JAR版本 Spring-data-redis:2.0.10。发布 莴苣(io.莴苣.莴苣芯):5.0.5.RELEASE 在尝试连接到redisSentinelConfiguration时,我一直收到NOAUTH身份验证请求错误 使用Spr

  • 14:52:46.692[pool-1-thread-12]信息EndtoEnditTests-设置版本时间1548062566687 14:52:46.693[pool-1-thread-6]信息EndtoEnditTests-设置版本时间1548062566687 14:52:46.693[pool-1-thread-20]信息EndtoEndittest-设置版本时间154806256668

  • 在这个expire方法中,我们需要提供而不是。但是我需要过期而不是。 那么,请帮助我如何处理过期?

  • 问题内容: 有人知道Redis复制和Redis分片之间的区别吗? 它们有什么用?Redis将数据存储在内存中,这如何影响复制/分片? 可以同时使用它们吗? 问题答案: 分片几乎是复制的对立面,尽管它们是正交的概念并且可以很好地协同工作。 分片,也称为分区,是通过密钥对数据进行拆分。复制(也称为镜像)是复制所有数据。 分片有助于提高性能,减少任何一种资源的命中和内存负载。复制对于获得高可用性的读取很

  • Redis 集群(Redis Cluster) 是 Redis 提供的分布式数据库方案。 既然是分布式,自然具备分布式系统的基本特性:可扩展、高可用、一致性。 Redis 集群通过划分 hash 槽来分片,进行数据分享。 Redis 集群采用主从模型,提供复制和故障转移功能,来保证 Redis 集群的高可用。 根据 CAP 理论,Consistency、Availability、Partition

  • 问题内容: 当生存时间达到0时,我的Redis服务器不会删除密钥。 这是一个示例代码: 如果我通过redis检查信息返回,它说0个密钥已过期。 任何想法? 谢谢。 问题答案: 由于您正在执行“ …”,因此很难确定,但是我要说的是您在该部分设置了mykey,这将有效地消除过期。 从EXPIRE手册 仅当使用DEL命令删除密钥或使用SET或GETSET命令覆盖密钥时,才清除超时 另外,关于TTL的-1