jedispool 连 redis
java端在使用jedispool 连接redis的时候,在高并发的时候经常卡死,或报连接异常,JedisConnectionException,或者getResource 异常等各种问题
在使用jedispool 的时候一定要注意两点
1、 在获取 jedisPool和jedis的时候加上线程同步,保证不要创建过多的jedispool 和 jedis
2、 用完Jedis实例后需要返还给JedisPool
整理了一下redis工具类,通过大量测试和高并发测试的。
package
com.util;
import
org.apache.log4j.Logger;
import
redis.clients.jedis.Jedis;
import
redis.clients.jedis.JedisPool;
import
redis.clients.jedis.JedisPoolConfig;
/**
* Redis 工具类
* @author think
*/
public
class
RedisUtil {
protected
static
Logger logger = Logger.getLogger(RedisUtil.
class
);
//Redis服务器IP
private
static
String ADDR_ARRAY = FileUtil.getPropertyValue(
"/properties/redis.properties"
,
"server"
);
//Redis的端口号
private
static
int
PORT = FileUtil.getPropertyValueInt(
"/properties/redis.properties"
,
"port"
);
//访问密码
// private static String AUTH = FileUtil.getPropertyValue("/properties/redis.properties", "auth");
//可用连接实例的最大数目,默认值为8;
//如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
private
static
int
MAX_ACTIVE = FileUtil.getPropertyValueInt(
"/properties/redis.properties"
,
"max_active"
);;
//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
private
static
int
MAX_IDLE = FileUtil.getPropertyValueInt(
"/properties/redis.properties"
,
"max_idle"
);;
//等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;
private
static
int
MAX_WAIT = FileUtil.getPropertyValueInt(
"/properties/redis.properties"
,
"max_wait"
);;
//超时时间
private
static
int
TIMEOUT = FileUtil.getPropertyValueInt(
"/properties/redis.properties"
,
"timeout"
);;
//在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
private
static
boolean
TEST_ON_BORROW = FileUtil.getPropertyValueBoolean(
"/properties/redis.properties"
,
"test_on_borrow"
);;
private
static
JedisPool jedisPool =
null
;
/**
* redis过期时间,以秒为单位
*/
public
final
static
int
EXRP_HOUR =
60
*
60
;
//一小时
public
final
static
int
EXRP_DAY =
60
*
60
*
24
;
//一天
public
final
static
int
EXRP_MONTH =
60
*
60
*
24
*
30
;
//一个月
/**
* 初始化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, ADDR_ARRAY.split(
","
)[
0
], PORT, TIMEOUT);
}
catch
(Exception e) {
logger.error(
"First create JedisPool error : "
+e);
try
{
//如果第一个IP异常,则访问第二个IP
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, ADDR_ARRAY.split(
","
)[
1
], PORT, TIMEOUT);
}
catch
(Exception e2){
logger.error(
"Second create JedisPool error : "
+e2);
}
}
}
/**
* 在多线程环境同步初始化
*/
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
*/
public
static
void
returnResource(
final
Jedis jedis) {
if
(jedis !=
null
&& jedisPool !=
null
) {
jedisPool.returnResource(jedis);
}
}
/**
* 设置 String
* @param key
* @param value
*/
public
static
void
setString(String key ,String value){
try
{
value = StringUtil.isEmpty(value) ?
""
: value;
getJedis().set(key,value);
}
catch
(Exception e) {
logger.error(
"Set key error : "
+e);
}
}
/**
* 设置 过期时间
* @param key
* @param seconds 以秒为单位
* @param value
*/
public
static
void
setString(String key ,
int
seconds,String value){
try
{
value = StringUtil.isEmpty(value) ?
""
: value;
getJedis().setex(key, seconds, value);
}
catch
(Exception e) {
logger.error(
"Set keyex error : "
+e);
}
}
/**
* 获取String值
* @param key
* @return value
*/
public
static
String getString(String key){
if
(getJedis() ==
null
|| !getJedis().exists(key)){
return
null
;
}
return
getJedis().get(key);
}
}
jedispool 连 redis的更多相关文章
- Jedis/JedisPool和Redis数据类型与特性
1.介绍Jedis Jedis 是 Redis 的 java 版本客户端,使用Jedis可以连接 Redis的数据库,Jedis连接方式有三种Jedis/JedisPool 连接.ShardedJed ...
- spring boot redis缓存JedisPool使用
spring boot redis缓存JedisPool使用 添加依赖pom.xml中添加如下依赖 <!-- Spring Boot Redis --> <dependency> ...
- redis 工具类 单个redis、JedisPool 及多个redis、shardedJedisPool与spring的集成配置
http://www.cnblogs.com/edisonfeng/p/3571870.html http://javacrazyer.iteye.com/blog/1840161 http://ww ...
- 三:Redis连接池、JedisPool详解、Redisi分布式
单机模式: package com.ljq.utils; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; ...
- redis设置密码以及jedisPool设置密码
转: redis设置密码以及jedisPool设置密码 2019年01月02日 20:24:43 宇文荒雪 阅读数:1118 版权声明:本文为博主原创文章,未经博主允许不得转载. https:// ...
- Java与redis交互、Jedis连接池JedisPool
Java与redis交互比较常用的是Jedis. 先导入jar包: commons-pool2-2.3.jar jedis-2.7.0.jar 基本使用: public class RedisTest ...
- redis连接池(JedisPool)资源归还及timeout详解
转载. https://blog.csdn.net/yaomingyang/article/details/79043019 一.连接池资源类详解都在注释上 package redis.v1.clie ...
- redis连接池——JedisPool和JedisCluster的介绍与使用
目录 Jedis使用方式的介绍 Redis连接池介绍 创建连接池配置文件 单机版的Redis连接池 集群版的Redis连接池 总结 Jedis使用方式的介绍 Jedis就是Java实现的操作Redis ...
- (二)Redis之Jedis概念和HelloWorld实现以及JedisPool的使用
一.Jedis概念 实际开发中,我们需要用Redis的连接工具连接Redis然后操作Redis, 对于主流语言,Redis都提供了对应的客户端: 官网:https://redis.io/clients ...
随机推荐
- NowCoderG:最大平方数
求不大于 N 的最大的平方数: 思路:输入数的平方根向下取整的数的平方即为所求. Python代码: import sys import math num=int(sys.stdin.readline ...
- HTTP 错误状态码讯息
HTTP 错误讯息解读 4xx: Client Error 使用者端(浏览器)错误讯息 错误码 错误讯息说明 400 Bad Request 错误的要求 401 Unauthorized ...
- spring 3.0系统集成webservice
spring 3.0系统集成webservice,踩了很多坑以后总算成功了,故写下这篇博客以记录. 1.准备jar包 由于项目是spring3.0,所以应该要使用cxf 2.7版本才可以成功配置,高版 ...
- Python -- 标准库 文件管理 (部分os包,shutil包)
在操作系统下,用户可以通过操作系统的命令来管理文件,参考linux文件管理相关命令.Python标准库则允许我们从Python内部管理文件.相同的目的,我们有了两条途径.尽管在Python调用标准库的 ...
- 用ASP.NET/C#连接Access和SQL Server数据库
连接Access 首先看一个例子代码片断:程序代码: ------------------------------------------------------------------------- ...
- 对log4cpp进一步封装
//Mylog.h如下: #pragma once//#include <iostream>#include <log4cpp/Category.hh>#include < ...
- Python多线程1:threading
threading模块提供了高级别的线程接口,基于低级别的_thread模块实现. 模块基本方法 该模块定了的方法例如以下: threading.active_count() 返回当前 ...
- django Proxy models ---- 代理模式
一个proxy models 不会在数据库中创建新的表.而是与它的基类共用同一个表 1.model 的定义: from django.db import models # Create your mo ...
- pycharm设置安装python第三方插件
pycharm设置安装python第三方插件 转载于:https://www.mindg.cn/?p=80 今天下了一个pycharm,设置用它来安装python插件,以下是安装步骤,与大家分享,我的 ...
- 巧用set比较大小,缩短时间复杂度
struct Node { long long a; long long b; long long c; long long num; int i; bool operator < (const ...