一、Redis的发布订阅

1、概述

进程间的一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

2、常用命令

Related commands

PSUBSCRIBE
PUBLISH
PUBSUB
PUNSUBSCRIBE
SUBSCRIBE
UNSUBSCRIBE

3、示例

先订阅后发布后才能收到消息,
1 可以一次性订阅多个,SUBSCRIBE c1 c2 c3

2 消息发布,PUBLISH c2 hello-redis
===========================================================================================================**
3 订阅多个,通配符, PSUBSCRIBE new
4 收取消息, PUBLISH new1 redis2015

二、Redis的Java客户端Jedis

1、安装JDK(linux中)

tar -zxvf jdk-7u67-linux-i586.tar.gz
 vim /etc/profile
 重启一次Centos

然后安装 eclipse

2、Jedis所需要的jar包

Commons-pool-1.6.jar 
Jedis-2.1.0.jar

3、Jedis 的常用操作和命令行的基本一致

4、使用 JedisPool(类似数据库连接池)

① 获取Jedis实例需要从JedisPool中获取

② 用完Jedis实例需要返还给JedisPool

③ 如果Jedis在使用过程中出错,则也需要还给JedisPool

案例代码

JedisPoolUtil.java

package com.atguigu.redis.test;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class JedisPoolUtil {

  private static volatile JedisPool jedisPool = null;

  private JedisPoolUtil() {}

  public static JedisPool getJedisPoolInstance()
  {
     if(null == jedisPool)
     {
       synchronized (JedisPoolUtil.class)
       {
          if(null == jedisPool)
          {
            JedisPoolConfig poolConfig = new JedisPoolConfig();
            poolConfig.setMaxActive(1000);
            poolConfig.setMaxIdle(32);
            poolConfig.setMaxWait(100*1000);
            poolConfig.setTestOnBorrow(true);

            jedisPool = new JedisPool(poolConfig,"127.0.0.1");
          }
       }
     }
     return jedisPool;
  }

  public static void release(JedisPool jedisPool,Jedis jedis)
  {
     if(null != jedis)
     {
       jedisPool.returnResourceObject(jedis);
     }
  }
}

测试类

package com.atguigu.redis.test;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

public class lxy {
  public static void main(String[] args) {
     JedisPool jedisPool = JedisPoolUtil.getJedisPoolInstance();
     Jedis jedis = null;

     try 
     {
       jedis = jedisPool.getResource();
       jedis.set("k1","v1");

     } catch (Exception e) {
       e.printStackTrace();
     }finally{
       JedisPoolUtil.release(jedisPool, jedis);
     }
  }
}

5、配置总结

JedisPool的配置参数大部分是由JedisPoolConfig的对应项来赋值的。

maxActive:控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted。
maxIdle:控制一个pool最多有多少个状态为idle(空闲)的jedis实例;
whenExhaustedAction:表示当pool中的jedis实例都被allocated完时,pool要采取的操作;默认有三种。
   WHEN_EXHAUSTED_FAIL  --> 表示无jedis实例时,直接抛出NoSuchElementException;
   WHEN_EXHAUSTED_BLOCK --> 则表示阻塞住,或者达到maxWait时抛出JedisConnectionException;
   WHEN_EXHAUSTED_GROW --> 则表示新建一个jedis实例,也就说设置的maxActive无用;
maxWait:表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛JedisConnectionException;
testOnBorrow:在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;

testOnReturn:在return给pool时,是否提前进行validate操作;

testWhileIdle:如果为true,表示有一个idle object evitor线程对idle object进行扫描,如果validate失败,此object会被从pool中drop掉;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;

timeBetweenEvictionRunsMillis:表示idle object evitor两次扫描之间要sleep的毫秒数;

numTestsPerEvictionRun:表示idle object evitor每次扫描的最多的对象数;

minEvictableIdleTimeMillis:表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;

softMinEvictableIdleTimeMillis:在minEvictableIdleTimeMillis基础上,加入了至少minIdle个对象已经在pool里面了。如果为-1,evicted不会根据idle time驱逐任何对象。如果minEvictableIdleTimeMillis>0,则此项设置无意义,且只有在timeBetweenEvictionRunsMillis大于0时才有意义;

lifo:borrowObject返回对象时,是采用DEFAULT_LIFO(last in first out,即类似cache的最频繁使用队列),如果为False,则表示FIFO队列;

==================================================================================================================
其中JedisPoolConfig对一些参数的默认设置如下:
testWhileIdle=true
minEvictableIdleTimeMills=60000
timeBetweenEvictionRunsMillis=30000
numTestsPerEvictionRun=-1