Spring MVC 集成 Redis集羣

首先說一下個人包java

  commons-pool2-2.0.jarredis

  jedis-2.7.2.jarspring

  spring-data-redis-1.4.2.RELEASE.jarapache

  tomcat-redis-session-manager1.2.jartomcat

屬性文件  redis.propertiessession

屬性文件
address1=127.0.0.1:7002
address2=127.0.0.1:7001
address3=127.0.0.1:7000
address4=127.0.0.1:7003
address5=127.0.0.1:7004
address6=127.0.0.1:7005

 

而後是配置文件  redis-context.xmlapp

<beans     xmlns="http://www.springframework.org/schema/beans" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p" 
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
      http://www.springframework.org/schema/tx 
      http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-3.0.xsd
         ">
  
  <!-- 鏈接池的配置 -->
    <bean name="genericObjectPoolConfig" class="org.apache.commons.pool2.impl.GenericObjectPoolConfig">
        <property name="maxWaitMillis" value="-1" />
        <property name="maxTotal" value="1000" />
        <property name="minIdle" value="8" />
        <property name="maxIdle" value="100" />
    </bean>

    <bean id="jedisClusterFactory" class="com.hanwei.its.itoss.dao.redis.JedisClusterFactory">
        <property name="addressConfig">
            <value>classpath:conf/redis.properties</value>
            <value>/conf/redis.properties</value>
        </property>
        <property name="addressKeyPrefix" value="address" />  <!-- 屬性文件裏 key的前綴 --> 
        <property name="timeout" value="300000" />
        <property name="maxRedirections" value="6" />
        <property name="genericObjectPoolConfig" ref="genericObjectPoolConfig" />
    </bean>
    
</beans>    

  在 Spring MVC文件中引入redis 配置文件ide

    <!-- 加載redis 配置文件 -->
    <import resource="redis-context.xml"/>

  上代碼this

package com.hanwei.its.itoss.dao.redis;

import java.io.InputStream;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import java.util.regex.Pattern;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Repository;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;

@Repository(value="jedisClusterFactory")
public class JedisClusterFactory implements FactoryBean<JedisCluster>, InitializingBean{
    
    private Resource addressConfig;
    private String addressKeyPrefix ;
    private JedisCluster jedisCluster;
    private String timeout ;
    private String maxRedirections ;
    private GenericObjectPoolConfig genericObjectPoolConfig ;
    
    public GenericObjectPoolConfig getGenericObjectPoolConfig(){
        GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
        genericObjectPoolConfig.setMaxWaitMillis(1000);
        genericObjectPoolConfig.setMaxTotal(20000);
        genericObjectPoolConfig.setMaxIdle(20);
        genericObjectPoolConfig.setTestOnBorrow(true);
        return genericObjectPoolConfig;
    }
    
    private Pattern p = Pattern.compile("^.+[:]\\d{1,5}\\s*$");

    @Override
    public JedisCluster getObject() throws Exception {
        afterPropertiesSet();
        return jedisCluster;
    }

    @Override
    public Class<? extends JedisCluster> getObjectType() {
        return (this.jedisCluster != null ? this.jedisCluster.getClass() : JedisCluster.class);
    }

    @Override
    public boolean isSingleton() {
        return true;
    }



    private Set<HostAndPort> parseHostAndPort() throws Exception {
        try {
            Properties prop = new Properties();
            //讀取屬性文件  PS:個人項目有問題,Spring 注入不進去 不知道咋回事,因此我就用了這種方式  給redis 作了初始化
            InputStream in = getClass().getClassLoader().getResourceAsStream("/conf/redis.properties");  
            prop.load(in);
            Set<HostAndPort> haps = new HashSet<HostAndPort>();
            if(addressKeyPrefix == null){
                addressKeyPrefix ="address";
            }
            for (Object key : prop.keySet()) {
                
                if (!((String) key).startsWith(addressKeyPrefix)) {
                    continue;
                }

                String val = (String) prop.get(key);

                boolean isIpPort = p.matcher(val).matches();

                if (!isIpPort) {
                    throw new IllegalArgumentException("ip 或 port 不合法");
                }
                String[] ipAndPort = val.split(":");

                HostAndPort hap = new HostAndPort(ipAndPort[0], Integer.parseInt(ipAndPort[1]));
                haps.add(hap);
            }

            return haps;
        } catch (IllegalArgumentException ex) {
            throw ex;
        } catch (Exception ex) {
            throw new Exception("解析 jedis 配置文件失敗", ex);
        }
    }
    
    @Override
    public void afterPropertiesSet() throws Exception {
        Set<HostAndPort> haps = this.parseHostAndPort();
        if(genericObjectPoolConfig == null){
            genericObjectPoolConfig = getGenericObjectPoolConfig();
        }
        jedisCluster = new JedisCluster(haps,genericObjectPoolConfig);
        
    }
    public void setAddressConfig(Resource addressConfig) {
        this.addressConfig = addressConfig;
    }
    public void setTimeout(String timeout) {
        this.timeout = timeout;
    }
    public void setMaxRedirections(String maxRedirections) {
        this.maxRedirections = maxRedirections;
    }
    public void setAddressKeyPrefix(String addressKeyPrefix) {
        this.addressKeyPrefix = addressKeyPrefix;
    }
    public void setGenericObjectPoolConfig(GenericObjectPoolConfig genericObjectPoolConfig) {
        this.genericObjectPoolConfig = genericObjectPoolConfig;
    }

}

 //實體類spa

package com.hanwei.its.itoss.model.redis;

import org.szopen.core.model.BaseModel;

public class Member extends BaseModel{

