系統中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條記錄左右(由於測試中打的時間戳是一致的),可能具體速度受到服務器的限制。

相關文章
相關標籤/搜索