关于jedis的使用小结

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介:

1.pom.xml中依赖如下:

1
2
3
4
5
     < dependency >
       < groupId >redis.clients</ groupId >
       < artifactId >jedis</ artifactId >
       < version >2.6.1</ version >
    </ dependency >

2.jedis pool中ping的产生

线上storm的bolt使用jedis pool操作redis,高峰时压力一直比较大,每s处理量多达10w/s,redis持续跑满(单线程,cpu100%),对monitor数据分析,发现50%以上的都是ping操作,ping是用来检测redis是否可用的操作,在jedis pool中由两个参数控制:

1
2
setTestOnBorrow //获取连接时是否触发ping
setTestOnReturn //释放连接时是否触发ping

默认两个值都是true的,设置为false即可

3.获取不到资源时jedis的处理

1)当setBlockWhenExhausted设置为true(默认即为true)时,阻塞setMaxWaitMillis时间(默认为-1,会一直阻塞),超过时间限制则抛出异常:

1
2
3
4
5
6
7
8
9
Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
   at redis.clients.util.Pool.getResource(Pool.java:53)
   at redis.clients.jedis.JedisPool.getResource(JedisPool.java:99)
   at main.java.JedisPoolTest.main(JedisPoolTest.java:20)
Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
   at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:442)
   at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:360)
   at redis.clients.util.Pool.getResource(Pool.java:51)
   ... 2 more

2)当setBlockWhenExhausted(false);设置为false时,直接抛出异常,不会阻塞

4.jedis的默认db都是0,可以通过构造函数的参数进行设置

5.防止资源泄露,在catch异常的时候使用JedisPool.returnBrokenResource释放连接,可以使用JedisPool.getNumActive获取当前的活动连接数

6.pool的初始化经常使用静态代码块完成

7.sharding的模式也是支持pipline的

附1个jedissharding pipeline的例子:

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
package main.java;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedisPool;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPipeline;
import java.util.List;
import java.util.LinkedList;
public class JedisPoolTest {
   private static ShardedJedisPool pool = null;
   private static ShardedJedisPipeline pip = null;
    public static void main(String[] args) {       
       JedisPoolConfig jc = new JedisPoolConfig();
       jc.setBlockWhenExhausted(false);
       jc.setMaxIdle(8); 
       jc.setMaxTotal(20); 
       jc.setTestOnBorrow(false);
       jc.setTestOnReturn(false);
       jc.setMaxWaitMillis(-1);
       JedisShardInfo jedisShardInfo1 = new JedisShardInfo("192.168.101.42",6379);
       JedisShardInfo jedisShardInfo2 = new JedisShardInfo("192.168.101.42",6380);
       List< JedisShardInfo > list = new LinkedList< JedisShardInfo >();  
       list.add(jedisShardInfo1);
       list.add(jedisShardInfo2);
       pool = new ShardedJedisPool(jc, list);
       ShardedJedis jedis = pool.getResource();
       pip = jedis.pipelined();
       long start = System.currentTimeMillis();
       for(int i = 0;i <= 100;i++){          
          String key = "shardpool" + String.valueOf(i);
          pip.del(key);  
          pip.set(key, "test");   
       }
      pool.returnResource(jedis); 
      pip.syncAndReturnAll();
       long end = System.currentTimeMillis();
       long elapse = end - start;
       System.out.println("10000 itmes elapse time is " + String.valueOf(elapse));
    }
}


本文转自菜菜光 51CTO博客,原文链接:http://blog.51cto.com/caiguangguang/1635752,如需转载请自行联系原作者
相关文章
|
JSON 算法 API
微信支付超过2000元配置
导入依赖、微信工具类、请求示例、超过2000元转账参数、姓名加密、请求参数、微信支付平台证书序列号、Wechatpay-Serial
698 0
|
应用服务中间件 PHP nginx
|
开发框架 缓存 Cloud Native
微软发布 .NET 云原生开发框架—— .NET Aspire
微软于 2023-11-14日 发布了 .NET 8 的正式版。伴随着这个重要 .NET 版本的发布,微软也发布了一个全新的 .NET云原生开发框架 —— .NET Aspire,它提供了如下 3 个方面的能力,来帮助我们使用 .NET 开发分层、云就绪的可观测、本地与生产环境一致的分布式云原生应用程序。
1089 0
|
2月前
|
人工智能 移动开发 小程序
市面上的小程序平台对比
市面上的小程序平台对比
643 128
|
4月前
|
负载均衡 NoSQL Redis
不增加 GPU,首 Token 延迟下降50%|LLM 服务负载均衡的新实践
针对LLM服务的特点,Higress AI网关以插件形式提供了面向LLM服务的负载均衡算法,包括全局最小请求数负载均衡、前缀匹配负载均衡以及GPU感知负载均衡,能够在不增加硬件成本的前提下,提升系统的吞吐能力、降低响应延迟,并实现更公平、高效的任务调度。
466 135
|
数据可视化 数据挖掘 API
Python中的数据可视化利器:Matplotlib与Seaborn对比解析
在Python数据科学领域,数据可视化是一个重要环节。它不仅帮助我们理解数据,更能够让我们洞察数据背后的故事。本文将深入探讨两种广泛使用的数据可视化库——Matplotlib与Seaborn,通过对比它们的特点、优劣势以及适用场景,为读者提供一个清晰的选择指南。无论是初学者还是有经验的开发者,都能从中找到有价值的信息,提升自己的数据可视化技能。
679 3
|
前端开发 JavaScript 调度
原生JavaScript实现弹幕组件
原生JavaScript实现弹幕组件
|
Rust 安全 程序员
Rust vs Go:解析两者的独特特性和适用场景
在讨论 Rust 与 Go 两种编程语言哪种更优秀时,我们将探讨它们在性能、简易性、安全性、功能、规模和并发处理等方面的比较。同时,我们看看它们有什么共同点和根本的差异。现在就来看看这个友好而公平的对比。
|
存储 前端开发 JavaScript
SpringBoot+Vue 前后端分离 微服务项目 打包部署全流程(原始部署/宝塔部署)
SpringBoot+Vue 前后端分离 微服务项目 打包部署全流程(原始部署/宝塔部署)
5094 2
SpringBoot+Vue 前后端分离 微服务项目 打包部署全流程(原始部署/宝塔部署)
|
Rust JavaScript API
HttpClient Tool的新选择,代替Postman
代替Postman,用rust打造最快的开源api请求工具。