	 /**
	   * 
	   */
	  private static final long serialVersionUID = -1959528436584592183L;
	  
	  
	  private String id;
	  private String nickname;
	  private Object val;
	  private int index;
	  public Member(){}
	  
	  public Member(String id, String nickname){
	    this.setId(id);
	    this.setNickname(nickname);
	  }
	  
	  public String getId() {
	    return id;
	  }
	  public void setId(String id) {
	    this.id = id;
	  }
	  public String getNickname() {
	    return nickname;
	  }
	  public void setNickname(String nickname) {
	    this.nickname = nickname;
	  }
	public int getIndex() {
		return index;
	}

	public void setIndex(int index) {
		this.index = index;
	}

	public Object getVal() {
		return val;
	}
	public void setVal(Object val) {
		this.val = val;
	}
	  
	  
}

  

剩下的就很無聊了

 在dao層注入上面這個 Factory  

須要注意的是 我這個 jedisClusterFactory  每次使用完畢都有執行close()方法  使用前都要GET  jedisClusterFactory.getObject(); 到新的對象

package com.hanwei.its.itoss.dao.redis.impl;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

 


import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;

import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.ShardedJedis;

import com.hanwei.its.itoss.dao.redis.JedisClusterFactory;
import com.hanwei.its.itoss.dao.redis.MemberDao;
import com.hanwei.its.itoss.model.redis.Member;
import com.itextpdf.text.pdf.PdfStructTreeController.returnType;

@Repository(value="memberDao")
@Component
public class MemberDaoImpl implements MemberDao{

@Autowired
@Qualifier("jedisClusterFactory")
private JedisClusterFactory jedisClusterFactory;

public void CloseJedis(ShardedJedis jedis){
if(jedis != null){
jedis.close();
}
}
/**
* 添加對象
* @throws Exception
*/
@Override
public boolean add(final Member member) {
JedisCluster JedisCluster ;
try {
JedisCluster = jedisClusterFactory.getObject();
JedisCluster.sadd(member.getId(), member.getVal().toString());
JedisCluster.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}



/**
* 刪除對象 ,依賴key
* @throws Exception
*/
@Override
public void delete(String key) {
try {
JedisCluster JedisCluster = jedisClusterFactory.getObject();
JedisCluster.del(key);
JedisCluster.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

/**
* 修改對象
* @throws Exception
*/
@Override
public boolean update(final Member member) {
try {
JedisCluster JedisCluster = jedisClusterFactory.getObject();
JedisCluster.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}

/**
* 根據key獲取對象
*/
@Override
public Member get(final String keyId) {
Member member;
try {
JedisCluster JedisCluster = jedisClusterFactory.getObject();
Set<String> smembers = JedisCluster.smembers(keyId);
member = new Member();
member.setId(keyId);
member.setVal(smembers);
JedisCluster.close();
return member;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public void sadd(Member member) {

try { JedisCluster JedisCluster = jedisClusterFactory.getObject(); JedisCluster.sadd(member.getId(), member.getVal().toString()); JedisCluster.close(); } catch (Exception e) { e.printStackTrace(); } } @Override public void set(Member member) { try { JedisCluster JedisCluster = jedisClusterFactory.getObject(); JedisCluster.set(member.getId(), member.getVal().toString()); JedisCluster.close(); } catch (Exception e) { e.printStackTrace(); } } @Override public Member getForSet(String key) { Member member; try { JedisCluster JedisCluster = jedisClusterFactory.getObject(); String val = JedisCluster.get(key); member = new Member(); member.setId(key); member.setVal(val); JedisCluster.close(); return member; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取全部List */ @Override public List<Member> getListAll(String key){ List<Member> memberList = new ArrayList<Member>(); try { JedisCluster JedisCluster = jedisClusterFactory.getObject(); List<String> val = JedisCluster.lrange(key, 0, -1); for (String string : val) { Member member = new Member(); member.setVal(string); member.setId(key); memberList.add(member); } JedisCluster.close(); return memberList; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取長度 */ @Override public int getLength(String key) { try { JedisCluster JedisCluster = jedisClusterFactory.getObject(); String val = JedisCluster.get(key); JedisCluster.close(); return Integer.parseInt(val); } catch (Exception e) { e.printStackTrace(); } return 0; } /** * 獲取列表指定下標的值 */ @Override public Member getIndex(int index,String key) { try { JedisCluster JedisCluster = jedisClusterFactory.getObject(); String val = JedisCluster.lindex(key, index); Member member = new Member(); member.setVal(val); member.setId(key); member.setIndex(index); JedisCluster.close(); return member; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 修改列表中單個值 */ @Override public void updateIndex(int index, Member member) { String key = member.getId(); Object val2 = member.getVal(); try { JedisCluster JedisCluster = jedisClusterFactory.getObject(); String val = JedisCluster.lset(key, index, val2.toString()); JedisCluster.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 刪除列表指定下標的值 */ @Override public Long removeIndex(int index, Member member) { String key = member.getId(); Object val2 = member.getVal(); try { JedisCluster JedisCluster = jedisClusterFactory.getObject(); Long val = JedisCluster.lrem(key, index, val2.toString()); JedisCluster.close(); return val; } catch (Exception e) { e.printStackTrace(); } return (long) 0; } /** * 新增 */ @Override public Long appendList(Member member) { String key = member.getId(); Object val2 = member.getVal(); try { JedisCluster JedisCluster = jedisClusterFactory.getObject(); Long val = JedisCluster.lpush(key, val2.toString()); JedisCluster.close(); return val; } catch (Exception e) { e.printStackTrace(); } return (long) 0; } }

相關文章
相關標籤/搜索