天天看點

Redis--Jedis的使用

1. jedis的測試代碼

public class RedisClient {
    @Test
    //使用Jedis連接配接redis伺服器
    public void jedisClient(){
        Jedis jedis = new Jedis("192.168.83.128",);
        jedis.set("s3", "333");
        String result = jedis.get("s3");
        System.out.println(result);
        jedis.close();
    }
    @Test
    //使用JedisPool連接配接redis伺服器
    public void jedisPool(){
        JedisPool pool = new JedisPool("192.168.83.128",);
        Jedis jedis = pool.getResource();
        String result = jedis.get("s1");
        System.out.println(result);
        jedis.close();
        pool.close();
    }
    @Test
    public void jedisPool_Spring(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        JedisPool jedisPool = context.getBean("jedisPool", JedisPool.class);
        Jedis jedis = jedisPool.getResource();
        jedis.set("s1", "111");
        String result = jedis.get("s1");
        System.out.println(result);
        jedis.close();
        jedisPool.close();
    }
    @Test
    public void jedisCluster(){
        Set<HostAndPort> nodes = new HashSet();
        nodes.add(new HostAndPort("192.168.83.128",));
        nodes.add(new HostAndPort("192.168.83.128",));
        nodes.add(new HostAndPort("192.168.83.128",));
        nodes.add(new HostAndPort("192.168.83.128",));
        nodes.add(new HostAndPort("192.168.83.128",));
        nodes.add(new HostAndPort("192.168.83.128",));
        JedisCluster cluster = new JedisCluster(nodes);
        cluster.set("ss","123");
        String result = cluster.get("ss");
        System.out.println(result);
        cluster.close();
    }
}
           

2. Spring整合Jedis

2.1 整合JedisPool

<!-- 連接配接池配置 -->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <!-- 最大連接配接數 -->
        <property name="maxTotal" value="30" />
        <!-- 最大空閑連接配接數 -->
        <property name="maxIdle" value="10" />
        <!-- 每次釋放連接配接的最大數目 -->
        <property name="numTestsPerEvictionRun" value="1024" />
        <!-- 釋放連接配接的掃描間隔(毫秒) -->
        <property name="timeBetweenEvictionRunsMillis" value="30000" />
        <!-- 連接配接最小空閑時間 -->
        <property name="minEvictableIdleTimeMillis" value="1800000" />
        <!-- 連接配接空閑多久後釋放, 當空閑時間>該值 且 空閑連接配接>最大空閑連接配接數 時直接釋放 -->
        <property name="softMinEvictableIdleTimeMillis" value="10000" />
        <!-- 擷取連接配接時的最大等待毫秒數,小于零:阻塞不确定的時間,預設-1 -->
        <property name="maxWaitMillis" value="1500" />
        <!-- 在擷取連接配接的時候檢查有效性, 預設false -->
        <property name="testOnBorrow" value="false" />
        <!-- 在空閑時檢查有效性, 預設false -->
        <property name="testWhileIdle" value="true" />
        <!-- 連接配接耗盡時是否阻塞, false報異常,ture阻塞直到逾時, 預設true -->
        <property name="blockWhenExhausted" value="false" />
    </bean>

    <!-- redis單機 通過連接配接池 -->
    <bean id="jedisPool" class="redis.clients.jedis.JedisPool"
        destroy-method="close">
        <constructor-arg name="poolConfig" ref="jedisPoolConfig" />
        <constructor-arg name="host" value="192.168.242.130" />
        <constructor-arg name="port" value="6379" />
    </bean>
           

2.2 整合JedisCluster

<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
    <constructor-arg index="0">
        <set>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg index="0" value="192.168.101.3"></constructor-arg>
                <constructor-arg index="1" value="7001"></constructor-arg>
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg index="0" value="192.168.101.3"></constructor-arg>
                <constructor-arg index="1" value="7002"></constructor-arg>
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg index="0" value="192.168.101.3"></constructor-arg>
                <constructor-arg index="1" value="7003"></constructor-arg>
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg index="0" value="192.168.101.3"></constructor-arg>
                <constructor-arg index="1" value="7004"></constructor-arg>
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg index="0" value="192.168.101.3"></constructor-arg>
                <constructor-arg index="1" value="7005"></constructor-arg>
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg index="0" value="192.168.101.3"></constructor-arg>
                <constructor-arg index="1" value="7006"></constructor-arg>
            </bean>
        </set>
    </constructor-arg>
    <constructor-arg index="1" ref="jedisPoolConfig"></constructor-arg>
