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 }
阅读全文
0 0
- Redis连接池、事务和管道
- redis事务和管道浅析
- Java连接Redis数据库 事务、管道和分布式的调用方式
- redis中的事务、lua脚本和管道的使用场景
- redis中的事务、lua脚本和管道的使用场景
- redis中的事务、lua脚本和管道的使用场景
- redis中的事务、lua脚本和管道的使用场景
- redis中的事务、lua脚本和管道的使用场景
- Redis的事务、管道、分布式
- Redis 入门之 事务、连接和服务器
- 事务和连接池
- Java Jedis操作Redis示例(五)——Redis的事务、管道和脚本
- redis 管道和事物
- redis事务、管道及消息通知探究
- Redis学习笔记(八)事务 和 连接相关命令
- Redis学习笔记(八)事务 和 连接相关命令
- 事务和连接池总结
- 事务和连接池简介
- 2的最小整数对数
- Spring注解@RequestBody相关
- Linux 内核收发包流程
- 股市K线图指标算法的代码实现(一)
- AsyncTask优缺点根据源码分析
- Redis连接池、事务和管道
- springboot 热部署
- js手风琴
- Hibernate与 MyBatis的比较
- jQuery-file-Upload使用介绍
- 减少页面加载时间的方法
- Eclipse,MyEclipse配置tomcat步骤
- 用java生成Html
- redis