Spring+redis,spring-data-redis使用

12093 ワード

一:spring-data-redis概要
Spring-data-redis(以下、SDRと略す)は、jedisをベースにしたもので、Springはパッケージ化を継続しており、SDRの依存が比較的気持ち悪い、Spring 3に基づくものである.Xの、資料を調べたところ、次のようなmaven依存が必要であることがわかりました.私は1つ1つの试みがなくて、ここでただ学习の记录をして、原文は参考にしてください:http://hello-nick-xu.iteye.com/blog/2078547
Jedis Springで学習文書を使用する:http://snowolf.iteye.com/blog/1633196
1.Springコアパッケージ
spring-core-3.2.3.RELEASE.jar
spring-beans-3.2.3.RELEASE.jar
spring-context-3.2.3.RELEASE.jar
spring-context-support-3.2.3.RELEASE.jar
spring-expression-3.2.3.RELEASE.jar
spring-tx-3.2.3.RELEASE.jar
spring-aop-3.2.3.RELEASE.jar

2.ログ依存
commons-logging.jar
log4j-1.2.15.jar

3.jedisと接続プール
jedis-2.1.0.jar
commons-pool.jar

4.SDR依存
spring-data-redis-1.0.0.RELEASE.jar

次の図は、大まかな関係を示しています.
Spring+redis,spring-data-redis使用_第1张图片
二:必要なmaven
         
           
        	org.springframework.data  
        	spring-data-redis  
        	1.0.1.RELEASE  
    	  
    	  
       	 	redis.clients  
        	jedis  
        	2.1.0  
    	 
コア、spring-data-redis、jedis jar.
3:Springでのクラスの構成と呼び出し
redis.properties
# Redis settings
redis.host	        =localhost
redis.port		=6379  
redis.maxIdle		=300
redis.default.db	=0
redis.timeout		=100000
redis.maxActive		=600
redis.maxWait		=1000
redis.testOnBorrow	=true
ローカルアドレス、ポート、最大接続数、デフォルトDB数、待機タイムアウト時間、testOnBorrow:jedisが接続プールを取る場合、接続が無効またはオフの場合、次の接続を取り外し、同じ接続でエラーを回避する
spring-redis.xml
   
     
    	
    		
    			classpath:conf/spring/jdbc.properties 
    			classpath:conf/spring/log4j.properties 
    			classpath:conf/spring/redis.properties
    		  
    	 
    
  
     
      
         
          
          
          
      
      
      
      
          
          
          
         
          
          
        
        
        
      
      
          
    
    
    
    
    	 
    
  
    	
    		
    			classpath:conf/spring/jdbc.properties 
    			classpath:conf/spring/log4j.properties 
    			classpath:conf/spring/redis.properties
    		  
    	 
はSpringがpropertiesプロファイルをロードすることを示します.
画外音:以前、プロファイルを導入して使用したときは、次のようにしていました.
一つのXMLファイルの中だけならまだしも、複数のXMLファイルの中でこのように構成ファイルを引用してから${}でパラメータを引用すると、パラメータエラーが報告され、個人的にはSpringが
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
で統計管理が行われており、異なるXMLにplaceHodeの形で導入されるとSpringで作成されたデフォルトのこれらのBeanが上書きされるので、すべてのpropertiesファイルがlist形式で統一的に導入されるというテクニックがあります.
 
      
         
          
          
          
      
jedis接続プール、ここでは1種の設計モードを使ったようで、プール-工場-テンプレート、分かりませんが、Springは多くこのように配置されているようで、設計モードを勉強しなければなりません!
  
      
          
          
          
         
          
          
        
        
工場に接続し、jedisプールからredis接続のインスタンスオブジェクトを取ります.ここでredisにはパスワードがありません.
  
      
          
    
redisテンプレートクラス、Spring-data-redisパッケージ提供.

    
    	 
    
set方式は私たちが書いたクラス、redisServiceに注入されます.メンバー、redisTemplateを指定します.
自分でpojoを定義します.以下のようにします.
Student.java
package com.test.dao;

import java.io.Serializable;

public class Student implements Serializable{
	
