Redis - Почему детали сохраняются как в HASH, так и в SET, используя Red Data Redis? - PullRequest
0 голосов
/ 06 ноября 2018

Я новичок в Redis и разрабатываю Spring Boot + Spring Data Redis пример. Я использую API CrudRepository, Example и ExampleMatchers для поиска в БД хранилища значений Redis Key.

Теперь, когда я просто запустил свой код, я увидел, что данные о людях также сохраняются как SET и HASH. Это правильно? Какая польза от сохранения персональных данных как в SET, так и в HASH

enter image description here

Отображение всего моего кода

public enum Gender {
    MALE, FEMALE {
        @Override
        public String toString() {
            return "Superwoman";
        }
    }
}

Species.java

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Species {

    @Indexed
    private String name;
}

Person.java

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@RedisHash("persons")
public class Person {

    @Id
    private String id;

    @Indexed
    private String firstname;
    private String lastname;
    @Indexed
    private Gender gender;

    private List<String> nicknames;
    @Indexed
    private Integer age;

    private Map<String, String> physicalAttributes;

    @Reference
    private Person relative;

    private Species species;
}

PersonRepository.java

public interface PersonRepository extends CrudRepository<Person, String>, QueryByExampleExecutor<Person> {

}

RedisExampleDemoApplication.java

@SpringBootApplication
public class RedisExampleDemoApplication implements CommandLineRunner{
    RedisMappingContext mappingContext = new RedisMappingContext();
    ExampleQueryMapper mapper = new ExampleQueryMapper(mappingContext, new PathIndexResolver(mappingContext));

    @Autowired
    private PersonRepository personRepository;

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

    @Override
    public void run(String... args) throws Exception {
        Person person = Person.builder().firstname("Walter").gender(Gender.MALE).age(50).build();
        Person person1 = Person.builder().firstname("Savani").gender(Gender.FEMALE).age(35).build();

        personRepository.save(person);
        personRepository.save(person1);

        // [firstname:Walter, gender:MALE, age:50]
        RedisOperationChain operationChain = mapper.getMappedExample(Example.of(person, ExampleMatcher.matchingAny()));
        System.out.println(operationChain.getOrSismember());


        System.out.println("----------------------------------------------");
        Person p = Person.builder().lastname("Foo").build();
        RedisOperationChain roc = mapper.getMappedExample(Example.of(p));
        System.out.println(" == "+roc.getOrSismember());
        System.out.println("-- "+roc.getSismember());
    }
}

1 Ответ

0 голосов
/ 02 августа 2019

Возможно, уже поздно отвечать, причина того, что SET видна, из-за вторичного индекса. Т.е. в вашем примере имя помечено как проиндексированное. Redis считает это вторичным индексом, который по умолчанию является SET.

...