转自:http://tianxingzhe.blog.51cto.com/3390077/1684306

原子性(atomicity):

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

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

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

单机模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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集群客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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

转载于:https://www.cnblogs.com/gslyyq/p/5257317.html

jedis连接池详解(Redis)相关推荐

  1. python requests 异步调用_构建高效的python requests长连接池详解

    前文: 最近在搞全网的CDN刷新系统,在性能调优时遇到了requests长连接的一个问题,以前关注过长连接太多造成浪费的问题,但因为系统都是分布式扩展的,针对这种各别问题就懒得改动了. 现在开发的缓存 ...

  2. Spring Boot 使用 Druid 连接池详解

    Spring Boot 使用 Druid 连接池详解 Alibaba Druid 是一个 JDBC 组件库,包含数据库连接池.SQL Parser 等组件,被大量业务和技术产品使用或集成,经历过严苛的 ...

  3. Redis Lettuce客户端异步连接池详解

    前言 异步/非阻塞编程模型需要非阻塞API才能获得Redis连接.阻塞的连接池很容易导致阻塞事件循环并阻止您的应用程序进行处理的状态.Lettuce带有异步,非阻塞池实现,可与Lettuces异步连接 ...

  4. java连接池详解与自定义es连接池

    目录 1 版本选择 2 依赖选择 3 使用commons-pool构造连接池 3.1 pom.xml 3.2 对象池类 GenericObjectPool普通对象池 GenericKeyedObjec ...

  5. Mysql连接池详解——原理部分

    引言 为什么要使用连接池 线程池如何配合连接池使用, 连接池和线程池数量 不能根据经验值直接设置,需要根据io同步的具体时间去测试得到最优的值 同步连接池和异步连接池的区别 连接池的扩展 一.池化技术 ...

  6. Hyperf连接池详解

    开头语 Hyperf官网介绍了为什么要使用连接池及连接池的简单案例,但是对新手却不太友好,不过我还是想基于官方文档,来做一篇更深的讲解. 先来看看官方文档对于连接池的介绍 为什么要使用连接池 当并发量 ...

  7. 详解Jedis连接池报错处理

    在使用Jedis连接池模式下,比较常见的报错如下: redis.clients.jedis.exceptions.JedisConnectionException:Could not get a re ...

  8. Redis之jedis连接池

    jedis连接池的代码: public class JedisPoolTest {//Redis服务器IPprivate static String ADDR = "127.0.0.1&qu ...

  9. 系统性详解Redis操作Hash类型数据(带源码分析及测试结果)

    1 缘起 系统讲解Redis的Hash类型CURD, 帮助学习者系统且准确学习Hash数据操作, 逐步养成测试的好习惯, 本文较长,Hash的操作比较多,请耐心看, 既可以集中时间看,亦可以碎片时间学 ...

最新文章

  1. PAT 1079. Total Sales of Supply Chain
  2. cayenne:用于随机模拟的Python包
  3. JS中创建对象的方法
  4. (java)玩转算法系列-数据结构精讲[学习笔记](一)不要小瞧数组
  5. 云计算99.9%可用性毫无意义 灾难恢复是关键
  6. 再次联手法国力克,雅戈尔打造中国服装“智造”典范
  7. 麻辣江湖服务器正在维护,7月18日例行维护更新公告
  8. Ubuntu下读取Xbox360手柄输出
  9. 电脑如何进入bios
  10. 游戏光枪坐标定位原理及算法
  11. 银河战舰的最后一门重炮──C罗
  12. [Jenkins]jenkins配置163邮箱做邮件发送
  13. mpvue上拉刷新,下拉加载
  14. 106短信平台多少钱一条比较合理?
  15. 深度学习网络不收敛的原因分析总结
  16. 【高等数学】函数与极限
  17. python--lintcode109.数字三角形(动态规划)
  18. QGIS基本功 | 21 QGIS工程文件属性设置(2)——坐标参照系、变换、默认样式、数据源、关系和变量
  19. Django3.0+Python3.8+MySQL8.0 个人博客搭建三|创建博客项目
  20. VS 2017系统找不到指定文件

热门文章

  1. 关于bash的shellshock漏洞
  2. delete容易出错的地方
  3. ARP欺骗报文是这个样子的
  4. sublime c 语言 编译,默认情况下,将程序编译为Sublime Text 3中的c 14
  5. 怎样用计算机kd求平均数,利用pandas和numpy计算表中每一列的均值
  6. GroupBox控件
  7. mysql rr gap nextkey_mysql中的各种锁把我搞糊涂啦~
  8. 服务器显示禁止设置多个ip地址,服务器禁止设置多个ip解决办法
  9. 中移M5311-NBIOT-低功耗OPENCPU开发-MQTT
  10. python pandas检验一列中是否只有一个值