uptools使用教程,jedisapi使用

面临的问题:

最初使用jedis对象连接,但今天自己联机的项目异常的: jedisconnectionexception : Java.net.sockettimeoutexception :

异常解释:

jedis的默认读取时间为2s。 因为我使用的是jedis对象连接,所以当多个线程在操作redis时,由于redis服务器采用的机制是FIFO(先入先出)机制,线程等待时间会变长,redis加载将超时。 在阅读了本文(https://blog.csdn.net/shuaiokshuai/article/details/23266091 )后,我们在创建jedis对象时将时间更改为100s。 之后,我没有投TimedoutException,但后来我查了网上的资料653359 hello Jimmy.iteye.com/blog/1197543 (还是http://www.sining

解决方案:

之后,我觉得只能使用jedisPool连接池来管理jedis对象。redis读取超时导致返回值是一个特别长的序列导致

不使用连接池:如果需要使用线程执行的任务很多,并且在某些情况下可能会创建很多线程,则建议使用线程池。

如果不使用线程池,则无法控制创建的线程数。 例如,如果一下子创建数百个线程,计算机就会一下子崩溃。 因为要创建销毁线程,所以会消耗很多资源。 使用连接池:创建一定数量的线程并将其放在池中,以提高效率,并根据需要从池中提取一个线程。 这比根据需要创建线程对象快得多。 为了便于管理,请编写线程池管理代码以统一管理池中的线程。 例如,在系统启动时,该程序将创建100个线程,并在每次请求时分配线程进行工作。 如果正好同时有101个请求,则额外的请求可以排队等待。 可以编写线程池管理代码,以便于通过无中断创建线程来避免系统崩溃2:管理,从而集中管理池中的线程。 例如,在系统启动时创建100个线程,并在每次请求时分配线程进行工作。 如果正好同时发生101个请求,则可以将额外的请求排队,以防止无中断地创建线程导致系统崩溃

所需的jar包:

jedis-2.9.0.jar commons-pool2-2.4.2. jar (如果jar包的版本不同,则在JedisPoolConfig中设置设置)、设置混合)

下载地址: https://www.mvn jar.com/org.Apache.com mons/commons-pool2/2.4.1/detail.html

简码: package com.yj.test.Java bases.test jedis; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import redis.clients.jedis.jedis; import redis.clients.jedis.jedis commands; import redis.clients.jedis.Jedi spool; import redis.clients.jedis.jedis poolconfig; publicclasstestjedis { publicstaticfinalloggerlogger=logger factory.getlogger (test jedis.class ); //jedispooljediscommandsjediscommands; JedisPool jedisPool; jedispoolconfigjedispoolconfig=newjedispoolconfig (; String ip=’192.168.x.x ‘; int port=6379; int timeout=2000; PublictestJedis(((/初始化Jedis(/配置Jedispoolconfig.setmaxtotal ) ) 1024; Jedispoolconfig.setmaxidle(100; jedis poolconfig.setmaxwaitmillis (100; jedis poolconfig.settestonborrow (false ); //jedis首次启动时,报告jedis poolconfig.settestonreturn (true )和错误。 //jedispooljedispool=初始化newjedispool (jedis轮询配置,ip,端口,时间输出); //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服务器IP private 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; //最小空闲连接数, 默认0 private 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阻塞直到超时, 默认true private static boolean BLOCK_WHEN_EXHAUSTED = false; //设置的逐出策略类名, 默认DefaultEvictionPolicy(当连接超过最大空闲时间,或连接数超过最大空闲连接数) private static String EVICTION_POLICY_CLASSNAME=”org.apache.commons.pool2.impl.DefaultEvictionPolicy”; //是否启用pool的jmx管理功能, 默认true private 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”; //是否启用后进先出, 默认true private 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), 默认3 private static int NUM_TESTS_PER_EVICYION_RUN=3; //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的; //在获取连接的时候检查有效性, 默认false private static boolean TEST_ON_BORROW = false; //在空闲时检查有效性, 默认false private static boolean TEST_WHILEIDLE=false; //逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1 private 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

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注