jedispool是什么_netpoll

jedispool是什么_netpoll遇到的问题:一开始做项目一直用的是jedis对象连接,今天发现自己上线的项目抛出了异常:JedisConnectionException:java.Net.SocketTimeoutException:Readtimed和和java.lang.ClassCastException:[Bcannotbecasttojava.util.List。异常解释:jedis的默认读取时…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

遇到的问题:
一开始做项目一直用的是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);
    // Jedispool
    JedisCommands 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);
        // 初始化JedisPool
        jedisPool = 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服务器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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197006.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 免费个人网页制作指南Dreamweaver教程

    免费个人网页制作指南Dreamweaver教程1.网页是什么1.1.什么是网页网页的称作HTML文件,是一种可以在www网上传输,并被浏览器识别和翻译成文本页面显示出来的文件。WWW的全名是“WorldWideWeb”;HTML的全称是“HypertextMarkupLanguage”,中文翻译为“超文本标记语言”。“超文本”就是指页面内可以包含图片、链接、甚至音乐,程序等非文字的元素。网页就是由H

    2022年6月5日
    46
  • 解决eclipse乱码问题[通俗易懂]

    解决eclipse乱码问题[通俗易懂]本文章主要解决eclipse工程区乱码问题。

    2022年5月26日
    33
  • virsh 关机_kvm虚拟机的virsh命令日常管理和配置

    virsh 关机_kvm虚拟机的virsh命令日常管理和配置virsh命令显示列表显示正在运行的[root@oldboy/etc/libvirt/qemu]#virshlistIdNameState—————————————————-5centos7running显示…

    2022年8月11日
    5
  • 十五:IO流_什么是io流

    十五:IO流_什么是io流跳转到总目录文章目录01、File类的使用1.1、File类的实例化1.2、File类的常用方法11.3、File类的常用方法21.4、课后练习02、IO流原理及流的分类2.1、IO流原理2.2、流的分类2.3、IO流体系04、节点流(或文件流)4.1、FileReader读入数据的基本操作4.2、FileReader中使用read(char[]cbuf)读入数据4.3、FileWriter写出数据的操作4.4、使用FileReader和FileWriter实现文本文件的复制4.5、使用FileInp

    2022年10月20日
    0
  • 重启nginx命令

    重启nginx命令进入到nginx/sbin目录下面首先需要获取超级管理员的权限1、输入sudosu然后输入密码2、输入sudobash然后输入密码然后输入./nignx-sreloadnginx重启成功

    2022年6月19日
    35
  • floyed 算法

    floyed 算法/**floyed是用动态规划解决完全最短路的算法,一次调用即可得到任意两个点间的最短路径复杂度为O(n^3),适用于稠密图,顶点数一般在100以内适用结构简单,易于编写floyed算法还可解决传递闭包,判断图是否为连通图在解题时候一般不会只考floyed而是利用floyed得到的结果,进行下一步解题就像二分算法一样,提一

    2022年6月25日
    37

发表回复

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

关注全栈程序员社区公众号