Redis - Как ключи HASH, SET и ZSET связаны с сохранением CrudRepository? - PullRequest
0 голосов
/ 07 ноября 2018

Я новичок в Redis и занимаюсь разработкой кода на примере Spring Boot + Spring Data Redis. Когда я сохранил записи, я вижу, что создаются KEYS и из этих ключей 4 are HASH, 1 ZSET и all others are SET.

Я не видел в документах Spring, значение каждого КЛЮЧА спасается. .

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"

enter image description here

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

Address.java

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

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

Gender.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());
    }
}

1 Ответ

0 голосов
/ 08 ноября 2018

Прежде чем ответить, не хотите ли поделиться своим кодом реализации RedisTemplate? (Или это генерируется аннотацией @RedisHash?) Я сам новичок в Spring-Data-Redis и не знал аннотации @RedisHash и хочу ее проверить.

В любом случае, по сути, здесь происходит то, что репозиторий Spring-Data-Redis вставляет объект Person в разные структуры данных, изначально поддерживаемые Redis для различных целей.

Redis поддерживает различные структуры данных, такие как:

  1. Hash Redis создает карту строковых полей и строковых значений для представления всего объекта Person. Если вы сделаете HGETALL persons:{your person id}, он покажет все различные поля и значения, связанные с вашим лицом. Объект

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

  2. Set Redis вставляет базовые необработанные строки и индексирует объекты на основе их поля. Следовательно, в вашей базе данных Redis было много операций SET. Вы можете видеть индексы firstName и lastName в вашем наборе данных

    SET holding all ids known in the keyspace "persons"

  3. ZSet Это операция Redis для Sorted Sets структуры данных. Который представляет собой упорядоченные коллекции строк. Из документации 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

...