对于最新的稳定版本,请使用 Spring Data Redis 3.3.1Spring中文文档

对于最新的稳定版本,请使用 Spring Data Redis 3.3.1Spring中文文档

Spring Data Redis 允许您轻松实现域实体,如以下示例所示:Spring中文文档

例 1.样本人员实体
@RedisHash("people")
public class Person {

  @Id String id;
  String firstname;
  String lastname;
  Address address;
}

我们这里有一个非常简单的域对象。 请注意,它的类型上有一个注释,以及一个名为 的属性,该属性用 . 这两个项目负责创建用于持久化哈希的实际密钥。@RedisHashidorg.springframework.data.annotation.IdSpring中文文档

用“注释”和“命名”的属性被视为标识符属性。 那些有注释的人比其他人更受青睐。@Idid

现在,要真正拥有一个负责存储和检索的组件,我们需要定义一个存储库接口,如以下示例所示:Spring中文文档

例 2.用于持久化人员实体的基本存储库接口
public interface PersonRepository extends CrudRepository<Person, String> {

}

随着我们存储库的扩展,它提供了基本的 CRUD 和 finder 操作。 我们需要将两者粘合在一起的是相应的 Spring 配置,如以下示例所示:CrudRepositorySpring中文文档

例 3.用于 Redis 存储库的 JavaConfig
@Configuration
@EnableRedisRepositories
public class ApplicationConfig {

  @Bean
  public RedisConnectionFactory connectionFactory() {
    return new LettuceConnectionFactory();
  }

  @Bean
  public RedisTemplate<?, ?> redisTemplate(RedisConnectionFactory redisConnectionFactory) {

    RedisTemplate<byte[], byte[]> template = new RedisTemplate<byte[], byte[]>();
    template.setConnectionFactory(redisConnectionFactory);
    return template;
  }
}

给定前面的设置,我们可以注入到我们的组件中,如以下示例所示:PersonRepositorySpring中文文档

例 4.访问个人实体
@Autowired PersonRepository repo;

public void basicCrudOperations() {

  Person rand = new Person("rand", "al'thor");
  rand.setAddress(new Address("emond's field", "andor"));

  repo.save(rand);                                         (1)

  repo.findOne(rand.getId());                              (2)

  repo.count();                                            (3)

  repo.delete(rand);                                       (4)
}
1 如果当前值是或重用已设置的值,则生成一个新值,并使用模式为 — 在本例中为 的键将类型的属性存储在 Redis 哈希中。idnullidPersonkeyspace:idpeople:5d67b7e1-8640-2024-beeb-c666fab4c0e5
2 使用 提供的 检索存储在 中的对象。idkeyspace:id
3 计算键空间 中可用的实体总数 ,由 on 定义。people@RedisHashPerson
4 从 Redis 中删除给定对象的键。
用“注释”和“命名”的属性被视为标识符属性。 那些有注释的人比其他人更受青睐。@Idid
1 如果当前值是或重用已设置的值,则生成一个新值,并使用模式为 — 在本例中为 的键将类型的属性存储在 Redis 哈希中。idnullidPersonkeyspace:idpeople:5d67b7e1-8640-2024-beeb-c666fab4c0e5
2 使用 提供的 检索存储在 中的对象。idkeyspace:id
3 计算键空间 中可用的实体总数 ,由 on 定义。people@RedisHashPerson
4 从 Redis 中删除给定对象的键。

持久化引用

标记属性允许存储简单的键引用,而不是将值复制到哈希本身中。 从 Redis 加载时,引用会自动解析并映射回对象,如以下示例所示:@ReferenceSpring中文文档

例 5.示例属性参考
_class = org.example.Person
id = e2c7dcee-b8cd-4424-883e-736ce564363e
firstname = rand
lastname = al’thor
mother = people:a9d4b3a0-50d3-4538-a2fc-f7fc2581ee56      (1)
1 Reference 存储被引用对象的整个键 ()。keyspace:id
保存引用对象时,引用对象不会持久化。 必须单独保留对参照对象的更改,因为仅存储参照。 在引用类型的属性上设置的索引不会解析。
1 Reference 存储被引用对象的整个键 ()。keyspace:id
保存引用对象时,引用对象不会持久化。 必须单独保留对参照对象的更改,因为仅存储参照。 在引用类型的属性上设置的索引不会解析。

保留部分更新

在某些情况下,您不需要加载和重写整个实体,只需在其中设置一个新值。 最后一个活动时间的会话时间戳可能是要更改一个属性的情况。 允许您定义现有对象并对其执行操作,同时负责更新实体本身和索引结构的潜在过期时间。 以下示例显示了部分更新:PartialUpdatesetdeleteSpring中文文档

例 6.示例部分更新
PartialUpdate<Person> update = new PartialUpdate<Person>("e2c7dcee", Person.class)
  .set("firstname", "mat")                                                           (1)
  .set("address.city", "emond's field")                                              (2)
  .del("age");                                                                       (3)

template.update(update);

update = new PartialUpdate<Person>("e2c7dcee", Person.class)
  .set("address", new Address("caemlyn", "andor"))                                   (4)
  .set("attributes", singletonMap("eye-color", "grey"));                             (5)

template.update(update);

update = new PartialUpdate<Person>("e2c7dcee", Person.class)
  .refreshTtl(true);                                                                 (6)
  .set("expiration", 1000);

template.update(update);
1 将 simple 属性设置为 。firstnamemat
2 将简单的“address.city”属性设置为“emond's field”,而无需传入整个对象。 注册自定义转换时,此操作不起作用。
3 删除该属性。age
4 设置复杂属性。address
5 设置值映射,这将删除先前存在的映射,并将值替换为给定的值。
6 更改生存时间时自动更新服务器到期时间。
更新复杂对象以及映射(或其他集合)结构需要与 Redis 进一步交互以确定现有值,这意味着重写整个实体可能会更快。
1 将 simple 属性设置为 。firstnamemat
2 将简单的“address.city”属性设置为“emond's field”,而无需传入整个对象。 注册自定义转换时,此操作不起作用。
3 删除该属性。age
4 设置复杂属性。address
5 设置值映射,这将删除先前存在的映射,并将值替换为给定的值。
6 更改生存时间时自动更新服务器到期时间。
更新复杂对象以及映射(或其他集合)结构需要与 Redis 进一步交互以确定现有值,这意味着重写整个实体可能会更快。