系统中Jedis的应用,经过JedisClient来进行数据的交流

首先报一下我本身的应用前提,项目由SpringMVC框架,使用Maven结构java

第一步:引入jar包,如今最新的是2.6.2应该,之前的版本会有出入,非要对比版本请本身查文档。web

    <dependency>  
        <groupId>redis.clients</groupId>  
        <artifactId>jedis</artifactId>  
        <version>2.6.2</version>  
    </dependency>
    <dependency> 
        <groupId>org.apache.commons</groupId> 
	<artifactId>commons-pool2</artifactId> 
	<version>2.4.2</version> 
    </dependency>

第二步:引入配置xml配置文件,这里我命名为spring-redis.xmlredis

<?xml version="1.0" encoding="UTF-8"?>  
<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:context="http://www.springframework.org/schema/context"  
    xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"  
    xmlns:aop="http://www.springframework.org/schema/aop"  
    xsi:schemaLocation="  
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">  

    <context:property-placeholder location="classpath:resource.properties" />  
<bean id="redisClientTemplate" class="com.aneop.common.jedis.RedisClientTemplate"></bean>
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
       <property name="maxIdle" value="${jedis_max_idle}" />
        <property name="maxTotal" value="${jedis_max_active}" />  
        <property name="maxWaitMillis" value="${jedis_max_wait}" />  
        <property name="testOnBorrow" value="${jedis_test_on_borrow}" />  
    </bean>

    <bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool"  scope="singleton">
        <constructor-arg index="0" ref="jedisPoolConfig" />
        <constructor-arg index="1">
            <list>
                <bean class="redis.clients.jedis.JedisShardInfo">
                	<property name="password" value="${redis.pass}"></property>
                    <constructor-arg name="host" value="${redis.host}" />
                    <constructor-arg name="port" value="${redis.port}" />
                    <constructor-arg name="timeout" value="${redis.timeout}" />
                </bean>
            </list>
        </constructor-arg>
    </bean>
    <bean id="redisDataSource" class="com.aneop.common.jedis.RedisDataSourceImpl"></bean>
</beans>

这里要注意jedisPoolConfig属性值,其中的jedis容量的属性理应是这个maxActive,可是若是你用这个的话会报错,在启动时报jedisPoolConfig类中没有getMaxAcive的方法,这里要经过另外一个属性来搞  maxTotal,效果是同样的,当时在测试的时候很累的,若是不写的话,池的默认大小是8.同时你也看到了,我引入了配置文件resource.properties.贴出相应的参数值在下方,私密信息我用pig-man来代替spring

jedis_max_active=1024
jedis_max_idle=10
jedis_max_wait=10000
jedis_time_out=5000
jedis_test_on_borrow=true
redis.host=pig-man(eg:192.168.3.15)
redis.port=6379
redis.pass=pig-man(eg:123456)
redis.timeout=6000

第三步:向你的dispatch-servlet.xml也好,或是你在web.xml更改了你的启动配置xml文件添加这一句apache

<import resource="classpath:spring/spring-redis.xml" />

来吧咱们的spring-redis.xml导入。服务器

这样基本的配置就完成了,若是我没有记错的话,框架

第四部:咱们来完成jedis的servece和客户端的封装测试

创建接口
spa

public interface RedisDataSource {
	public ShardedJedis getRedisClient();
    public void returnResource(ShardedJedis shardedJedis);
    public void returnResource(ShardedJedis shardedJedis,boolean broken);
}

创建接口的implementscode

public class RedisDataSourceImpl implements RedisDataSource {

    private static final Logger log = LoggerFactory.getLogger(RedisDataSourceImpl.class);

    public ShardedJedis getRedisClient() {
        try {
        	ShardedJedisPool  shardedJedisPool = (ShardedJedisPool)ApplicationContextUtil.getBean("shardedJedisPool");
            ShardedJedis shardJedis = shardedJedisPool.getResource();
            return shardJedis;
        } catch (Exception e) {
            log.error("getRedisClent error", e);
        }
        return null;
    }

    public void returnResource(ShardedJedis shardedJedis) {
    	ShardedJedisPool  shardedJedisPool = (ShardedJedisPool)ApplicationContextUtil.getBean("shardedJedisPool");
        shardedJedisPool.returnResource(shardedJedis);
    }

    public void returnResource(ShardedJedis shardedJedis, boolean broken) {
    	ShardedJedisPool  shardedJedisPool = (ShardedJedisPool)ApplicationContextUtil.getBean("shardedJedisPool");
        if (broken) {
            shardedJedisPool.returnBrokenResource(shardedJedis);
        } else {
            shardedJedisPool.returnResource(shardedJedis);
        }
    }

}

再次高度封装jedis的客户端

public class RedisClientTemplate {

    private static final Logger log = LoggerFactory.getLogger(RedisClientTemplate.class);

//    private RedisDataSourceImpl     redisDataSource;
   
    public void disconnect() {
    	 RedisDataSource redisDataSource=(RedisDataSource)ApplicationContextUtil.getBean("redisDataSource");
        ShardedJedis shardedJedis = redisDataSource.getRedisClient();
        shardedJedis.disconnect();
    }

