jedisPool的使用

遇到的问题:
一开始做项目一直用的是jedis对象连接,今天发现自己上线的项目抛出了异常:JedisConnectionException: java.Net.SocketTimeoutException: Read timed和和java.lang.ClassCastException: [B cannot be cast to java.util.List。
异常解释:
jedis的默认读取时间是2s,由于我用的是jedis对象连接因此当多个线程操作redis的时候,redis服务器采用的机制是FIFO(先入先出)机制,因此会使得线程等待时间增长,因此会造成redis读取超时,看了这个文章(https://blog.csdn.net/shuaiOKshuai/article/details/23266091)后,所以我在创建jedis对象时候把时间改成了100s,之后没有再抛出TimedoutException不过还是抛出了ClassCastException异常,后来查询网上资料(https://hellojimmy.iteye.com/blog/1197543)发现还是因为redis读取超时导致返回值是一个特别长的序列导致和我想接收的数据类型不一致导致抛出了该异常。
解决办法:
后来还是想到只能用jedisPool连接池来管理jedis对象。
使用jedisPool的好处

  1. 不适用连接池:当有很多任务需要采用线程执行的时候,而且有时可能会创建很多线程的时候,最好使用下线程池。
    不使用线程池的话,所创建的线程数无法控制,比如一下子创建了几百几千个线程,电脑一下子就崩溃了,因为创建销毁线程,消耗资源较多。。
  2. 使用连接池:提高效率 创建好一定数量的线程放在池中,等需要使用的时候就从池中拿一个,这要比需要的时候创建一个线程对象要快的多。
  3. 方便管理 可以编写线程池管理代码对池中的线程统一进行管理,比如说系统启动时由该程序创建100个线程,每当有请求的时候,就分配一个线程去工作, 如果刚好并发有101个请求,那多出的这一个请求可以排队等候,避免因无休止的创建线程导致系统崩溃2:方便管理 可以编写线程池管理代码对池中的线程统一进行管理,比如说系统启动时由该程序创建100个线程,每当有请求的时候,就分配一个线程去工作, 如果刚好并发有101个请求,那多出的这一个请求可以排队等候,避免因无休止的创建线程导致系统崩溃
    所需jar包:
    jedis-2.9.0.jar+commons-pool2-2.4.2.jar(注意jar包版本不同会导致出现JedisPoolConfig中没有SetMaxTotal(),setMaxIdle()等方法)
    下载地址:https://www.mvnjar.com/org.apache.commons/commons-pool2/2.4.1/detail.html
    简洁代码:
package com.yj.test.javaBases.testJedis;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCommands;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;public class TestJedis {public static final Logger logger = LoggerFactory.getLogger(TestJedis.class);// JedispoolJedisCommands jedisCommands;JedisPool jedisPool;JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();String ip = "192.168.x.x";int port = 6379;int timeout = 2000;public TestJedis() {// 初始化jedis// 设置配置jedisPoolConfig.setMaxTotal(1024);jedisPoolConfig.setMaxIdle(100);jedisPoolConfig.setMaxWaitMillis(100);jedisPoolConfig.setTestOnBorrow(false);//jedis 第一次启动时,会报错jedisPoolConfig.setTestOnReturn(true);// 初始化JedisPooljedisPool = new JedisPool(jedisPoolConfig, ip, port, timeout);//  Jedis jedis = jedisPool.getResource();jedisCommands = jedis;}public void setValue(String key, String value) {this.jedisCommands.set(key, value);}public String getValue(String key) {return this.jedisCommands.get(key);}public static void main(String[] args) {TestJedis testJedis = new TestJedis();testJedis.setValue("testJedisKey", "testJedisValue");logger.info("get value from redis:{}",testJedis.getValue("testJedisKey"));}}

详细配置解释代码:

package com.test;import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;public  class RedisUtil {//Redis服务器IPprivate static String ADDR = "192.168.0.41";//Redis的端口号private static int PORT = 6379;//访问密码private static String AUTH = "admin";//可用连接实例的最大数目,默认值为8;//如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。private static int MAX_TOTAL = 8;//最小空闲连接数, 默认0private static int MIN_IDLE=0;//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。//最大空闲连接数, 默认8个private static int MAX_IDLE = 8;//获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间,  默认-1//等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;private static int MAX_WAIT = -1;private static int TIMEOUT = 10000;//连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认trueprivate static boolean BLOCK_WHEN_EXHAUSTED = false;//设置的逐出策略类名, 默认DefaultEvictionPolicy(当连接超过最大空闲时间,或连接数超过最大空闲连接数)private static String EVICTION_POLICY_CLASSNAME="org.apache.commons.pool2.impl.DefaultEvictionPolicy";//是否启用pool的jmx管理功能, 默认trueprivate static boolean JMX_ENABLED=true;//MBean ObjectName = new ObjectName("org.apache.commons.pool2:type=GenericObjectPool,name=" + "pool" + i); 默认为"pool", JMX不熟,具体不知道是干啥的...默认就好.private static String JMX_NAME_PREFIX="pool";//是否启用后进先出, 默认trueprivate static boolean LIFO=true;//逐出连接的最小空闲时间 默认1800000毫秒(30分钟)private static long MIN_EVICTABLE_IDLE_TIME_MILLIS=1800000L;//对象空闲多久后逐出, 当空闲时间>该值 且 空闲连接>最大空闲数 时直接逐出,不再根据MinEvictableIdleTimeMillis判断  (默认逐出策略)   private static long SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS=1800000L;//每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3private static int NUM_TESTS_PER_EVICYION_RUN=3;//在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;//在获取连接的时候检查有效性, 默认falseprivate static boolean TEST_ON_BORROW = false;//在空闲时检查有效性, 默认falseprivate static boolean TEST_WHILEIDLE=false;//逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1private static long TIME_BERWEEN_EVICTION_RUNS_MILLIS=-1;private static JedisPool jedisPool = null;/*** 初始化Redis连接池*/static {try {JedisPoolConfig config = new JedisPoolConfig();config.setBlockWhenExhausted(BLOCK_WHEN_EXHAUSTED);config.setEvictionPolicyClassName(EVICTION_POLICY_CLASSNAME); config.setJmxEnabled(JMX_ENABLED);config.setJmxNamePrefix(JMX_NAME_PREFIX);config.setLifo(LIFO);config.setMaxIdle(MAX_IDLE);config.setMaxTotal(MAX_TOTAL);config.setMaxWaitMillis(MAX_WAIT);config.setMinEvictableIdleTimeMillis(MIN_EVICTABLE_IDLE_TIME_MILLIS);config.setMinIdle(MIN_IDLE);config.setNumTestsPerEvictionRun(NUM_TESTS_PER_EVICYION_RUN);config.setSoftMinEvictableIdleTimeMillis(SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS);config.setTestOnBorrow(TEST_ON_BORROW);config.setTestWhileIdle(TEST_WHILEIDLE);config.setTimeBetweenEvictionRunsMillis(TIME_BERWEEN_EVICTION_RUNS_MILLIS);jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT, AUTH);} catch (Exception e) {e.printStackTrace();}}/*** 获取Jedis实例* @return*/public synchronized static Jedis getJedis() {try {if (jedisPool != null) {Jedis resource = jedisPool.getResource();return resource;} else {return null;}} catch (Exception e) {e.printStackTrace();return null;}}/*** 释放jedis资源* @param jedis*/public static void close(final Jedis jedis) {if (jedis != null) {jedis.close();}}
}

参考博客:
https://blog.csdn.net/shuaiOKshuai/article/details/23266091
https://hellojimmy.iteye.com/blog/1197543
https://blog.csdn.net/baidu_18607183/article/details/49330083
https://www.jianshu.com/p/8334151cbc10
https://www.cnblogs.com/zimublog/p/8404476.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ssdb教程

常见问题解答:http://ssdb.io/docs/zh_cn/faq.html https://www.w3xue.com/server/ssdb/ssdb-comlist.html http://ssdb.io/docs/zh_cn/commands/index.html https://www.w3cschool.cn/ssdb/xd2leud8.html

java ssdb 操作link遍历map的两种方式

方法一&#xff1a;不推荐使用&#xff0c;只会返回map中的key Link link ssdb.link; resp link.request("qpush", "q", "a");for(int i1; i<resp.raw.size(); i2){ String s new String(resp.raw.get(i)); System.out.println(s); }方法…

FileOutputStream为false时候注意的问题

今天写代码时候发现&#xff0c;new FileOutputStream(new File(“test.txt”), false)时候test.txt文件内容会清空&#xff0c;记录一下&#xff01;

java文件重命名有趣实验

Testpublic void filetest() throws Exception {//判断文件会写入到哪个文件内File file new File("test.txt");file.renameTo(new File("test1.txt"));FileOutputStream out new FileOutputStream(file);out.write("ok".getBytes());out.clos…

网络流之最大流算法(EdmondsKarp)

网络流之最大流算法&#xff08;EdmondsKarp&#xff09; 标签&#xff1a; 网络流算法EdmondsKarp流量最大流2014-03-11 18:05 34795人阅读 评论(12) 收藏 举报分类&#xff1a;图论~~网络流&#xff08;26&#xff09; 版权声明&#xff1a;本文为博主原创文章&#xff0c;未…

java文件流操作注意

今天做了一个测试&#xff1a; Testpublic void fileOut() throws Exception {FileOutputStream out new FileOutputStream(new File("test.txt"), false);out.write("1".getBytes());out.write("2".getBytes());File file new File("tes…

try代码块中出现异常后try内程序会继续执行还是直接抛出异常?

Testpublic void excp() {try {int i 1/0;System.out.println(1);}catch (Exception e) {e.printStackTrace();// TODO: handle exception}System.out.println(22);}输出&#xff1a; java.lang.ArithmeticException: / by zero at task.ExceedActiveTimeClearTask.excp(Excee…

java文件重命名失败问题

我记得之前也遇到这个问题后来找了几个小时才找到问题&#xff0c;这次又花了一个小时找出这个问题&#xff0c;发现是自己的文件流没有关闭&#xff0c;一定要切记&#xff0c;当对文件重命名操作的时候一定要先把操作改文件的文件流关闭之后再进行重命名的操作&#xff0c;切…

equalsignorecase用法

来源&#xff1a;百度知道 解释&#xff1a; public boolean equalsIgnoreCase(String anotherString)将此 String 与另一个 String 进行比较&#xff0c;不考虑大小写。如果两个字符串的长度相等&#xff0c;并且两个字符串中的相应字符都相等&#xff08;忽略大小写&#xf…

利用TF-IDF提取新闻文章摘要

文章&#xff1a;http://www.ruanyifeng.com/blog/2013/03/automatic_summarization.html

【转载】LinkedHashMap和HashMap区别

HashMap,LinkedHashMap,TreeMap都属于Map Map 主要用于存储键(key)值(value)对&#xff0c;根据键得到值&#xff0c;因此键不允许键重复,但允许值重复。 HashMap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值&#xff0c;具有很快的访问速度。…

java英文拼写检查并自动纠正

SpellCorrect原理&#xff1a;https://www.cnblogs.com/jianxinzhou/p/4740392.html 项目源码&#xff1a; package com.xq.algorithm;import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import j…

java Trie实现英文单词查找树 搜索自动提示

原理解释文章&#xff1a;https://blog.csdn.net/beiyetengqing/article/details/7856113 代码应用&#xff1a; wordTrie.txt(工具类)&#xff1a; package com.xq.algorithm;import java.util.ArrayList; import java.util.List;/*** * <p>Title:</p>* <p>…

java HashMap实现中文分词器 应用:敏感词过滤实现

今天下午部门内部技术分享是分词器算法。这次的主讲是大名鼎鼎的Ansj分词器的作者-孙健。 作者简介&#xff1a; Ansj分词器作者 elasticsearch-sql&#xff08;elasticsearch的sql插件&#xff09;作者&#xff0c;支持sql查询 nlp-lang自然语言工具包发起人 NLPCN&#xff…

java字典树(Trie)实现中文模糊匹配

原理解释&#xff1a; java实现&#xff1a;https://blog.csdn.net/yuhk231/article/details/51539840 c实现&#xff1a;https://blog.csdn.net/qq_31175231/article/details/77827324 代码模板&#xff1a;缺点&#xff0c;只能检索出在一个分支中的前缀匹配内容 package co…

Word2vec加TextRank算法生成文章摘要

依赖包&#xff1a;https://download.csdn.net/download/dreamzuora/10853874 代码&#xff1a; String document "算法可大致分为基本算法、数据结构的算法、数论算法、计算几何的算法、图的算法、动态规划以及数值分析、加密算法、排序算法、检索算法、随机化算法、并行…

hanlp中文分词、提取摘要关键字、语句分析、智能推荐

hanlp资源&#xff1a; hanlp介绍&#xff1a;http://hanlp.linrunsoft.com/ hanlp下载&#xff1a;https://github.com/hankcs/HanLP hanlp(分词)使用&#xff1a;https://blog.csdn.net/nima1994/article/details/72819973 hanlp1.7:https://github.com/hankcs/HanLP/tree/v1…

TextRank、BM25算法提取关键字、文章自动摘要优秀文章保存

转载地址&#xff1a;http://www.hankcs.com/nlp/textrank-algorithm-java-implementation-of-automatic-abstract.html

set 用法

Set常用用法 2013-04-22 19:24 86508人阅读 评论(1) 收藏 举报分类&#xff1a;CPlus&#xff08;54&#xff09; set集合容器&#xff1a;实现了红黑树的平衡二叉检索树的数据结构&#xff0c;插入元素时&#xff0c;它会自动调整二叉树的排列&#xff0c;把元素放到适当的位置…

去掉标点符号

//去掉标点符号、空格title title.replaceAll("[\\pP\\p{Punct}| ]", "");