【问题标题】:Redis - How the key HASH and SET and ZSET are related on the CrudRepository save?Redis - CrudRepository 保存中的关键 HASH 和 SET 和 ZSET 是如何相关的?
【发布时间】:2018-11-07 17:10:21
【问题描述】:

我是 Redis 新手,使用 Spring Boot + Spring Data Redis 示例开发代码。当我保存记录时,我看到 KEYS 被创建并从这些键中使用 4 are HASH1 ZSETall others are SET

我没有在 Spring 文档中看到,每个 KEY 的含义都被保存了。 .

127.0.0.1:6379> KEYS *
 1) "persons:c5cfd49d-6688-4b83-a9b7-be55dd1c36ad"
 2) "persons:firstname:bran"
 3) "persons:39e14dae-fa23-4935-948f-1922d668d1c2"
 4) "persons:f0b6dd26-8922-4a36-bd2a-792a17dddff7"
 5) "persons:address.city:Achalpur"
 6) "persons:e493385a-64ae-42be-8398-51757153d273:idx"
 7) "persons:053cdfea-e430-4e1c-acbd-ac40050b10cd:idx"
 8) "persons:firstname:rickon"
 9) "persons:e493385a-64ae-42be-8398-51757153d273"
10) "persons:address.country:India"
11) "persons:e7fc3ebe-9b48-48a8-a5f4-33a0e21f782f:idx"
12) "persons:firstname:sansa"
13) "persons:address:location"
14) "persons:firstname:robb"
15) "persons:firstname:jon"
16) "persons:lastname:snow"
17) "persons:e7fc3ebe-9b48-48a8-a5f4-33a0e21f782f"
18) "persons:c5cfd49d-6688-4b83-a9b7-be55dd1c36ad:idx"
19) "persons:lastname:stark"
20) "persons:f0b6dd26-8922-4a36-bd2a-792a17dddff7:idx"
21) "persons:053cdfea-e430-4e1c-acbd-ac40050b10cd"
22) "persons:39e14dae-fa23-4935-948f-1922d668d1c2:idx"
23) "persons:firstname:arya"
24) "persons:83cd4f58-c272-4d81-9023-8c66c8ac34b0:idx"
25) "persons:83cd4f58-c272-4d81-9023-8c66c8ac34b0"
26) "persons:address.city:Nagpur"
27) "persons:firstname:eddard"
28) "persons"

Person.java

@Data
@EqualsAndHashCode(exclude = { "children" })
@NoArgsConstructor
@AllArgsConstructor
@Builder
@RedisHash("persons")
public class Person {

    private @Id String id;
    private @Indexed String firstname;
    private @Indexed String lastname;

    private Gender gender;
    private Address address;

    private @Reference List<Person> children;
}

地址.java

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
public class Address {

    private @Indexed String city;
    private @Indexed String country;
    private @GeoIndexed Point location;
}

性别.java

public enum Gender {
    FEMALE, MALE
}

RedisExampleBootApplication.java

@SpringBootApplication
public class RedisExampleBootApplication implements CommandLineRunner{

    @Autowired PersonRepository repository;

