首页 > 解决方案 > Redis - 为什么使用 Spring Data Redis 将详细信息同时保存为 HASH 和 SET?

问题描述

我是新手Redis并正在开发Spring Boot + Spring Data Redis示例。我正在使用CrudRepository,ExampleExampleMatchersAPI 从 Redis 键值存储数据库中进行搜索。

现在,当我简单地运行我的代码时,我看到那些人的数据也被保存SETHASH这个对吗 ?将个人详细信息保存为 SET 和 HASH 有什么用

在此处输入图像描述

显示我所有的代码

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

物种.java

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

    @Indexed
    private String name;
}

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

标签: springspring-bootredisjedisspring-data-redis

解决方案


现在可能回答晚了,SET可见的原因是因为二级索引。即在您的示例中,名字被注释为索引。Redis 将此视为二级索引,默认为 SET。


推荐阅读