spring - Redis - 为什么使用 Spring Data Redis 将详细信息同时保存为 HASH 和 SET?
问题描述
我是新手Redis
并正在开发Spring Boot + Spring Data Redis
示例。我正在使用CrudRepository
,Example
和ExampleMatchers
API 从 Redis 键值存储数据库中进行搜索。
现在,当我简单地运行我的代码时,我看到那些人的数据也被保存SET
了HASH
。这个对吗 ?将个人详细信息保存为 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());
}
}
解决方案
现在可能回答晚了,SET可见的原因是因为二级索引。即在您的示例中,名字被注释为索引。Redis 将此视为二级索引,默认为 SET。
推荐阅读
- html - 如何在 Google App Script 中获取 html 选择表单的值?
- google-bigquery - BigQuery 如何有效地将两个结果合并到唯一 id 上并且只保留最新的
- java - 在 HDFS 上创建文件
- javascript - 反应突出显示搜索的单词问题
- spring - Cucumber 测试用例一起运行时失败,但当我单独运行它们时它们通过
- r - 如何创建两个镜像堆叠面积图ggplot2
- ruby-on-rails - RSpec:is_expect和expect之间的区别
- email - 更新 Magento 1.9 后更改了电子邮件徽标
- javascript - xhttp POST xml 数据到服务器
- c - 二维数组段错误的指针