使用方法
Spring Data Redis を使用すると、次の例に示すように、ドメインエンティティを簡単に実装できます。
@RedisHash("people")
public class Person {
@Id String id;
String firstname;
String lastname;
Address address;
}
ここには非常に単純なドメインオブジェクトがあります。型に @RedisHash
アノテーションがあり、org.springframework.data.annotation.Id
アノテーションが付けられた id
という名前のプロパティがあることに注意してください。これらの 2 つの項目は、ハッシュを永続化するために使用される実際のキーを作成する責任があります。
@Id でアノテーションが付けられたプロパティ、および id という名前のプロパティは、識別子プロパティと見なされます。アノテーションのあるものは他のものよりも好まれます。 |
ストレージと取得を担当するコンポーネントを実際に作成するには、次の例に示すように、リポジトリインターフェースを定義する必要があります。
public interface PersonRepository extends CrudRepository<Person, String> {
}
リポジトリは CrudRepository
を継承しているため、基本的な CRUD およびファインダー操作を提供します。次の例に示すように、物を接着するために間に必要なのは、対応する Spring 構成です。
@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
をコンポーネントに注入できます。
@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 のパターンを持つキーを使用して Redis ハッシュ内に型 Person のプロパティを格納します。この場合は people:5d67b7e1-8640-2024-beeb-c666fab4c0e5 である可能性があります。 |
2 | 提供された id を使用して、keyspace:id に格納されているオブジェクトを取得します。 |
3 | Person 上の @RedisHash によって定義された、キースペース people 内で使用可能なエンティティの総数をカウントします。 |
4 | 指定されたオブジェクトのキーを Redis から削除します。 |
永続的な参照
プロパティを @Reference
でマークすると、値をハッシュ自体にコピーする代わりに、単純なキー参照を格納できます。次の例に示すように、Redis からロードすると、参照は自動的に解決され、オブジェクトにマップされます。
_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 )を格納します。 |
参照オブジェクトは、参照オブジェクトが保存されるときに永続化されません。参照のみが保存されるため、参照オブジェクトの変更を個別に永続化する必要があります。参照される型のプロパティに設定されたインデックスは解決されません。 |
部分的な更新の永続化
場合によっては、エンティティ内に新しい値を設定するためだけに、エンティティ全体をロードして書き換える必要はありません。最後のアクティブ時間のセッションタイムスタンプは、1 つのプロパティを変更するようなシナリオである可能性があります。PartialUpdate
を使用すると、エンティティ自体とインデックス構造の両方の潜在的な有効期限の更新を処理しながら、既存のオブジェクトに対する set
および delete
アクションを定義できます。次の例は、部分的な更新を示しています。
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 ’ sfield」に設定します。カスタム変換が登録されている場合、これは機能しません。 |
3 | age プロパティを削除します。 |
4 | 複雑な address プロパティを設定します。 |
5 | 値のマップを設定します。これにより、既存のマップが削除され、値が指定されたものに置き換えられます。 |
6 | 有効期間を変更すると、サーバーの有効期限が自動的に更新されます。 |
複雑なオブジェクトやマップ(または他のコレクション)構造を更新するには、Redis とさらに対話して既存の値を決定する必要があります。つまり、エンティティ全体の書き換えが高速になる可能性があります。 |