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 コマンドリファレンス (英語) からのグループ化に続く)を提供します。

運用ビュー
  • 命令的

  • リアクティブ

インターフェース 説明

キー型の操作

GeoOperations (Javadoc)

GEOADDGEORADIUS、…などの Redis 地理空間操作

HashOperations (Javadoc)

Redis ハッシュ演算

HyperLogLogOperations (Javadoc)

Redis PFADDPFCOUNT、…などの HyperLogLog 操作

ListOperations (Javadoc)

Redis リスト操作

SetOperations (Javadoc)

Redis セット操作

ValueOperations (Javadoc)

Redis 文字列(または値)操作

ZSetOperations (Javadoc)

Redis zset(またはソートされたセット)操作

キーバウンドオペレーション

BoundGeoOperations (Javadoc)

Redis キーバウンド地理空間操作

BoundHashOperations (Javadoc)

Redis ハッシュキーバインド操作

BoundKeyOperations (Javadoc)

Redis キーバインド操作

BoundListOperations (Javadoc)

Redis リストキーバインド操作

BoundSetOperations (Javadoc)

Redis はキーバウンド操作を設定します

BoundValueOperations (Javadoc)

Redis 文字列(または値)キーバインド操作

BoundZSetOperations (Javadoc)

Redis zset(またはソートされたセット)キーバインド操作

インターフェース 説明

キー型の操作

ReactiveGeoOperations (Javadoc)

GEOADDGEORADIUS などの Redis 地理空間操作)

ReactiveHashOperations (Javadoc)

Redis ハッシュ演算

ReactiveHyperLogLogOperations (Javadoc)

Redis HyperLogLog 操作など (PFADDPFCOUNT、その他)

ReactiveListOperations (Javadoc)

Redis リスト操作

ReactiveSetOperations (Javadoc)

Redis セット操作

ReactiveValueOperations (Javadoc)

Redis 文字列(または値)操作

ReactiveZSetOperations (Javadoc)

Redis zset(またはソートされたセット)操作

構成が完了すると、テンプレートはスレッドセーフになり、複数のインスタンスで再利用できます。

RedisTemplate は、ほとんどの操作に Java ベースのシリアライザーを使用します。これは、テンプレートによって書き込まれたり読み取られたりするオブジェクトは、Java を通じて直列化および逆直列化されることを意味します。

テンプレートの直列化メカニズムを変更できます。Redis モジュールには、org.springframework.data.redis.serializer パッケージで使用できるいくつかの実装が用意されています。詳細については、"シリアライザー" を参照してください。enableDefaultSerializer プロパティを false に設定することで、シリアライザーのいずれかを null に設定し、生のバイト配列で RedisTemplate を使用することもできます。テンプレートではすべてのキーが null でない必要があることに注意してください。ただし、基礎となるシリアライザーが値を受け入れる限り、値は null であってもかまいません。詳細については、各シリアライザーの Javadoc を参照してください。

特定のテンプレートビューが必要な場合は、ビューを依存関係として宣言し、テンプレートを挿入します。次の例に示すように、コンテナーは自動的に変換を実行し、opsFor[X] 呼び出しを排除します。

テンプレート API の構成
  • 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 つを含む):

ただし、Spring OXM サポートを介してオブジェクト /XML マッピングに OxmSerializer を使用したり、JSON [Wikipedia] (英語) 形式でデータを保存するために Jackson2JsonRedisSerializer (Javadoc) または GenericJackson2JsonRedisSerializer (Javadoc) を使用したりすることができます。

ストレージ形式は値だけに限定されないことに注意してください。キー、値、またはハッシュに制限なく使用できます。

デフォルトでは、RedisCache (Javadoc) RedisTemplate (Javadoc) は Java ネイティブ直列化を使用するように構成されています。Java ネイティブ直列化は、検証されていないバイトコードを挿入する脆弱なライブラリやクラスを悪用するペイロードによって発生する リモートコードの実行を許可することが知られています。操作された入力により、デシリアライズ手順中にアプリケーションで不要なコードが実行される可能性があります。信頼できない環境では直列化を使用しないでください。一般に、代わりに他のメッセージ形式 (JSON など) を使用することを強くお勧めします。

Java シリアライゼーションによるセキュリティの脆弱性が懸念される場合は、コア JVM レベルでの汎用シリアライゼーションフィルターメカニズムを検討してください。