Usage

Spring Data Redis 让你可以轻松实现领域实体,如下面的示例所示: .Sample Person Entity

@RedisHash("people")
public class Person {

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

这里有一个非常简单的领域对象。请注意它在其类型上带有 @RedisHash 注释,并且有一个名为 id 的属性,该属性用 org.springframework.data.annotation.Id 进行了注释。这两个项目负责创建用于持久化哈希的实际键。

使用 @Id 进行注释的属性以及名为 id 的属性被视为标识符属性。使用注释的比其他属性优先。

为了现在实际上拥有一个负责存储和检索的组件,我们需要定义一个存储库接口,如下面的示例所示: .Basic Repository Interface To Persist Person Entities

public interface PersonRepository extends CrudRepository<Person, String> {

}

由于我们的存储库扩展了 CrudRepository,因此它提供了基本的 CRUD 和查找器操作。我们需要在两者之间粘贴东西的东西是相应的 Spring 配置,如下面的示例所示: .JavaConfig for Redis Repositories

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

给定前面的设置,我们可以将 PersonRepository 注入到我们的组件中,如下面的示例所示: .Access to Person Entities

@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 如果当前值为 null,则生成一个新的 id,或重复使用已设置的 id`值,并在具有模式 `keyspace:id`的键中存储类型为 `Person`的属性——在这种情况下,可能是 `people:5d67b7e1-8640-2024-beeb-c666fab4c0e5
2 使用提供的 `id`检索存储在 `keyspace:id`的对象。
3 统计 keyspace 中可用的实体的总数,people,由 `Person`上的 `@RedisHash`定义。
4 从 Redis 中删除给定对象的键。

Persisting References

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

Example 1. Sample Property Reference
_class = org.example.Person
id = e2c7dcee-b8cd-4424-883e-736ce564363e
firstname = rand
lastname = al’thor
mother = people:a9d4b3a0-50d3-4538-a2fc-f7fc2581ee56      1
1 引用存储引用的对象的完整键 (keyspace:id)。

当引用对象被保存时,引用对象不会被持久化。您必须单独持久化对引用对象的更改,因为只存储了该引用。不会解析设置在引用类型属性上的索引。

Persisting Partial Updates

在某些情况下,你不必加载和重写整个实体,只需要在其中设置一个新值。最后一个活动时间的会话时间戳可能就是一个这样的场景,你希望更改一个属性。PartialUpdate 让你可以对现有对象定义 setdelete 操作,同时负责更新实体本身和索引结构的潜在过期时间。以下示例显示了部分更新:

Example 2. Sample Partial Update
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 将简单 firstname`属性设置为 `mat
2 将简单 'address.city' 属性设置为 'emond’s field',而无需传入整个对象。当注册了自定义转换时,此方法不起作用。
3 Remove the age property.
4 Set complex address property.
5 设置一个值映射,该映射删除先前存在的值映射,并用给定的值替换该值。
6 更改 Time To Live时自动更新服务器过期时间。

更新复杂的对象以及映射(或其他集合)结构需要进一步与 Redis 交互来确定现有值,这意味着可能更快速地重写整个实体。