Spring-data-redis:プロパティとインスタンス

8239 ワード

Spring-data-redisはspring-dataモジュールのredisに対するサポート部分であり、略称は「SDR」であり、jedisクライアントAPIに基づく高度なパッケージとspringコンテナとの統合を提供している.実際にjedisクライアントは十分に簡単で軽量級であるが、spring-data-redisは逆に「過剰設計」の疑いがある.
Jedisクライアントはプログラミングの実施において以下の不足がある.
1)connection管理は自動化されておらず,connection-poolの設計には必要なコンテナサポートが欠けている.
2)データ操作は「シーケンス化」/「逆シーケンス化」に注目する必要がある.jedisのクライアントAPIが受け入れるデータ型はstringとbyteであり、構造化データ(json,xml,pojoなど)操作には追加のサポートが必要であるからである.
3)取引操作は純粋にハードコーディングである
4)pub/sub機能は,必要な設計モデルのサポートが不足しており,開発者にとって注目すべき点が多すぎる.
ただしjedisとspringの統合は、非常に簡単であり、「Jedis接続プールの例」を参照する.
 
一.Spring-data-redisはjedisに対して次の機能を提供します.
    1. 接続プールは自動的に管理され、高度にカプセル化された「RedisTemplate」クラスを提供します.
    2. jedisクライアント内の大量apiに対して分類パッケージを行い,同じタイプの操作をoperationインタフェースにカプセル化した.
  • ValueOperations:簡易K-V操作
  • SetOperations:setタイプデータ操作
  • ZSetOperations:zsetタイプデータ操作
  • HashOperations:mapタイプに対するデータ操作
  • ListOperations:listタイプに対するデータ操作
  •     3. キーの「bound」(バインド)操作を容易にするAPIが提供され、指定したキーをboundでカプセル化し、「明示的」なキーの再指定を必要とせずに一連の操作を行うことができる.すなわち、BoundKeyOperations:
  • BoundValueOperations
  • BoundSetOperations
  • BoundListOperations
  • BoundSetOperations
  • BoundHashOperations

  •   
        4. トランザクション操作をカプセル化し、コンテナ制御を行います.
        5. データの「シーケンス化/逆シーケンス化」には、複数の選択可能なポリシー(RedisSerializer)が用意されています.
  • JdkSerializationRedisSerializer:POJOオブジェクトのアクセスシーンは、JDK自体のシーケンス化メカニズムを使用して、pojoクラスをObjectInputStream/ObjectOutputStreamでシーケンス化し、最終的にredis-serverにバイトシーケンスを格納します.は、現在最も一般的に使用されているシーケンス化ポリシーです.
  • StringRedisSerializer:Keyまたはvalueが文字列のシーンは、指定されたcharsetに従ってデータのバイトシーケンスをstringに符号化し、「new String(bytes,charset)」および「string.getBytes(charset)」の直接パッケージである.最も軽量で効率的な戦略です.
  • JacksonJsonRedisSerializer:jackson-jsonツールはjavabeanとjsonの間の変換能力を提供し、pojoインスタンスをjsonフォーマットにシーケンス化してredisに格納したり、jsonフォーマットのデータをpojoインスタンスに変換したりすることができます.jacksonツールは、シーケンス化と逆シーケンス化の両方でClassタイプを明確に指定する必要があるため、このポリシーをカプセル化するのは少し複雑です.【jackson-mapper-aslツールのサポートが必要】
  • OxmSerializer:javabeanとxmlの間の変換能力を提供し、現在使用可能な3つのサポートにはjaxb、apache-xmlbeansが含まれています.redisに格納されているデータはxmlツールになります.しかし、この戦略を使用すると、プログラミングは少し難しく、効率が最も低くなります.使用は推奨されません.【spring-oxmモジュールのサポートが必要】
  • 「シーケンス化とシーケンス化」におけるJ d k S e r a i a l i z a tionRedisSerializerとStringRedisSerializerは最も基本的なポリシーであり、原則としてアプリケーションのアクセスと解析のためにデータを任意のフォーマットに格納することができます(app、hadoopなどの他のツールが適用されます).ただし、jsonでもxmlでもStringであるため、設計時に「JacksonJsonRedisSerializer」と「OxmSerializer」を直接使用することは推奨されません.
    サードパーティ製ツールでデータを解析する必要がある場合は、JdkSerializationRedisSerializerではなくStringRedisSerializerを使用する必要があります.
    データフォーマットがjsonまたはxmlである必要がある場合は、プログラミングレベルでredisTemplate構成でStringRedisSerializerを使用し、ストレージの前または読み取り後に「SerializationUtils」ツールを使用してjsonまたはxmlに変換します.次の例を参照してください.
     
        6. 設計モデルとJMS開発構想に基づいて、pub/subのAPI設計をパッケージ化し、開発をより便利にした.
        7.Spring-data-redisでは、shardingに良いパッケージを提供していません.もしあなたのアーキテクチャがshardingに基づいている場合は、自分で実現する必要があります.これもsdrとjedisに比べて、唯一欠けている特性です.
     
    二.単純な例:
    1)spring構成:
    <beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byName">
    	<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
    		<property name="maxActive" value="32"></property>
    		<property name="maxIdle" value="6"></property>
    		<property name="maxWait" value="15000"></property>
    		<property name="minEvictableIdleTimeMillis" value="300000"></property>
    		<property name="numTestsPerEvictionRun" value="3"></property>
    		<property name="timeBetweenEvictionRunsMillis" value="60000"></property>
    		<property name="whenExhaustedAction" value="1"></property>
    	</bean>
    	<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" destroy-method="destroy">
    		<property name="poolConfig" ref="jedisPoolConfig"></property>
    		<property name="hostName" value="127.0.0.1"></property>
    		<property name="port" value="6379"></property>
    		<property name="password" value="0123456"></property>
    		<property name="timeout" value="15000"></property>
    		<property name="usePool" value="true"></property>
    	</bean>
    	<bean id="jedisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
    		<property name="connectionFactory" ref="jedisConnectionFactory"></property>
    		<property name="keySerializer">
    			<bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
    		</property>
    		<property name="valueSerializer">
    			<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
    		</property>
    	</bean>
    </beans>

    2)プログラムの例:
    public class SpringDataRedisTestMain {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-redis-beans.xml");
    		RedisTemplate redisTemplate = (RedisTemplate)context.getBean("jedisTemplate");
    		//  key   StringRedisSerializer
    		//  value  JdkSerializationRedisSerializer
    		ValueOperations<String, User> valueOper = redisTemplate.opsForValue();
    		User u1 = new User("zhangsan",12);
    		User u2 = new User("lisi",25);
    		valueOper.set("u:u1", u1);
    		valueOper.set("u:u2", u2);
    		System.out.println(valueOper.get("u:u1").getName());
    		System.out.println(valueOper.get("u:u2").getName());
    	}
    	
    	/**
    	 *     jdk     ,bean    Serializable,   getter/setter  
    	 * @author qing
    	 *
    	 */
    	static class User implements Serializable{
    		
    		/**
    		 * 
    		 */
    		private static final long serialVersionUID = -3766780183428993793L;
    		private String name;
    		private Date created;
    		private int age;
    		public User(){}
    		public User(String name,int age){
    			this.name = name;
    			this.age = age;
    			this.created = new Date();
    		}
    		public String getName() {
    			return name;
    		}
    		public void setName(String name) {
    			this.name = name;
    		}
    		public Date getCreated() {
    			return created;
    		}
    		public void setCreated(Date created) {
    			this.created = created;
    		}
    		public int getAge() {
    			return age;
    		}
    		public void setAge(int age) {
    			this.age = age;
    		}
    		
    	}
    
    }

        3) RedisTemplate:
    jedisPool接続プールを使用したことがある場合は、データ操作の前にpoolが必要です.getResource()は接続プールから「リンクリソース」(Jedis)を取得し、操作後にpoolを呼び出す必要があります.returnResource()は、リソースを接続プールに返します.しかし、spring-data-redisではpoolを直接操作していないようですが、springはどのようにpool管理をしているのでしょうか.一言:springの「門番の絶技」--callback.
  • publicT execute(RedisCallbackaction):この方法はredisTemplateで動作を実行する最下位の方法であり、redisTemplateに基づく呼び出し(例えばvalueOperations)は最終的にRedisCallbackにカプセル化され、redisTemplateはexecuteメソッドでjedisクライアントAPIを直接使用してserverと通信する.接続プールが使用されている場合は、操作後にreturnSourceが実行されます.

  • その他の例は、次のリンクを参照してください.
    1) serializerインスタンス
    2) operationインスタンス
    3) pub/subインスタンス