RedisTemplate
によるオブジェクトの操作
ほとんどのユーザーは、RedisTemplate
(Javadoc) とそれに対応するパッケージである org.springframework.data.redis.core
またはそのリアクティブバリアントである ReactiveRedisTemplate
(Javadoc) を使用すると思われます。テンプレートは、豊富な機能セットを備えているため、実際には Redis モジュールの中心クラスです。テンプレートは、Redis のインタラクションに高レベルの抽象化を提供します。[Reactive]RedisConnection
はバイナリ値 (byte
配列) を受け入れて返す低レベルのメソッドを提供しますが、テンプレートは直列化と接続管理を処理するため、ユーザーはそのような詳細を処理する必要がありません。
RedisTemplate
(Javadoc) クラスは RedisOperations
(Javadoc) インターフェースを実装し、そのリアクティブバリアントである ReactiveRedisTemplate
(Javadoc) は ReactiveRedisOperations
(Javadoc) を実装します。
[Reactive]RedisTemplate インスタンスの操作を参照するための推奨される方法は、[Reactive]RedisOperations インターフェースを使用することです。 |
さらに、テンプレートは、次の表で説明するように、特定の型または特定のキー(KeyBound
インターフェースを介して)に対して作業するための豊富な汎用インターフェースを提供する操作ビュー(Redis コマンドリファレンス (英語) からのグループ化に続く)を提供します。
運用ビュー
命令的
リアクティブ
インターフェース | 説明 |
---|---|
キー型の操作 | |
| |
Redis ハッシュ演算 | |
Redis | |
Redis リスト操作 | |
Redis セット操作 | |
Redis 文字列(または値)操作 | |
Redis zset(またはソートされたセット)操作 | |
キーバウンドオペレーション | |
Redis キーバウンド地理空間操作 | |
Redis ハッシュキーバインド操作 | |
Redis キーバインド操作 | |
Redis リストキーバインド操作 | |
Redis はキーバウンド操作を設定します | |
Redis 文字列(または値)キーバインド操作 | |
Redis zset(またはソートされたセット)キーバインド操作 |
インターフェース | 説明 |
---|---|
キー型の操作 | |
| |
Redis ハッシュ演算 | |
Redis HyperLogLog 操作など ( | |
Redis リスト操作 | |
Redis セット操作 | |
Redis 文字列(または値)操作 | |
Redis zset(またはソートされたセット)操作 |
構成が完了すると、テンプレートはスレッドセーフになり、複数のインスタンスで再利用できます。
RedisTemplate
は、ほとんどの操作に Java ベースのシリアライザーを使用します。これは、テンプレートによって書き込まれたり読み取られたりするオブジェクトは、Java を通じて直列化および逆直列化されることを意味します。
テンプレートの直列化メカニズムを変更できます。Redis モジュールには、org.springframework.data.redis.serializer
パッケージで使用できるいくつかの実装が用意されています。詳細については、"シリアライザー" を参照してください。enableDefaultSerializer
プロパティを false
に設定することで、シリアライザーのいずれかを null に設定し、生のバイト配列で RedisTemplate を使用することもできます。テンプレートではすべてのキーが null でない必要があることに注意してください。ただし、基礎となるシリアライザーが値を受け入れる限り、値は null であってもかまいません。詳細については、各シリアライザーの Javadoc を参照してください。
特定のテンプレートビューが必要な場合は、ビューを依存関係として宣言し、テンプレートを挿入します。次の例に示すように、コンテナーは自動的に変換を実行し、opsFor[X]
呼び出しを排除します。
Java 命令
Java リアクティブ
XML
@Configuration
class MyConfig {
@Bean
LettuceConnectionFactory connectionFactory() {
return new LettuceConnectionFactory();
}
@Bean
RedisTemplate<String, String> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, String> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
return template;
}
}
@Configuration
class MyConfig {
@Bean
LettuceConnectionFactory connectionFactory() {
return new LettuceConnectionFactory();
}
@Bean
ReactiveRedisTemplate<String, String> ReactiveRedisTemplate(ReactoveRedisConnectionFactory connectionFactory) {
return new ReactiveRedisTemplate<>(connectionFactory, RedisSerializationContext.string());
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="redisConnectionFactory" class="org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory"/>
<!-- redis template definition -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="redisConnectionFactory"/>
...
</beans>
[Reactive]RedisTemplate
を使用して項目をリストにプッシュする 命令的
リアクティブ
public class Example {
// inject the actual operations
@Autowired
private RedisOperations<String, String> operations;
// inject the template as ListOperations
@Resource(name="redisTemplate")
private ListOperations<String, String> listOps;
public void addLink(String userId, URL url) {
listOps.leftPush(userId, url.toExternalForm());
}
}
public class Example {
// inject the actual template
@Autowired
private ReactiveRedisOperations<String, String> operations;
public Mono<Long> addLink(String userId, URL url) {
return operations.opsForList().leftPush(userId, url.toExternalForm());
}
}
文字列に焦点を当てたコンビニエンスクラス
Redis に格納されているキーと値が java.lang.String
であることが非常に一般的であるため、Redis モジュールは、RedisConnection
と RedisTemplate
に、それぞれ StringRedisConnection
(およびその DefaultStringRedisConnection
実装)と StringRedisTemplate
の 2 つの拡張機能を提供し、集中的な文字列操作の便利なワンストップソリューションとして提供します。テンプレートと接続は、String
キーにバインドされるだけでなく、下にある StringRedisSerializer
を使用します。つまり、保存されているキーと値は人間が読める形式です(Redis とコードの両方で同じエンコーディングが使用されていると仮定します)。次のリストは例を示しています。
Java 命令
Java リアクティブ
XML
@Configuration
class RedisConfiguration {
@Bean
LettuceConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory();
}
@Bean
StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
@Configuration
class RedisConfiguration {
@Bean
LettuceConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory();
}
@Bean
ReactiveStringRedisTemplate reactiveRedisTemplate(ReactiveRedisConnectionFactory factory) {
return new ReactiveStringRedisTemplate<>(factory);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="redisConnectionFactory" class="org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory"/>
<bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate" p:connection-factory-ref="redisConnectionFactory"/>
</beans>
命令的
リアクティブ
public class Example {
@Autowired
private StringRedisTemplate redisTemplate;
public void addLink(String userId, URL url) {
redisTemplate.opsForList().leftPush(userId, url.toExternalForm());
}
}
public class Example {
@Autowired
private ReactiveStringRedisTemplate redisTemplate;
public Mono<Long> addLink(String userId, URL url) {
return redisTemplate.opsForList().leftPush(userId, url.toExternalForm());
}
}
他の Spring テンプレートと同様に、RedisTemplate
および StringRedisTemplate
を使用すると、RedisCallback
インターフェースを介して Redis と直接通信できます。この機能は、RedisConnection
と直接通信するため、完全に制御できます。StringRedisTemplate
が使用されている場合、コールバックは StringRedisConnection
のインスタンスを受け取ることに注意してください。次の例は、RedisCallback
インターフェースの使用方法を示しています。
public void useCallback() {
redisOperations.execute(new RedisCallback<Object>() {
public Object doInRedis(RedisConnection connection) throws DataAccessException {
Long size = connection.dbSize();
// Can cast to StringRedisConnection if using a StringRedisTemplate
((StringRedisConnection)connection).set("key", "value");
}
});
}
シリアライザー
フレームワークの観点から、Redis に格納されるデータはバイトのみです。Redis 自体はさまざまな型をサポートしていますが、ほとんどの場合、これらはデータが表すものではなく、データの格納方法を指します。情報を文字列に変換するか、その他のオブジェクトに変換するかは、ユーザーが決定します。
Spring Data では、ユーザー (カスタム) 型と生データ間の変換 (またはその逆) は、org.springframework.data.redis.serializer
パッケージの Spring Data Redis によって処理されます。
このパッケージには、名前が示すように、直列化プロセスを処理する 2 種類のシリアライザーが含まれています。
RedisSerializer
(Javadoc) に基づく双方向シリアライザー。RedisElementReader
およびRedisElementWriter
を使用する要素リーダーおよびライター。
これらのバリアントの主な違いは、RedisSerializer
は主に byte[]
に直列化されるのに対し、リーダーとライターは ByteBuffer
を使用することです。
複数の実装が利用可能です(このドキュメントですでにメンションされている 2 つを含む):
JdkSerializationRedisSerializer
(Javadoc) は、RedisCache
(Javadoc) およびRedisTemplate
(Javadoc) にデフォルトで使用されます。StringRedisSerializer
ただし、Spring OXM サポートを介してオブジェクト /XML マッピングに OxmSerializer
を使用したり、JSON [Wikipedia] (英語) 形式でデータを保存するために Jackson2JsonRedisSerializer
(Javadoc) または GenericJackson2JsonRedisSerializer
(Javadoc) を使用したりすることができます。
ストレージ形式は値だけに限定されないことに注意してください。キー、値、またはハッシュに制限なく使用できます。
デフォルトでは、 Java シリアライゼーションによるセキュリティの脆弱性が懸念される場合は、コア JVM レベルでの汎用シリアライゼーションフィルターメカニズムを検討してください。 |