	private static final long serialVersionUID = 1L;  
    private String id;  
    private String name;
    private int money;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getMoney() {
		return money;
	}
	public void setMoney(int money) {
		this.money = money;
	}  
}
何も言うことはありません.
RedisService.java
package com.redis.service;

import java.io.Serializable;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import com.test.dao.Student;

/**
 * redis    Demo,    
 * 1.jsp redis         redisTemplate.getStringSerializer().serialize(XXXXX)
 * 2.redis     ,      ,             redisTemplate.getStringSerializer().deserialize(XXXXX)
 * @author Sww
 *
 */
public class RedisService{
	 
	private RedisTemplate redisTemplate;
	
	public void setRedisTemplate(
			RedisTemplate redisTemplate) {
		this.redisTemplate = redisTemplate;
	}

	/**  
        *     ID,                
        * @param student 
        * @return 
        */  
	public void save(final Student student) {
		redisTemplate.execute(new RedisCallback() {
			public Object doInRedis(RedisConnection connection)
					throws DataAccessException {
				connection.set(
						//                student.uid
						redisTemplate.getStringSerializer().serialize(
								"student.uid:" + student.getId()),
						//       
						redisTemplate.getStringSerializer().serialize(
								student.getName())
				);
				return null;
			}
		});
	}
	
	/**
	*   ID                       
	* @param id
	* @return
	*/
	public Student select(final String id){
		return redisTemplate.execute(new RedisCallback() {
			public Student doInRedis(RedisConnection connection)
					throws DataAccessException {
				byte[] key = redisTemplate.getStringSerializer().serialize(
						"student.uid:" + id);
				if (connection.exists(key)) {  
	                byte[] value = connection.get(key);  
	                // redis          --- deserialize
	                String name = redisTemplate.getStringSerializer()  
	                        .deserialize(value);  
	                Student student = new Student();  
	                student.setId(id);  
	                student.setName(name);  
	                return student;  
	            }  
		    return null;
			}
		});
	}
	
	/**
	 *     ID      
	 * @param id
	 */
	public void delete(final String id){
		redisTemplate.execute(new RedisCallback() {
			public Object doInRedis(RedisConnection connection)
					throws DataAccessException {
				connection.del(redisTemplate.getStringSerializer().serialize(  
	                    "student.uid:" + id)); 
				return null;
			}
		});
	}
}
上記のような書き方は、私も真似の中で、よく知らないので、これは内部類の書き方でしょう、また設計モードで、急いで勉強しなければなりません.要点:
1.接頭辞を付けて、簡単な区分を表し、異なる空間の同じkeyカバーを防止する.
2.jspからredisまではredisTemplateをシーケンス化する必要がある.getStringSerializer().serialize(XXXXX)、このような中国語はredisの中で文字化けしません
3.redisデータを読み取るには、逆シーケンス化が必要で、中国語などが文字化されないことを保証することができる.getStringSerializer().deserialize(XXXXX)
4.検索操作を行う前に、keyが存在するかどうかを判断し、クエリーの効率を高めることが望ましい.
5.実はconnection.setは、一対のキー値ペアをredisに置くことです.connection.get(key)はkeyに基づいてvalue値を取り出す.接続get(key)はkey値に基づいて直接削除されます.
四:テスト
RedisMain.java
package com.test.controller.main;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.redis.service.RedisService;
import com.test.dao.Student;


/**
 * redis    
 * @author Sww
 *
 */
public class RedisMain {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//1.  RedisService    
		BeanFactory factory = new ClassPathXmlApplicationContext("classpath:conf/spring/spring-redis.xml");  
		RedisService test = (RedisService) factory.getBean("redisService"); 
		Student student = new Student();
		//2.    
		student.setId("302");
		student.setName("302value");
		test.save(student);
		//3.    
		String name = test.select("302").getName();
		System.out.println("id:302      :" + name);
		//4.    
		//test.delete("302");
        System.out.println("-----------    -------------");
	}
}

削除してなくなったのでdeleteの行を注釈しました.ご承知のように.
consoleログ:

redisの結果:
Spring+redis,spring-data-redis使用_第2张图片