Spring data redis-stringRedisTemplateの使い方
16025 ワード
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に比べて、唯一欠けている特性です.
三.BoundKeyOperationsのAPIの使い方について
一.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に比べて、唯一欠けている特性です.
三.BoundKeyOperationsのAPIの使い方について
/**
* hashtable
*
* @param tableName
*/
public void boundHashOps(String tableName) {
System.out.println("==================Hash==============");
BoundHashOperations ops = stringRedisTemplate
.boundHashOps(tableName);
stringRedisTemplate.delete("student");
stringRedisTemplate.delete("student:1");
ops.put("cs01", "123");// ops.putAll(maps);
String key1 = ops.getKey();// tableName
System.out.println("key1:" + key1);
String key11 = ops.get("cs01");
System.out.println("key11:" + key11);// key
ops.putIfAbsent("cs02", "456");
String key2 = ops.getKey();
System.out.println("ops.getKey()-key2:" + key2);
String key21 = ops.get("cs02");
System.out.println("ops.get(cs02)-key21:" + key21);
Map maps = ops.entries();// key-value
for (String key : maps.keySet()) {
System.out.println("map-key:" + key + "map-value:" + maps.get(key));
}
// ops.persist();// ( ) 。
System.out.println("ops.getExpire():" + ops.getExpire());// -1
System.out.println("ops.expireAt(new Date()):"
+ ops.expireAt(new Date()));// true
System.out.println("ops.getType():" + ops.getType());// Hash
System.out.println("ops.hasKey(cs01):" + ops.hasKey("cs01"));// true
System.out.println("ops.hasKey(cs02):" + ops.hasKey("cs02"));// true
System.out.println("ops.size():" + ops.size());// 2
Set keys = ops.keys();// key
for (String string : keys) {
System.out.println("ops.keys():" + string);
}
System.out.println("ops.values():" + ops.values());// value
System.out.println("ops.size():" + ops.size());// 2
ops.delete("cs01");// key cs01
}
/**
* hashtable
*
* @param tableName
*/
public void opsForHash(String tableName) {
System.out.println("==================Hash==============");
HashOperations ops = stringRedisTemplate
.opsForHash();
stringRedisTemplate.delete("student");
stringRedisTemplate.delete("student:1");
ops.put(tableName, "cs01", "123");// ops.putAll(maps);
Object key11 = ops.get(tableName, "cs01");
System.out.println("key11:" + key11);// key
ops.putIfAbsent(tableName, "cs02", "456");
Object key21 = ops.get(tableName, "cs02");
System.out.println("ops.get(cs02)-key21:" + key21);
Map