- 浏览: 624356 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (819)
- java开发 (110)
- 数据库 (56)
- javascript (30)
- 生活、哲理 (17)
- jquery (36)
- 杂谈 (15)
- linux (62)
- spring (52)
- kafka (11)
- http协议 (22)
- 架构 (18)
- ZooKeeper (18)
- eclipse (13)
- ngork (2)
- dubbo框架 (6)
- Mybatis (9)
- 缓存 (28)
- maven (20)
- MongoDB (3)
- 设计模式 (3)
- shiro (10)
- taokeeper (1)
- 锁和多线程 (3)
- Tomcat7集群 (12)
- Nginx (34)
- nodejs (1)
- MDC (1)
- Netty (7)
- solr (15)
- JSON (8)
- rabbitmq (32)
- disconf (7)
- PowerDesigne (0)
- Spring Boot (31)
- 日志系统 (6)
- erlang (2)
- Swagger (3)
- 测试工具 (3)
- docker (17)
- ELK (2)
- TCC分布式事务 (2)
- marathon (12)
- phpMyAdmin (12)
- git (3)
- Atomix (1)
- Calico (1)
- Lua (7)
- 泛解析 (2)
- OpenResty (2)
- spring mvc (19)
- 前端 (3)
- spring cloud (15)
- Netflix (1)
- zipkin (3)
- JVM 内存模型 (5)
- websocket (1)
- Eureka (4)
- apollo (2)
- idea (2)
- go (1)
- 业务 (0)
- idea开发工具 (1)
最新评论
-
sichunli_030:
对于频繁调用的话,建议采用连接池机制
配置TOMCAT及httpClient的keepalive以高效利用长连接 -
11想念99不见:
你好,我看不太懂。假如我的项目中会频繁调用rest接口,是要用 ...
配置TOMCAT及httpClient的keepalive以高效利用长连接
所需jar:jedis-2.1.0.jar和commons-pool-1.5.4.jar
Jedis操作步骤如下:
1->获取Jedis实例需要从JedisPool中获取;
2->用完Jedis实例需要返还给JedisPool;
3->如果Jedis在使用过程中出错,则也需要还给JedisPool;
代码如下:
代码说明:
a、获取jedis实例时,实际上可能有两类错误。
一类是pool.getReource(),得不到可用的jedis实例;
另一类是jedis.set/get时出错也会抛出异常;
为了实现区分,所以根据instance是否为null来实现,如果为空就证明instance根本就没初始化,也就不用return给pool;如果instance不为null,则证明是需要返还给pool的;
b、在instance出错时,必须调用returnBrokenResource返还给pool,否则下次通过getResource得到的instance的缓冲区可能还存在数据,出现问题!
-------------------------------------------------
JedisPool的配置参数很大程度上依赖于实际应用需求、软硬件能力。以前没用过commons-pool,所以这次花了一整天专门看这些参数的含义。。。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实例时,是否提前进行alidate操作;如果为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
参考:http://www.cnblogs.com/linjiqin/archive/2013/06/14/3135248.html
http://blog.csdn.net/luyee2010/article/details/17580381
http://caiguangguang.blog.51cto.com/1652935/1635752/
Jedis操作步骤如下:
1->获取Jedis实例需要从JedisPool中获取;
2->用完Jedis实例需要返还给JedisPool;
3->如果Jedis在使用过程中出错,则也需要还给JedisPool;
代码如下:
package com.ljq.utils; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; /** * Redis操作接口 * * @author 林计钦 * @version 1.0 2013-6-14 上午08:54:14 */ public class RedisAPI { private static JedisPool pool = null; /** * 构建redis连接池 * * @param ip * @param port * @return JedisPool */ public static JedisPool getPool() { if (pool == null) { JedisPoolConfig config = new JedisPoolConfig(); //控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取; //如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。 config.setMaxActive(500); //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。 config.setMaxIdle(5); //表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException; config.setMaxWait(1000 * 100); //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的; config.setTestOnBorrow(true); pool = new JedisPool(config, "192.168.2.191", 8888); } return pool; } /** * 返还到连接池 * * @param pool * @param redis */ public static void returnResource(JedisPool pool, Jedis redis) { if (redis != null) { pool.returnResource(redis); } } /** * 获取数据 * * @param key * @return */ public static String get(String key){ String value = null; JedisPool pool = null; Jedis jedis = null; try { pool = getPool(); jedis = pool.getResource(); value = jedis.get(key); } catch (Exception e) { //释放redis对象 pool.returnBrokenResource(jedis); e.printStackTrace(); } finally { //返还到连接池 returnResource(pool, jedis); } return value; } }
代码说明:
a、获取jedis实例时,实际上可能有两类错误。
一类是pool.getReource(),得不到可用的jedis实例;
另一类是jedis.set/get时出错也会抛出异常;
为了实现区分,所以根据instance是否为null来实现,如果为空就证明instance根本就没初始化,也就不用return给pool;如果instance不为null,则证明是需要返还给pool的;
b、在instance出错时,必须调用returnBrokenResource返还给pool,否则下次通过getResource得到的instance的缓冲区可能还存在数据,出现问题!
-------------------------------------------------
JedisPool的配置参数很大程度上依赖于实际应用需求、软硬件能力。以前没用过commons-pool,所以这次花了一整天专门看这些参数的含义。。。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实例时,是否提前进行alidate操作;如果为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
参考:http://www.cnblogs.com/linjiqin/archive/2013/06/14/3135248.html
http://blog.csdn.net/luyee2010/article/details/17580381
http://caiguangguang.blog.51cto.com/1652935/1635752/
发表评论
-
缓存穿透、缓存击穿、缓存雪崩区别和解决方案
2022-03-28 00:07 188缓存穿透、缓存击穿、缓存雪崩区别和解决方案 缓存穿透,缓存 ... -
SpringBoot系列教程之Redis集群环境配置
2022-02-28 00:37 250SpringBoot系列教程之Redis集群环境配置 Co ... -
Redis 分布式锁的实现
2021-05-23 18:53 268Redisson实现分布式锁(1)---原理 https:// ... -
Redis面试题
2021-05-23 16:30 298redis布隆过滤器的使用 布隆过滤器可以看成是一个不是很准确 ... -
Redis性能问题排查解决手册
2019-08-07 10:31 399Redis性能问题排查解决手册(七) https://www. ... -
linux下安装redis及其中遇到的问题的解决方法
2017-11-29 16:46 527https://www.cnblogs.com/wyy123/ ... -
Redis scan命令的一次坑
2017-11-16 12:07 1103http://www.jianshu.com/p/d9f0a5 ... -
redis命中率计算
2017-09-29 21:29 1628redis提供了INFO这个命令,能够随时监控服务器的状态,只 ... -
redis分片
2017-07-10 18:41 479http://www.cnblogs.com/liucongl ... -
Redis_conf配置文件说明
2017-05-22 13:58 465Redis_conf配置文件说明 http://blog.cs ... -
redis 数据持久化
2017-05-22 10:16 6391、快照(snapshots) 缺省情况情况下,Redi ... -
overcommit_memory
2017-05-17 09:29 563/etc/sysctl.conf ... -
批量删除Redis数据库中的Key
2017-05-16 10:58 459Redis 中有删除单个 Key 的指令 DEL,但好像没有批 ... -
redis配置认证密码
2017-04-14 19:34 497http://blog.csdn.net/zyz5119197 ... -
redis-cluster研究和使用
2016-12-16 10:09 435参考:http://hot66hot.iteye.com/bl ... -
Redis 3.2.1集群搭建
2016-10-27 10:25 428http://www.cnblogs.com/yuanerme ... -
redis从2.1.0升级到2.6.0报错:java.lang.NoSuchMethodError
2016-10-14 13:05 1653项目中使用了jedis-2.1.0.jar,现在升级为jedi ... -
redis-cli 如何重写服务器的主机名和端口
2016-08-17 16:08 1193windows 环境下,启动多个redis服务,使用不同的端口 ... -
《Redis官方文档》用Redis构建分布式锁
2016-08-08 13:37 682redis深度讲解 http://edu.csdn.net/c ... -
Jedis returnResource使用注意事项
2016-08-07 12:50 1675http://my.oschina.net/zhuguowei ...
相关推荐
在这个案例中,commons-pool2-2.4.2.jar是Jedis连接池的依赖,它为Jedis提供了一个连接管理框架,确保高效地管理和重用Jedis实例。 4. Jedis连接池配置: 使用Jedis时,可以通过连接池来管理连接,例如使用`...
Jedis连接池的使用 Jedis连接池是Redis客户端Jedis的连接池实现,用于管理Redis连接的创建、释放和复用。通过使用Jedis连接池,可以提高Redis的访问性能和可靠性。在本文中,我们将详细讨论Jedis连接池的使用,包括...
在Java中,我们可以使用Apache Commons Pool2库来实现Jedis连接池。以下是一个简单的Jedis连接池配置示例: ```java import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public ...
这样就完成了基于ShardedJedisPool的Jedis连接池配置。 总结一下,ShardedJedisPool通过分片技术提高了Redis操作的效率,而连接池则有效地管理了与Redis服务器的连接,避免了频繁创建和销毁连接的开销。正确配置和...
三、Jedis连接池 1. **连接池概念**:连接池是一种对象池设计模式,主要用于管理数据库连接。它预先创建一定数量的连接,当需要时可以从池中获取,使用完毕后归还到池中,而不是直接关闭连接。 2. **JedisPool**:...
Jedis连接池使用`common-pool2`来管理Redis连接,通过池化的机制,可以在多线程环境中有效地复用连接,避免了每次请求时创建新的网络连接,从而提升了整体性能。 在压缩包中包含的`使用说明.txt`可能是关于如何配置...
创建jedis池配置实例,redis各种crud方法,包括使用主从同步,读写分离。工具类中包括存放hash表键值对,键值对以map的方式储存,删除键值对,永久存放键值对,设置过期时间,需要的直接去gitHab上看...
通过以上步骤,我们成功地在Spring MVC项目中整合了Redis,并使用连接池优化了性能。这种整合方式不仅提高了代码的可读性和可维护性,也充分利用了Redis的高效性能,为应用程序带来了更好的用户体验。在实际开发中,...
Redis是世界上最受欢迎的内存数据存储系统之一,常用于缓存和数据库应用...在实际应用中,还应考虑连接池的使用,以优化资源管理和提高性能。同时,确保对Redis的配置文件有深入了解,以便根据业务需求进行定制化设置。
3. 创建连接池:使用 `new JedisPool(poolConfig, pro.getProperty("redis.host"), pro.getProperty("redis.port"))` 创建一个新的 Jedis 连接池。 结论 Jedis 库提供了便捷的方法来操作 Redis 数据库。通过使用 ...
本文将详细介绍Jedis连接池的概念、配置以及使用方法。 一、Jedis连接池概念 Jedis连接池,即`JedisPool`,是基于Apache Commons Pool2实现的。它允许我们预先创建一定数量的Jedis实例,并将它们存储在一个池中。...
为了避免这些问题,可以使用 JedisPool,JedisPool 是一个线程安全的网络连接池。可以用 JedisPool 创建一些可靠 Jedis 实例,可以从池中拿到 Jedis 的实例。 Jedis 的基本操作 Jedis 提供了多种基本操作,包括...
连接池允许重复使用已经打开的连接,避免了频繁创建和销毁连接的开销。Commons Pool 2.6.0版本包含了一些性能改进和错误修复,确保了稳定性和可靠性。 **使用Jedis连接Redis** 1. **配置Jedis**: 首先,在项目中...
4. **连接池**:为了提高性能和资源管理,建议使用Jedis连接池。 ```java JedisPoolConfig config = new JedisPoolConfig(); JedisPool pool = new JedisPool(config, "localhost"); Jedis jedis = pool.get...
然后,他们可以按照Jedis的API文档来配置和使用Jedis连接池,例如设置最大连接数、超时时间等参数,以及执行Redis操作。 以下是一个简单的Jedis连接池配置示例: ```java import redis.clients.jedis.JedisPool; ...
对于许多应用程序,最好使用连接池。实例化 Jedis 连接池: JedisPool pool = new JedisPool("localhost", 6379); 以下是如何在try-with-resources块中运行单个SET命令: try (Jedis jedis = pool.getResource()) {...
6. **使用连接池**:为了优化性能,通常会使用`commons-pool-1.6.jar`来创建一个Jedis连接池。首先,你需要配置连接池的参数,然后创建并初始化`JedisPool`对象。例如: ```java JedisPoolConfig poolConfig = new...
使用Jedis连接池有以下几个关键点: 1. **配置连接池**:首先,需要配置JedisPoolConfig,设置最大连接数、最小连接数、超时时间等参数,以适应应用的需求和服务器的负载。 2. **初始化连接池**:通过`new Jedis...