    /**
     * 设置单个值
     * 
     * @param key
     * @param value
     * @return
     */
    public String set(String key, String value) {
        String result = null;
        RedisDataSourceImpl redisDataSource=(RedisDataSourceImpl)ApplicationContextUtil.getBean("redisDataSource");
        ShardedJedis shardedJedis = redisDataSource.getRedisClient();
        if (shardedJedis == null) {
            return result;
        }
        boolean broken = false;
        try {
            result = shardedJedis.set(key, value);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            broken = true;
        } finally {
            redisDataSource.returnResource(shardedJedis, broken);
        }
        return result;
    }

    /**
     * 获取单个值
     * 
     * @param key
     * @return
     */
    public String get(String key) {
        String result = null;
        RedisDataSource redisDataSource=(RedisDataSource)ApplicationContextUtil.getBean("redisDataSource");
        ShardedJedis shardedJedis = redisDataSource.getRedisClient();
        if (shardedJedis == null) {
            return result;
        }

        boolean broken = false;
        try {
            result = shardedJedis.get(key);

        } catch (Exception e) {
            log.error(e.getMessage(), e);
            broken = true;
        } finally {
            redisDataSource.returnResource(shardedJedis, broken);
        }
        return result;
    }
    
    public String hmset(String key, Map<String, String> hash) {
        String result = null;
        RedisDataSourceImpl redisDataSource=(RedisDataSourceImpl)ApplicationContextUtil.getBean("redisDataSource");
        ShardedJedis shardedJedis = redisDataSource.getRedisClient();
        if (shardedJedis == null) {
            return result;
        }
        boolean broken = false;
        try {
            result = shardedJedis.hmset(key, hash);

        } catch (Exception e) {
            log.error(e.getMessage(), e);
            broken = true;
        } finally {
            redisDataSource.returnResource(shardedJedis, broken);
        }
        return result;
    }

    public List<String> hmget(String key, String... fields) {
        List<String> result = null;
        RedisDataSourceImpl redisDataSource=(RedisDataSourceImpl)ApplicationContextUtil.getBean("redisDataSource");
        ShardedJedis shardedJedis = redisDataSource.getRedisClient();
        if (shardedJedis == null) {
            return result;
        }
        boolean broken = false;
        try {
            result = shardedJedis.hmget(key, fields);

        } catch (Exception e) {
            log.error(e.getMessage(), e);
            broken = true;
        } finally {
            redisDataSource.returnResource(shardedJedis, broken);
        }
        return result;
    }
    
    public Map<String, String> hgetAll(String key) {
        Map<String, String> result = null;
        RedisDataSourceImpl redisDataSource=(RedisDataSourceImpl)ApplicationContextUtil.getBean("redisDataSource");
        ShardedJedis shardedJedis = redisDataSource.getRedisClient();
        if (shardedJedis == null) {
            return result;
        }
        boolean broken = false;
        try {
            result = shardedJedis.hgetAll(key);

        } catch (Exception e) {
            log.error(e.getMessage(), e);
            broken = true;
        } finally {
            redisDataSource.returnResource(shardedJedis, broken);
        }
        return result;
    }
    
    public Long hdel(String key, String field) {
        Long result = null;
        RedisDataSourceImpl redisDataSource=(RedisDataSourceImpl)ApplicationContextUtil.getBean("redisDataSource");
        ShardedJedis shardedJedis = redisDataSource.getRedisClient();
        if (shardedJedis == null) {
            return result;
        }
        boolean broken = false;
        try {
            result = shardedJedis.hdel(key, field);

        } catch (Exception e) {
            log.error(e.getMessage(), e);
            broken = true;
        } finally {
            redisDataSource.returnResource(shardedJedis, broken);
        }
        return result;
    }
}

这样个人一个拥有添加记录,删除记录,添加map,删除map,取map的基本技能的客户端了

第五步:jedis客户端测试

状况一:

    public static void main(String[] args) {
        ApplicationContext ac =  new ClassPathXmlApplicationContext("classpath:/spring/spring-redis.xml");
        RedisClientTemplate redisClient = (RedisClientTemplate)ac.getBean("redisClientTemplate");
        redisClient.set("a", "abc");
        System.out.println(redisClient.get("a"));
    }

这种链接方式被我直接用前段时间写的ApplicationContextUtil来改写了,因而就有了

状况二:

RedisClientTemplate redisClient = (RedisClientTemplate) ApplicationContextUtil.getBean("redisClientTemplate");
		
Map<String,String> map =new HashMap<String,String>();
map.put("a", "abc");
redisClient.hmset("abc_op",map);
Map<String,String> resultMap = new HashMap<String,String>();
resultMap = redisClient.hgetall("abc_op");
System.out.pringln(resultMap.size());
redisClient.disconnect();

在db0库里就能够找到你刚才命名为abc_op的空间,其中也能找到你插入的map.

这个方法比上次说起的Redisson要快不少,由于配置文件中有休眠一个有效时间,在有效时间内是不会再去链接断开redis的,从而省了很大时间,一毫秒在45条记录左右(由于测试中打的时间戳是一致的),可能具体速度受到服务器的限制。

相关文章
相关标签/搜索