Redis连接池、事务和管道

来源:互联网 发布:windows消息 关闭窗口 编辑:程序博客网 时间:2024/06/08 00:54

Redis连接池、事务和管道

一、Redis连接池

public class PoolDemo {protected static Logger logger = Logger.getLogger(PoolDemo.class);        //Redis服务器IP      private static String ip = "10.108.169.6";        //Redis的端口号      private static int PORT = 6379;        //访问密码      private static String AUTH = "www1234";      //可用连接实例的最大数目,默认值为8;      //如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。      private static int MAX_ACTIVE = 8;        //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。      private static int MAX_IDLE = 8;        //等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;      private static int MAX_WAIT = 3000;       //超时时间      private static int TIMEOUT = 10000;        //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;      private static boolean TEST_ON_BORROW = false;       private static JedisPool jedisPool = null;        /**      * 初始化Redis连接池      */      private static void initialPool() {          try {              JedisPoolConfig config = new JedisPoolConfig();              config.setMaxTotal(MAX_ACTIVE);              config.setMaxIdle(MAX_IDLE);              config.setMaxWaitMillis(MAX_WAIT);              config.setTestOnBorrow(TEST_ON_BORROW);              jedisPool = new JedisPool(config, ip, PORT, TIMEOUT);          } catch (Exception e) {              logger.error("First create JedisPool error : " + e);          }    }        /**      * 在多线程环境同步初始化      */      private static synchronized void poolInit() {          if (jedisPool == null) {                initialPool();          }      }         /**      * 同步获取Jedis实例      * @return Jedis      */      public synchronized static Jedis getJedis() {            if (jedisPool == null) {                poolInit();          }          Jedis jedis = null;          try {                if (jedisPool != null) {                    jedis = jedisPool.getResource();               }          } catch (Exception e) {                logger.error("Get jedis error : "+e);          }finally{              returnResource(jedis);          }          return jedis;      }          /**      * 释放jedis资源      *      * @param jedis      */      @SuppressWarnings("deprecation")public static void returnResource(final Jedis jedis) {          if (jedis != null && jedisPool != null) {              jedisPool.returnResource(jedis) ;        }      }  public static void main(String[] args) {PropertyConfigurator.configure("config/log4j.properties");testPipeline();}}

二、Redis 事务

Redis 事务可以一次执行多个命令,并且带有以下两个重要的保证:

1、事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

2、事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

//Java实现redis事务    public static void testTransaction(){    Jedis redis = getJedis();    redis.flushDB();     Transaction transaction = redis.multi();       transaction.lpush("key", "11");       transaction.lpush("key", "22");         transaction.lpush("key", "33");       List<Object> list = transaction.exec();      System.out.println(list);     System.out.println(redis.lrange("key",0,10));      }
三、Redis 管道技术

Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。这意味着通常情况下一个请求会遵循以下步骤:

1、客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。

2、服务端处理命令,并将结果返回给客户端。

Redis 管道技术:Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应

public static void testPipeline() {        Jedis jedis = getJedis();         jedis.flushDB();        //jedis.auth("123");          //不使用管道的测试          long start = System.currentTimeMillis();          for(int i=0; i<10000; i++) {              jedis.lpush("key", ""+i);          }          long end = System.currentTimeMillis();          System.out.println(end-start);          jedis.flushAll();          //使用管道的测试          long start2 = System.currentTimeMillis();          Pipeline pipeline = jedis.pipelined();          for(int i=0; i<10000; i++) {              pipeline.lpush("key", ""+i);          }          List<Object> list = pipeline.syncAndReturnAll();          long end2 = System.currentTimeMillis();          System.out.println(end2-start2);          jedis.flushAll();          jedis.disconnect();         //运行结果:9930  80    }