Spring data redis-stringRedisTemplateの使い方


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の使い方について
    	/**
    	 *     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 maps = ops.entries(tableName);//      key-value 
    		for (Object key : maps.keySet()) {
    			System.out.println("map-key:" + key + "map-value:" + maps.get(key));
    		}
    		// ops.persist();//    (     )   。
    		System.out.println("ops.hasKey(cs01):" 
    		                  + ops.hasKey(tableName, "cs01"));// true
    		System.out.println("ops.hasKey(cs02):" 
    		                  + ops.hasKey(tableName, "cs02"));// true
    		System.out.println("ops.size():" + ops.size(tableName));// 2
    
    		Set keys = ops.keys(tableName);//      key
    		for (Object string : keys) {
    			System.out.println("ops.keys():" + string);
    		}
    
    		System.out.println("ops.values():" 
    		                  + ops.values(tableName));//      value
    		System.out.println("ops.size():" 
    		                  + ops.size(tableName));// 2     
    
    		ops.delete("cs01");//   key cs01   
    	}
    
    	/**
    	 * List        
    	 * 
    	 * @param tableName
    	 */
    	public void boundListOps(String tableName) {
    		System.out.println("==================List==============");
    		BoundListOperations ops = stringRedisTemplate
    				.boundListOps(tableName);
    		ops.leftPush("cs01");// left push     ,    ,     ,    
    		ops.leftPushIfPresent("cs011");//             
    		ops.leftPush("cs01", "cs0111");//  cs01     
    		ops.leftPushAll("cs01111", "cs011111");
    
    		List values = ops.range(0, -1);
    		for (String string : values) {
    			System.out.println("letf push:" + string);
    		}
    
    		ops.rightPush("cs02");// right push           ,     ,    
    		ops.rightPushIfPresent("cs022");
    		ops.rightPush("cs02", "cs0222");//  cs02     
    		ops.rightPushAll("cs02222", "cs022222");
    
    		ops.set(0, "cs04");//          cs04
    		// ops.trim(0, 3);//        4     
    
    		List values1 = ops.range(0, -1);//       
    		for (String string : values1) {
    			System.out.println("right push:" + string);
    		}
    
    		List values2 = ops.range(1, 2);//           
    		for (String string : values2) {
    			System.out.println("right push1:" + string);
    		}
    		System.out.println("ops.index(1):" + ops.index(0));//        
    		System.out.println("ops.remove(0, cs01):" 
    		                   + ops.remove(0, "cs01"));// 1,  “cs01”
    		System.out.println("ops.leftPop():" + ops.leftPop());//     
    		System.out.println("ops.rightPop():" + ops.rightPop());//     
    		System.out.println("ops.remove(0, cs01)1:" 
    		                   + ops.remove(0, "cs01"));// 0 ,  “cs01”     0
    
    		// ops.persist();//    (     )   。
    	}
    
    	public void boundSetOps() {
    		System.out.println("==================Set==============");
    		String tableName2 = "caoshuai03";
    		BoundSetOperations ops = stringRedisTemplate
    				.boundSetOps(tableName2);
    
    		String[] values = { "cs03", "cs04" };
    		System.out.println("ops.add(values):" 
    		                  + ops.add(values));//        set ,       
    
    		Set sets1 = ops.members();//   set      ,            
    		for (String string : sets1) {
    			System.out.println("ops.members()1:" + string);
    		}
    
    		//       
    		System.out.println("ops.randomMember():" + ops.randomMember());
    		//        
    		System.out.println("ops.randomMembers(1):" + ops.randomMembers(1));
    		//        ,     
    		System.out.println("ops.randomMembers(2):" + ops.randomMembers(2));
    
    		System.out.println("ops.distinctRandomMembers(1):"
    				+ ops.distinctRandomMembers(1));//        
    		System.out.println("ops.distinctRandomMembers(2):"
    				+ ops.distinctRandomMembers(2));//            
    
    		System.out.println(ops.isMember("cs04"));//     cs04,     true
    		System.out.println(ops.isMember("cs01"));//     false
    
    		System.out.println(ops.size());// set    
    
    		System.out.println(ops.getKey());//   set   
    
    		System.out.println(ops.getType());//     
    
    		Set set7 = ops.diff("caoshuai02");//      set       ,  
    		for (String string : set7) {
    			System.out.println("ops.diff(caoshuai02):" + string);
    		}
    
    		//      set      ,  
    		Set set8 = ops.intersect("caoshuai02");
    		for (String string : set8) {
    			System.out.println("ops.intersect(caoshuai02):" + string);
    		}
    
    		//     set     ,       ,       ,  
    		Set set6 = ops.union("caoshuai02");
    		for (String string : set6) {
    			System.out.println("ops.union(caoshuai02):" + string);
    		}
    
    		//      set      ,  
    		List keys = new ArrayList();
    		keys.add("caoshuai02");
    		Set set = ops.intersect(keys);
    		for (String string : set) {
    			System.out.println("ops.intersect(keys):" + string);
    		}
    
    		//      set       ,  
    		List keys1 = new ArrayList();
    		keys1.add("caoshuai02");
    		Set set3 = ops.diff(keys);
    		for (String string : set3) {
    			System.out.println("ops.diff(keys)3:" + string);
    		}
    
    		//     set     ,       ,       ,  
    		List keys2 = new ArrayList();
    		keys2.add("caoshuai02");
    		Set set4 = ops.union(keys2);
    		for (String string : set4) {
    			System.out.println("ops.union(keys2):" + string);
    		}
    
    		//      set       ,  ,     set 
    		ops.diffAndStore("caoshuai02", "caoshuai04");
    		// ops.diffAndStore(keys, destKey);
    		
    		//      set      ,  ,     set 
    		ops.intersectAndStore("caoshuai02", "caoshuai05");
    		// ops.intersectAndStore(keys, destKey);
    		
    		//     set      ,  ,     set 
    		ops.unionAndStore("caoshuai02", "caoshuai06");
    		// ops.unionAndStore(keys, destKey);
    
    		//           set ,      true
    		System.out.println(ops.move("caoshuai07", "cs03"));
    		//           set ,    ,  false, :  set   cs01
    		System.out.println(ops.move("caoshuai07", "cs01"));
    
    		System.out.println(ops.pop());// pop     ,      pop 
    
    		System.out.println(ops.remove("cs03"));//       ,       
    		System.out.println(ops.remove("cs01"));//     ,       
    	}
    	
    	public void boundValueOps() {
    		System.out.println("==================String==============");
    		String tableName2 = "LiMing01";
    		BoundValueOperations ops = stringRedisTemplate
    				.boundValueOps(tableName2);
    
    		System.out.println(ops.append("stu01"));//     ,           
    		
    		//           ,          
    		System.out.println(ops.getAndSet("stu02"));
    		
    		System.out.println(ops.get());//        
    		
    		System.out.println(ops.get(0, 1));//                 
    		System.out.println(ops.get(0, 5));//                 ,         
    		
    		System.out.println(ops.size());//         
    		ops.set("stu03");//    
    		System.out.println("ops.set(stu03):" + ops.get());//        
    		ops.set("stu04", 0);//   0     
    		System.out.println("ops.set(stu04, 0):" + ops.get());//        
    		
    		//     string    ,      set      ,   false
    		System.out.println(ops.setIfAbsent("stu04"));
    		System.out.println("ops.setIfAbsent(stu04):" +ops.get());//        
    		
    		stringRedisTemplate.delete(tableName2);//   string
    		//     string     ,      set         true
    		System.out.println(ops.setIfAbsent("stu06"));
    		System.out.println("ops.setIfAbsent(stu06):" + ops.get());//        
    		ops.set("stu05", 30, TimeUnit.SECONDS);//  30   	
    	}
    
    	public void boundZSetOps() {
    		System.out.println("==================Zset==============");
    		String tableName2 = "LiMing03";
    		BoundZSetOperations ops = stringRedisTemplate
    				.boundZSetOps(tableName2);
    		
    		System.out.println(ops.add("stu01", 1));//Zset     
    		System.out.println(ops.add("stu03", 1));//Zset     
    		
    		System.out.println(ops.count(0, 1));//  score        
    		
    		//     score,  score   ,  stu04  ,   score    
    		//  :      stu04 score 2.0,         :stu04, score:6.0
    		System.out.println(ops.incrementScore("stu04", 4));
    		
    		ops.intersectAndStore("LiMing02", "LiMing04");
    		//ops.intersectAndStore(otherKeys, destKey);
    		ops.unionAndStore("LiMing02", "LiMing05");
    		//ops.unionAndStore(otherKeys, destKey);
    		
    		Set> sets = new HashSet>();
    		TypedTuple typedTuple = new TypedTuple() {
    			
    			@Override
    			public int compareTo(TypedTuple o) {
    				// TODO Auto-generated method stub
    				return 0;
    			}
    			
    			@Override
    			public String getValue() {
    				// TODO Auto-generated method stub
    				return "stu06";
    			}
    			
    			@Override
    			public Double getScore() {
    				// TODO Auto-generated method stub
    				return 6.0;
    			}
    		};
    		sets.add(typedTuple);
    		ops.add(sets);//    
    		
    		Set set1 = ops.range(0, -1); //         
    		for (String string : set1) {
    			System.out.println("ops.range(0, 1):" + string);
    		}
    		
    		Set set2 = ops.rangeByScore(1, 4);//    score     ,  1 4
    		for (String string : set2) {
    			System.out.println("ops.rangeByScore(0, 4):" + string);
    		}
    		
    		//         
    		Set> set3 = ops.rangeWithScores(0, 4);
    		for (TypedTuple string : set3) {
    			System.out.println("ops.rangeByScore(0, 4):" + string.getValue()
    					         + "score:" + string.getScore());
    		}
    		
    		System.out.println(ops.remove("stu01"));//    ,         
    		
    		Set set5 = ops.range(0, -1); //         
    		for (String string : set5) {
    			System.out.println("ops.range(0, 1)5:" + string);
    		}
    		
    		ops.removeRangeByScore(1, 4);//  score    1 4  ,  1 4
    		
    		Set set6 = ops.range(0, -1); //         
    		for (String string : set6) {
    			System.out.println("ops.range(0, 1)6:" + string);
    		}
    		
    		ops.removeRange(0, 1);//                 
    		
    		Set set7 = ops.range(0, -1); //         
    		for (String string : set7) {
    			System.out.println("ops.range(0, 1)7:" + string);
    		}
    	}