java - Redis - key HASH 和 SET 以及 ZSET 如何与 CrudRepository 保存相关?

标签 java redis jedis spring-data-redis

我是 Redis 新手,使用 Spring Boot + Spring Data Redis 示例开发代码。当我保存记录时,我看到 KEYS 被创建并且这些键中 4 是 HASH1 ZSET所有其他都是 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"

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

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

最佳答案

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

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

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

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

    键空间“persons”中 id“c5cfd49d-6688-4b83-a9b7-be55dd1c36ad”的 HASH 属性值

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

    SET 持有键空间“persons”中已知的所有 id

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

    简而言之,使用排序集,您可以以出色的性能完成许多任务,而这些任务在其他类型的数据库中很难建模。

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

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

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

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

关于java - Redis - key HASH 和 SET 以及 ZSET 如何与 CrudRepository 保存相关?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53194434/

相关文章:

java - 检查字符串的长度并在 Java 中使用 do-while

java - 我正在尝试检查网站状态是否在线

java - 每次运行代码时我都会得到不同的结果

java - HibernateException : Unable to resolve entity name from Class [java. lang.Boolean] 预期的实例/子类

c# - Redis 缓存的最小起订量单元测试

timeout - jedis pubsub 和超时 : how to listen infinitely as subscriber?

java - Spring Data Redis - 存储日期时出现问题

c# - StackExchange Redis SortedSetRangeByScoreWithScoresAsync 获取前 n 个元素

caching - 我的缓存守护进程应该驻留在哪里?

transactions - 没有 MULTI 的 ERR EXEC - Jedis