jedis连接池详解(Redis)

原子性(atomicity):

一个事务是一个不可分割的最小工作单位,事务中包括的诸操作要么都做,要么都不做。

Redis所有单个命令的执行都是原子性的,这与它的单线程机制有关;

Redis命令的原子性使得我们不用考虑并发问题,可以方便的利用原子性自增操作INCR实现简单计数器功能;

单机模式

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.returnResourceObject(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;
    }
}

参考文章:

http://www.cnblogs.com/linjiqin/archive/2013/06/14/3135248.html

分布式模式 


ShardedJedis是基于一致性哈希算法实现的分布式Redis集群客户端

package com.jd.redis.client;
 
import java.util.ArrayList;
import java.util.List;
 
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;
import redis.clients.util.Hashing;
import redis.clients.util.Sharded;
 
publicclass RedisShardPoolTest {
    
static ShardedJedisPoolpool;
    
static{
        
JedisPoolConfig config =new JedisPoolConfig();//Jedis池配置
        
config.setMaxActive(500);//最大活动的对象个数
        
  config.setMaxIdle(1000 * 60);//对象最大空闲时间
       
   config.setMaxWait(1000 * 10);//获取对象时最大等待时间
      
    config.setTestOnBorrow(true);
        
String hostA = "10.10.224.44";
       
   int portA = 6379;
       
   String hostB = "10.10.224.48";
       
   int portB = 6379;
        
List<JedisShardInfo> jdsInfoList =new ArrayList<JedisShardInfo>(2);
        
JedisShardInfo infoA = new JedisShardInfo(hostA, portA);
        
infoA.setPassword("redis.360buy");
        
JedisShardInfo infoB = new JedisShardInfo(hostB, portB);
        
infoB.setPassword("redis.360buy");
        
jdsInfoList.add(infoA);
        
jdsInfoList.add(infoB);
        
        
pool =new ShardedJedisPool(config, jdsInfoList, Hashing.MURMUR_HASH,
Sharded.DEFAULT_KEY_TAG_PATTERN);
    //传入连接池配置、分布式redis服务器主机信息、分片规则(存储到哪台redis服务器)
}
    
    
/**
    
 * @param args
    
 */
    
publicstaticvoid main(String[] args) {
        
for(int i=0; i<100; i++){
           String key =generateKey();
           //key += "{aaa}";
           ShardedJedis jds =null;
           try {
               jds =pool.getResource();
               System.out.println(key+":"+jds.getShard(key).getClient().getHost());
               System.out.println(jds.set(key,"1111111111111111111111111111111"));
           }catch (Exception e) {
               e.printStackTrace();
           }
           finally{
               pool.returnResourceObject(jds);
           }
        
}
    
}
 
    
privatestaticintindex = 1;
    
publicstatic String generateKey(){
        
return String.valueOf(Thread.currentThread().getId())+"_"+(index++);
    
}
}

参考文章:

http://blog.csdn.net/lang_man_xing/article/details/38405269

 

本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1684306

时间: 2024-12-29 06:20:10

jedis连接池详解(Redis)的相关文章

spring学习笔记(17)数据库配置[1]spring数据连接池详解

数据连接池 在spring中,常使用数据库连接池来完成对数据库的连接配置,类似于线程池的定义,数据库连接池就是维护有一定数量数据库连接的一个缓冲池,一方面,能够即取即用,免去初始化的时间,另一方面,用完的数据连接会归还到连接池中,这样就免去了不必要的连接创建.销毁工作,提升了性能.当然,使用连接池,有一下几点是连接池配置所考虑到的,也属于配置连接池的优点,而这些也会我们后面的实例配置中体现: 1. 如果没有任何一个用户使用连接,那么那么应该维持一定数量的连接,等待用户使用. 2. 如果连接已经满

Java Hibernate 之连接池详解

Hibernate支持第三方的连接池,官方推荐的连接池是C3P0,Proxool,以及DBCP.在配置连接池时需要注意的有三点: 一.Apche的DBCP在Hibernate2中受支持,但在Hibernate3中已经不再推荐使用,官方的解释是这个连接池存在缺陷.如果你因为某种原因需要在Hibernate3中使用DBCP,建议采用JNDI方式. 二.默认情况下(即没有配置连接池的情况下),Hibernate会采用内建的连接池.但这个连接池性能不佳,且存在诸多BUG(笔者就曾在Mysql环境下被八小

Java 线程池详解_java

系统启动一个线程的成本是比较高的,因为它涉及到与操作系统的交互,使用线程池的好处是提高性能,当系统中包含大量并发的线程时,会导致系统性能剧烈下降,甚至导致JVM崩溃,而线程池的最大线程数参数可以控制系统中并发线程数不超过次数. 一.Executors 工厂类用来产生线程池,该工厂类包含以下几个静态工厂方法来创建对应的线程池.创建的线程池是一个ExecutorService对象,使用该对象的submit方法或者是execute方法执行相应的Runnable或者是Callable任务.线程池本身在不

tcp连接的几种状态及连接状态详解

TCP连接示意图如下 通常情况下,一个正常的TCP连接,都会有三个阶段:     TCP三次握手;    数据传送;    TCP四次挥手 里面的几个概念:     SYN: (同步序列编号,Synchronize Sequence Numbers)    ACK: (确认编号,Acknowledgement Number)    FIN: (结束标志,FINish) I. TCP三次握手 客户端发起一个和服务创建TCP链接的请求,这里是SYN(J)服务端接受到客户端的创建请求后,返回两个信息:

连结池详解

详解 到目前为目,JDBC2的连结池只是一个接口,没有真正的实现,JDBC3正在开发中,据报已经支持连结池,但..........JDBC3用了JNDI技术,连结池的配置可以让一个高手都烦死. 目前第三方已经实现的连结池当然是poolman,1.0版对一般用户来说已经足够用了.配置也简单,2.0版虽然增加了一些功能,但配置也是采用JNDI,对RMI和EJB不懂的朋友可能很烦.建议用1.0的了. 如果有兴趣,自己也可以实现连结池,最关键的技术也就是把连结作为参数传给一个BEAN,用完后返回这个参数

详解 Redis 应用场景及应用实例

1. MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题: 1.MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间. 2.Memcached与MySQL数据库数据一致性问题. 3.Memcached数据命中率低或down机,大量访问直接穿透到DB,MySQL无法

详解Redis中的双链表结构_Redis

Redis中双链表实现的基本结构: 1.节点结构 typedef struct listNode { struct listNode *prev; //前向节点 struct listNode *next; //后向节点 void *value; //该节点的值 } listNode; 2.双向链表结构 typedef struct list { listNode *head; //头节点 listNode *tail; //尾节点 void *(*dup)(void *ptr); //复制函数

Java 中的字符串常量池详解_java

Java中的字符串常量池 Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new String("droid");,这两种方式我们在代码编写时都经常使用,尤其是字面量的方式.然而这两种实现其实存在着一些性能和内存占用的差别.这一切都是源于JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池.

在NetBeans中设置数据库连接池详解

以往要设置数据库连接池,需要借助于第三方软件.但现在NetBeans所带的Tomcat 5.5.7及Sun Application Server 8均可以直接设置.下面谈谈如何在Tomcat 5.5.7下设置. 1. 下载数据库的专用连接驱动,并将其复制到C:\Program Files\netbeans-4.1\enterprise1\jakarta-tomcat-5.5.7\common\lib文件夹下面. 假设所用数据库是Sybase的Adaptive Server Anywhere,从S