</bean>
           

3技巧

step1.将Jedis中通用的方法抽取到一個接口中

public interface JedisClient {
      public String set(String key, String value);
      public String get(String key);
      public Long hset(String key, String item, String value);
      public String hget(String key, String item);
      public Long incr(String key);
      public Long decr(String key);
      public Long expire(String key, int second);
      public Long ttl(String key);
      public Long hdel(String key,String item);
}
           

step2.使用JedisPool去實作這個接口

public class JedisClientSingle implements JedisClient{
    @Autowired
    private JedisPool jedisPool;
    @Override
    public String set(String key, String value) {
        Jedis jedis = jedisPool.getResource();
        String string = jedis.set(key, value);
        jedis.close();
        return string;
    }

    public String get(String key) {
        Jedis jedis = jedisPool.getResource();
        String string = jedis.get(key);
        jedis.close();
        return string;
    }

    @Override
    public Long hset(String key, String item, String value) {
        Jedis jedis = jedisPool.getResource();
        Long hset = jedis.hset(key, item, value);
        jedis.close();
        return hset;
    }

    @Override
    public String hget(String key, String item) {
        Jedis jedis = jedisPool.getResource();
        String hget = jedis.hget(key, item);
        jedis.close();
        return hget;
    }
    public Long hdel(String key,String item){
        Jedis jedis = jedisPool.getResource();
        Long hdel = jedis.hdel(key, item);
        jedis.close();
        return hdel;
    }
    @Override
    public Long incr(String key) {
        Jedis jedis = jedisPool.getResource();
        Long incr = jedis.incr(key);
        jedis.close();
        return incr;
    }

    @Override
    public Long decr(String key) {
        Jedis jedis = jedisPool.getResource();
        Long decr = jedis.decr(key);
        jedis.close();
        return decr;
    }

    @Override
    public Long expire(String key, int second) {
        Jedis jedis = jedisPool.getResource();
        Long expire = jedis.expire(key, second);
        jedis.close();
        return expire;
    }

    @Override
    public Long ttl(String key) {
        Jedis jedis = jedisPool.getResource();
        Long ttl = jedis.ttl(key);
        jedis.close();
        return ttl;
    }

}
           

step3.用JedisCluster去實作這個接口

public class JedisClientCluster implements JedisClient {
    @Autowired
    private JedisCluster jedisCluster;

    @Override
    public String set(String key, String value) {
        String set = jedisCluster.set(key, value);
        return set;
    }

    @Override
    public String get(String key) {
        String string = jedisCluster.get(key);
        return string;
    }

    @Override
    public Long hset(String key, String item, String value) {
        Long hset = jedisCluster.hset(key, item, value);
        return hset;
    }

    @Override
    public String hget(String key, String item) {
        String hget = jedisCluster.hget(key, item);
        return hget;
    }

    @Override
    public Long hdel(String key, String item) {
        Long hdel = jedisCluster.hdel(key, item);
        return hdel;
    }

    @Override
    public Long incr(String key) {
        Long incr = jedisCluster.incr(key);
        return incr;
    }

    @Override
    public Long decr(String key) {
        Long decr = jedisCluster.decr(key);
        return decr;
    }

    @Override
    public Long expire(String key, int second) {
        Long expire = jedisCluster.expire(key, second);
        return expire;
    }

    @Override
    public Long ttl(String key) {
        Long ttl = jedisCluster.ttl(key);
        return ttl;
    }

}
           

<bean id="jedisClient" class="com.taotao.order.dao.JedisClientSingle"></bean>

<bean id="jedisClient" class="com.taotao.order.dao.JedisClientCluster"></bean> </beans>

使用時,兩個Bean二選一即可。

上述過程可以展現了JedisClient 接口多态性。即無需改變JedisClientAPI的使用情況,可通過配置Bean的方式随意切換單個redis和redis叢集的使用。

繼續閱讀