Spring redis実装

3669 ワード

redisは使う人が多く、ネット上では基本的にいくつかの入門構成です.spring redisの実装(Jedisクライアントへのアクセスを例に)を紹介したいと思います.
Spring redisで最も主要なクラスはRedisTemplateです.
RedisTemplate
  • RedisTemplateはRedisOperations、すなわちそれ自体がOperationsであることを実現した.

  • RedisTemplateシーケンス化
    Redisに格納されているキー値は、シーケンス化された転送が必要です.これは、clientとserver間のプロトコルがbyteを要求し、Jedisがstringとbyte[]タイプの関数インタフェースを提供しているためです.直列化されたツールは多く、RedisTemplateではデフォルトでJdkSerializationRedisSerializerが使用されます.
       private boolean enableDefaultSerializer = true;
       private RedisSerializer> defaultSerializer = new JdkSerializationRedisSerializer();
       
       private RedisSerializer keySerializer = null;
       private RedisSerializer valueSerializer = null;
       private RedisSerializer hashKeySerializer = null;
       private RedisSerializer hashValueSerializer = null;
       private RedisSerializer stringSerializer = new StringRedisSerializer();
    

    シーケンス化するオブジェクトがStringの場合.対応するStringRedisSerializerを使用する必要があります.そうしないと、xacxedx 00x 05 tx 00tbのような文字化け接頭辞が表示されます.したがって、適切なシーケンス化ツールを構成します.詳細は、Spring DataがRedisを操作すると、key値にxacxedx 00x 05 tx 00tbが表示されます
    RedisTemplateの操作ビュー
  • RedisTemplateではredisの操作を分類する(例えばValueタイプの操作をValueOperationsにカプセル化し、Listタイプの操作をListOperationsにカプセル化する).管理が便利で、人々の使用習慣にも合っています.RedisTemplateでは以下の方法で対応するOperationsを得る.
  •    public ValueOperations opsForValue() {
         if (valueOps == null) {
           valueOps = new DefaultValueOperations(this);
         }
         return valueOps;
       }
    

    RedisTemplateは、Operationsに対応するBoundValue Operationsも提供しています.BoundOperationsはkey値をバインドし,エージェントによってOperationsの機能を実現する.RedisTemplateでは,対応するBoundOperationsを以下の方法で得た.
       public BoundValueOperations boundValueOps(K key)  {
         return new DefaultBoundValueOperations(key, this);//   RedisTemplate     DefaultBoundValueOperations  
       }
    
       private final ValueOperations ops;
       public DefaultBoundValueOperations(K key, RedisOperations operations){
         super(key, operations);// RedisTemplate    
         ops = operations.opsForValue(); 
       }
    

    BoundValueOperationsは、ValueOperationsのエージェントとして外部呼び出しに使用されます.
       public V get() {
         return (V)ops.get(getKey());
       }
    

    したがって,ValueOperationsもBoundValueOperationsも本質的にValueOperationsによって操作される.
    私はDefaultValueOperationsのコードを少し抜粋しました.他の方法は基本的にそうです.
      public V get(Object key)
      {
        return execute(new AbstractOperations.ValueDeserializingRedisCallback(this, key)
        {
          protected byte[] inRedis(, RedisConnection connection) {
            return connection.get(rawKey);
          }
        }
        , true);
      }
    

    このことから,すべての操作redisの操作はRedisTemplateを呼び出すexecuteメソッドで実行されることが分かる.executeメソッドには3種類あります.
  • public T execute(RedisCallback action, boolean exposeConnection, boolean pipeline)
  • public T execute(SessionCallback session)
  • public List executePipelined(final SessionCallback> session, final RedisSerializer> resultSerializer)

  • このうち、execute(RedisCallback action,boolean exposeConnection,boolean pipeline)は、何もありません.アクセスするたびに接続プールに接続を取ります(プールに接続がなく新規作成できる場合は、接続を新規作成します).(ここには物事の配置をサポートしているかどうかenableTransactionSupportがありますが、サポートが悪いのは穴だそうです.何が起こっているのか検証されていません)
    接続プールは、構成情報に基づいて、プール内の接続をタイミングスキャンして検出します.不要な接続または余分な接続をクリアするか、新しい接続を作成します.接続プールの清掃が有効であることを保証します.
    execute(SessionCallback session)は、みんなが尊敬しているspring redisが物事を使う方法です.接続をRedisConnectionHolderにバインドし、終了を使用して、結合を解除し、接続を返します.ここでは,RedisConnectionのwatch,multi,exec命令を設定することでデータの整合性を保証することができる.
    executePipelinedは、パイプを介して複数のredisコマンドを送信できます.これらのコマンドは一緒に実行され、互いに依存することはできません.