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構成:
2)プログラムの例:
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インスタンス
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インタフェースにカプセル化した.
4. トランザクション操作をカプセル化し、コンテナ制御を行います.
5. データの「シーケンス化/逆シーケンス化」には、複数の選択可能なポリシー(RedisSerializer)が用意されています.
サードパーティ製ツールでデータを解析する必要がある場合は、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.
その他の例は、次のリンクを参照してください.
1) serializerインスタンス
2) operationインスタンス
3) pub/subインスタンス