Jedis介绍及常见问题分析

简介: 本文主要介绍Jedis的使用方法及常见问题的排查分析方法

Jedis介绍

Jedis是一个开源的Redis数据库客户端,兼容Redis 2.8.x和3.xx,Jedis提供了以下特性:

  • 排序
  • 链接管理
  • 不同类型的value的命令处理
  • String类型的命令处理
  • Hashes类型的命令处理
  • Lists类型的命令处理
  • Sets类型的命令处理
  • Sorted Sets类型的命令处理
  • 事务
  • 批量命令处理
  • 订阅/发布
  • 持久化的控制命令
  • 远程控制命令
  • 分片(MD5,MurmurHash)
  • 集群的Key-tags功能
  • 集群的批量命令处理
  • 脚本的批量命令处理
  • Redis集群支持

如何使用

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>

直连模式

import redis.clients.jedis.Jedis;
public class jedistest {
public static void main(String[] args) {
    try {
        String host = "xx.kvstore.aliyuncs.com";//控制台显示访问地址
        int port = 6379;
        Jedis jedis = new Jedis(host, port);
        //鉴权信息
        jedis.auth("password");//password
        String key = "redis";
        String value = "aliyun-redis";
        //select db默认为0
        jedis.select(1);
        //set一个key
        jedis.set(key, value);
        System.out.println("Set Key " + key + " Value: " + value);
        //get 设置进去的key
        String getvalue = jedis.get(key);
        System.out.println("Get Key " + key + " ReturnValue: " + getvalue);
        jedis.quit();
        jedis.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

连接池模式

JedisPoolConfig config = new JedisPoolConfig();
//最大空闲连接数, 应用自己评估,不要超过ApsaraDB for Redis每个实例最大的连接数
config.setMaxIdle(200);
//最大连接数, 应用自己评估,不要超过ApsaraDB for Redis每个实例最大的连接数
config.setMaxTotal(300);
config.setTestOnBorrow(false);
config.setTestOnReturn(false);
String host = "*.aliyuncs.com";
String password = "密码";
JedisPool pool = new JedisPool(config, host, 6379, 3000, password);
Jedis jedis = null;
try {
    jedis = pool.getResource();
    /// ... do stuff here ... for example
    jedis.set("foo", "bar");
    String foobar = jedis.get("foo");
    jedis.zadd("sose", 0, "car");
    jedis.zadd("sose", 0, "bike");
    Set<String> sose = jedis.zrange("sose", 0, -1);
} finally {
    if (jedis != null) {
        jedis.close();
    }
}
/// ... when closing your application:
pool.destroy();

常见出错问题排查

连接池错误

使用Jedis连接池模式的时候容易出现的错误是无法获取连接池

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool

对于这类问题的原因有几类,可以根据以下一一进行排查

网络检查

首先检查是否网络问题,可以通过telnet host 6379进行简单测试,连上之后auth 密码回车查看是否返回+OKrn,如果能够正确返回继续检查ping请求或者读写请求是否正常返回,操作多次排查网络问题影响。

JedisPool连接数设置检查

JedisPool使用的时候需要进行连接池的设置,用户在超过MaxTotal连接数的时候也会出现获取不到连接池的情况,这个时候可以在访问客户端上通过netstat -an | grep 6379 | grep EST | wc -l 查看链接的客户端链接数目,并且比较这个数目和JedisPool配置的MaxTotal的值,如果没有明显超过或者接近就可以排除JedisPool连接池配置的影响。

JedisPool连接池代码检查

对于JedisPool连接池的操作,每次getResource之后需要调用returnResource或者close进行归还,可以查看代码是否有正确使用,代码sample可以参考上面的

检查是否发生nf_conntrack丢包

通过dmesg检查客户端是否有异常

nf_conntrack: table full, dropping packet

如果发生nf_conntract丢包可以通过修改设置sysctl -w net.netfilter.nf_conntrack_max=120000

检查是否TIME_WAIT问题

通过ss -s 查看time wait链接是否过多
screenshot.png
如果TIME_WAIT过多可以修改以下参数

sysctl -w net.ipv4.tcp_max_tw_buckets=180000
sysctl -w net.ipv4.tcp_tw_recycle=1

检查是否DNS问题

通过在/etc/hosts文件直接绑定host地址,绑定完成之后查看问题是否还存在,如果还存在则不是DNS解析问题

192.168.1.1  *.redis.rds.aliyuncs.com

总结

如果按照上面排查之后还有问题可以通过抓包并将报错时间点,报错信息,抓包文件发送给阿里云售后同学进行分析。抓包命令为sudo tcpdump -i eth0 tcp and port 6379 -n -nn -s 74 -w redis.cap。

目录
相关文章
|
数据采集 API 开发者
快手商品数据采集接口
快手商品数据采集接口
|
Java Apache 数据格式
httpclient 解决 connection reset 问题
  httpclient 解决 connection reset 问题   错误如下:   java.net.SocketException: Connection reset at java.
9235 0
|
11月前
|
人工智能 JavaScript Java
从零开始教你打造一个MCP客户端
Anthropic开源了一套MCP协议,它为连接AI系统与数据源提供了一个通用的、开放的标准,用单一协议取代了碎片化的集成方式。本文教你从零打造一个MCP客户端。
6985 5
|
8月前
|
机器学习/深度学习 算法 物联网
《探秘边缘智能:ESP32搭载TinyML实现语音唤醒的深度解析》
TinyML(微型机器学习)是一种将机器学习能力引入资源受限的边缘设备(如微控制器和物联网设备)的技术。与依赖云端计算的传统方法不同,TinyML通过算法优化、模型压缩和量化技术,在低功耗设备上实现实时智能决策。ESP32作为一款集成Wi-Fi和蓝牙功能的微控制器,凭借其强大的处理能力和低功耗特性,成为TinyML应用的理想平台。 以语音唤醒为例,TinyML结合ESP32可实现设备在待机状态下实时监测特定唤醒词的功能。这一过程需克服环境噪音、多样化人声特征及资源限制等挑战。构建语音唤醒模型涉及数据收集与预处理、轻量级神经网络设计(如CNN)、模型训练与优化、量化以及部署到ESP32上运行。
578 0
|
Java UED Spring
Springboot通过SSE实现实时消息返回
通过Spring Boot实现SSE,可以简单高效地将实时消息推送给客户端。虽然SSE有其限制,但对于许多实时消息推送场景而言,它提供了一种简洁而强大的解决方案。在实际开发中,根据具体需求选择合适的技术,可以提高系统的性能和用户体验。希望本文能帮助你深入理解Spring Boot中SSE的实现和应用。
6806 1
|
机器学习/深度学习 人工智能 自然语言处理
大模型时代下,算法工程师该何去何从?
大模型时代的到来,将算法工程师的职业发展带入了全新的境地。在这个浩瀚的数据海洋中,算法工程师们面临着前所未有的挑战和机遇。不久前,合合信息举办了一场《》的直播活动,智能技术平台事业部副总经理、高级工程师丁凯博士分享了。这段深度探讨不仅让我对算法工程师的未来有了更清晰的认识,也启发了我对自身职业发展的思考。接下来,我将分享这次讨论的精彩内容,希望能够为同学们提供一些有益的启示与思考。
|
数据采集 安全 搜索推荐
更高性价比的住宅IP代理服务商SmartProxy
互联网的发展增加了对海外住宅IP的需求。它们为个人提供访问特定区域资源的能力,并为企业拓展国际市场提供支持。选择可靠的供应商至关重要; SmartProxy作为优质服务商,特点包括: - 覆盖200多个国家的真实住宅IP。 - 高匿性及无限带宽确保数据采集无忧。 - 支持多种协议并可定制独享IP。 - 自定义选项实现精准定位。 - 24/7技术支持保障使用体验。 静态住宅IP提供固定地址,适用于需稳定连接的场景。[了解更多](https://www.smartproxycn.com/?r-source=-8jaZawMss)并领取0.5G免费流量。
|
存储 人工智能 安全
AI伦理与法规:确保技术安全可控
【7月更文第20天】随着人工智能(AI)技术的飞速发展,其在医疗、金融、教育、交通等领域的应用日益广泛,极大地推动了社会进步和经济发展。然而,AI的广泛应用也引发了诸多伦理问题和对个人隐私的潜在威胁,这些挑战要求我们在追求技术创新的同时,必须建立和完善相应的伦理规范与法律法规框架,以确保技术的安全可控。本文将探讨AI发展中的主要伦理问题、隐私保护策略以及相关的法律法规,并通过代码示例展示如何在实践中实施隐私保护措施。
1148 0
|
IDE Java 开发工具
"如何使用 jconsole 查看Java进程中线程的详细信息? "
当Java程序运行时,其中的一些线程也正在执行。我们可以用第三方工具 jconsole 来查看Java进程中线程的执行情况和详细信息,这有助于我们对多线程编程的理解。
642 0
|
监控 测试技术 Apache
性能测试:方法、工具与最佳实践
性能测试:方法、工具与最佳实践
1193 0