    public static void main(String[] args) {
        SpringApplication.run(RedisExampleBootApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {  
        Address address1 = Address.builder().city("the north").country("winterfell").location(new Point(52.9541053, -1.2401016)).build();
        Address address2 = Address.builder().city("Casterlystein").country("Westerland").location(new Point(51.5287352, -0.3817819)).build();

        Person eddard = Person.builder().firstname("eddard").lastname("stark").gender(Gender.MALE).address(address1).build();
        Person robb = Person.builder().firstname("robb").lastname("stark").gender(Gender.MALE).address(address2).build();
        Person sansa = Person.builder().firstname("sansa").lastname("stark").gender(Gender.FEMALE).address(address1).build();
        Person arya = Person.builder().firstname("arya").lastname("stark").gender(Gender.FEMALE).address(address2).build();
        Person bran = Person.builder().firstname("bran").lastname("stark").gender(Gender.MALE).address(address1).build();
        Person rickon = Person.builder().firstname("rickon").lastname("stark").gender(Gender.MALE).address(address2).build();
        Person jon = Person.builder().firstname("jon").lastname("snow").gender(Gender.MALE).address(address1).build();

        repository.save(eddard);
        repository.save(robb);
        repository.save(sansa);
        repository.save(arya);
        repository.save(bran);
        repository.save(rickon);
        repository.save(jon);

        List<Person> starks = repository.findByLastname(eddard.getLastname());
        System.out.println("Person ="+starks.size());
    }
}

【问题讨论】:

    标签: java redis jedis spring-data-redis


    【解决方案1】:

    在回答之前,您介意分享一下您的 RedisTemplate 实现代码吗? (或者这是由 @RedisHash 注释生成的?)我自己是 Spring-Data-Redis 的新手,不知道 @RedisHash 注释并想查看它。

    无论如何,基本上这里发生的是 Spring-Data-Redis 存储库将 Person 对象插入到 Redis 原生支持的不同数据结构中以用于不同目的。

    Redis 支持不同的数据结构,例如:

    1. 哈希 Redis 创建一个字符串字段和字符串值的映射来表示您的整个 Person 对象。 如果您执行HGETALL persons:{your person id},它将显示与您的人员对象关联的所有不同字段和值

      HASH holding property values for id "c5cfd49d-6688-4b83-a9b7-be55dd1c36ad" in keyspace "persons"

    2. 设置 Redis 根据实体的字段插入基本的原始字符串和索引实体。因此,您的 Redis 数据库中有很多 SET 操作。你可以在你的数据集中看到firstNamelastName的索引

      SET holding all ids known in the keyspace "persons"

    3. ZSet 这是Sorted Sets数据结构的Redis操作。这是一个有序的字符串集合。 来自 Redis 文档

      In short with sorted sets you can do a lot of tasks with great performance that are really hard to model in other kind of databases.

    似乎 Spring Data 会自动将位置数据作为排序集插入以优化 CRUD 操作。

    您可以在这里阅读更多内容:

    https://github.com/spring-projects/spring-data-examples/blob/master/redis/repositories/README.md

    https://redis.io/topics/data-types

    【讨论】:

    • 您好,感谢您的发帖。我现在对自己的代码改进有了更好的想法。抱歉,但我认为您的问题是为什么 CrudRepository 执行了许多不同类型的插入操作?也许如果我对您的关注有更好的理解,我可以修改答案?谢谢
    • 这也是我关心的一部分——“为什么 CrudRepository 执行了很多不同类型的插入操作?”
    • 啊我明白了……本质上,Spring-Data-Redis 做了很多优化,以确保可以快速完成 CRUD 操作。在这种情况下,因为您在 Person 字段中添加了 @Indexed 注释,它会自动执行 SET 命令来进行二级索引。我相信,如果您的课程非常简单,则不会附加其他注释。存储库不会做那么多操作,但可能只做HSET 将数据插入redis。你可以看到你使用了很多@indexed@GeoIndexed。这些迫使存储库为您执行更多操作
    • 好的,谢谢。我只是想问一个笼统的问题。我希望将 Postgres 迁移到 Redis - 我几乎只有大约 5K 条记录的静态数据。但是在将 JPA 转换为 Redis Entity 时,我不确定如何使用连接表和多对一关系来维护多对多双向?我只是想删除所有注释并使 POJO 尽可能简单。现在如何处理连接表。您能否让我知道如何对数据进行建模以及如何了解有关 redis 的更多信息?我没有在网上看到好的材料
    • 另外,如何使用@Reference,因为在同一个Person类中使用同一个私有@Reference List&lt;Person&gt; children;对象
    猜你喜欢
    • 1970-01-01
    • 2016-10-21
    • 2015-12-23
    • 2019-04-09
    • 2014-11-18
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多