• Spring MVC 集成 Redis集群


    首先说一下我的包

      commons-pool2-2.0.jar

      jedis-2.7.2.jar

      spring-data-redis-1.4.2.RELEASE.jar

      tomcat-redis-session-manager1.2.jar

    属性文件  redis.properties

    属性文件
    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.xml

    <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 配置文件

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

      上代码

    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;
        }
    
    }

     //实体类

    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;
    }



    }

  • 相关阅读:
    mysql基础命令(一)
    vue组件之间的通信
    wepy的使用
    mockjs中的方法(三)
    每周散记 20181022
    api资源
    三七
    画中画 视频合成
    每周散记 20180910
    linux文件权限多一个+啥意思
  • 原文地址:https://www.cnblogs.com/shiyalong/p/5916749.html
Copyright © 2020-2023  润新知