热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【九】redis的Java客户端:Jedis的使用及JedisPool的配置优化

Jedis的方法,方法命跟redis命令行客户端几乎一样,参数及参数顺序以跟redis命令行客户端几乎一样。这里不一一介绍,直接Jedis.会有提示。pom.xml

Jedis的方法,方法命跟redis命令行客户端几乎一样,参数及参数顺序以跟redis命令行客户端几乎一样。

这里不一一介绍,直接Jedis. 会有提示。

pom.xml


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.sid.redis
redis-train
1.0-SNAPSHOT


redis.clients
jedis
2.9.0
jar
compile



jedis的使用

1.直连

其实是tcp连接,底层用了socket。

每次都new Jedis(),使用这个对象去执行命令,返回对应的结果,关闭连接。

Jedis jedis = null;
try(
jedis = new Jedis("192.168.2.103",6379);
jedis.set("hello","word");
String value = jedis.get("hello");
}finally{
if(jedis != null){
jedis.close();
}
}

2.jedispool 连接池的使用

每次从JedisPool中借一个Jedis对象,Jedis执行命令,返回执行结果,归还Jedis对象给JedisPool。

这样不用每次都new Jedis,不用每次都走三次握手、没用每次都关闭Jedis。

GenericObjectPoolConfig poolCOnfig= new GenericObjectPoolConfig();
JedisPool jedisPool = new JedisPool(poolConfig,"192.168.2.103",6379);
Jedis jedis = null;
try{
jedis = jedisPool.getResource();
jedis.set("hello","word");
}catch(Exception e){
e.printStackTrace();
}
finally{
if(jedis != null){
//如果使用的jedispool来得到的jedis,那cloese操作不是关闭,而是归还给线程池
jedis.close();
}
}

直连和使用连接池的对比




















 优点缺点
直连

简单方便

适用于少量长期连接的场景


存在每次新建/关闭TCP开销

资源无法控制,存在连接泄露的可能

Jedis对象线程不安全


连接池

Jedis预先生成,降低开销

连接池的形式保护和控制资源的使用


相对于直连,使用相对麻烦,

尤其在资源管理上需要很多参数来保证,

一旦规划不合理也会出现问题。



Jedis连接池配置

资源数控制参数



































参数名含义默认值使用建议
maxTotal资源池最大连接数8 
maxIdle资源池允许最大空闲连接数8建议=maxTotal
minIdle资源池确保最少空闲连接数0预热minIdle
jmxEnabled是否开启jmx监控,可用于监控true建议开启

适合的maxTotal的例子:

假如命令平均执行时间0.001s,业务需要50000QPS,maxTotal理论值=0.001*50000=50个。实际值要偏大一点。

nodes(例如应用个数)*maxTotal不能超过redis的最大连接数(maxclients  redis服务端能接收的最大client客户端连接数)。

借还参数



































参数名含义默认值使用建议
blockWhenExhausted当资源池用尽后,调用者是否要等待。只有当为true时,下面的maxWaitMillis才会生效true建议使用默认值
maxWaitMillis当资源池连接用尽后,调用者的最大等待时间(单位毫秒)-1:表示永不超时不建议使用默认值
testOnBorrow向资源池借用连接时是否做连接有效性检查(ping),无效连接会被移除false建议false
testOnReturn向资源池归还连接时是否做连接有效性测试(ping),无效连接会被移除false建议false

连接池常见报错

redis.clients.jedis.exceptions.JedisConnectionException:Could not get a resource from the pool
...
Caused by: java.utils.NoSuchElementException:Timeout waiting for idle object

获取连接超时,资源池没有对应的资源。

redis.clients.jedis.exceptions.JedisConnectionException:Could not get a resource from the pool
...
Caused by: java.utils.NoSuchElementException:Pool exhausted

资源池中资源耗尽。

解决思路

1.慢查询阻塞:连接池的连接都被hang住了。

2.资源池参数不合理:QPS高、资源池太小。

3.连接泄露(没有close()):此类问题比较难定位。例如client list、netstat等、最重要是代码。

4.DNS异常。



推荐阅读
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了如何将CIM_DateTime解析为.Net DateTime,并分享了解析过程中可能遇到的问题和解决方法。通过使用DateTime.ParseExact方法和适当的格式字符串,可以成功解析CIM_DateTime字符串。同时还提供了关于WMI和字符串格式的相关信息。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
author-avatar
手机用户2502914373
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有