【redis】jedis客户端的使用

news2025/5/16 15:39:59

Jedis是Redis官方推荐的Java客户端库,提供了对Redis数据库的全面支持,适用于单机、哨兵及集群模式。作为最老牌的Java Redis客户端,其API设计直观,与Redis命令高度对应,例如set、get等方法与原生命令一致,降低了学习成本。

简单使用

引入依赖:

<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>5.0.2</version>
</dependency>

使用示例:

package com.morris.redis.demo.jedis;

import redis.clients.jedis.Jedis;

import java.util.List;
import java.util.Map;

/**
 * jedis的简单使用
 */
public class JedisDemo {
    public static void main(String[] args) {
        // 创建Jedis实例(默认端口6379)
        try (Jedis jedis = new Jedis("127.0.0.1", 6380)) {
            // 若需认证(如设置密码)
            // jedis.auth("your_password");

            // 字符串类型的使用
            jedis.set("key1", "value1");          // 设置键值
            String value = jedis.get("key1");     // 获取值(返回"value1")
            jedis.incr("counter");                // 自增数值(可用于计数器场景)

            // hash类型的使用
            jedis.hset("user:1", "name", "John"); // 设置哈希字段
            String name = jedis.hget("user:1", "name"); // 获取字段值
            Map<String, String> user = jedis.hgetAll("user:1"); // 获取全部字段

            // list类型的使用
            jedis.rpush("list1", "element1", "element2"); // 右侧插入元素
            List<String> list = jedis.lrange("list1", 0, -1); // 获取全部元素
            String popped = jedis.lpop("list1");           // 左侧弹出元素

            // 测试连接
            System.out.println("连接状态: " + jedis.ping()); // 输出"PONG"表示成功
        } // try-with-resources自动关闭连接
    }
}

连接池优化(推荐生产环境使用)

Jedis使用连接池的核心目的是解决直连模式下的性能瓶颈与资源管理问题。由于每次直连Redis都需新建TCP连接(三次握手)并在操作后关闭(四次挥手),高频请求时网络延迟占比可能高达97%,而连接池通过复用已建立的连接,将单次操作耗时从40ms级降至微秒级。此外,Jedis实例非线程安全,连接池为每个线程分配独立连接,规避多线程竞争风险。

package com.morris.redis.demo.jedis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * jedis连接池的使用
 */
public class JedisPoolDemo {
    public static void main(String[] args) {
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(400);          // 最大连接数
        config.setMaxIdle(400);            // 最大空闲连接
        config.setMinIdle(100);            // 最小空闲连接
        config.setMaxWaitMillis(5000);     // 最大等待5秒
        config.setTestOnBorrow(false);     // 禁用借出检测
        config.setTestWhileIdle(true);     // 开启空闲检测
        config.setTimeBetweenEvictionRunsMillis(30000);  // 每30秒检测空闲连接
        config.setLifo(false);             // 使用FIFO均衡负载

        try (JedisPool pool = new JedisPool(config, "127.0.0.1", 6379)) {
            Jedis jedis = pool.getResource();

            jedis.set("xx", "oo");

            System.out.println(jedis.get("xx"));

            // 执行操作...
            jedis.close(); // 归还连接到池
        }
    }
}

与SpringBoot的结合使用

需在pom.xml中添加spring-boot-starter-data-redis和Jedis客户端依赖,并排除默认的Lettuce客户端(也可以不排除,但是需要在配置文件中需要指定client-type)。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

在application.yml中配置Redis服务器地址及连接池参数,指定client-type为jedis。

spring:
  data:
    redis:
      host: 127.0.0.1
      port: 6379
#      password: your_password
      jedis:
        pool:
          max-active: 200    # 最大活跃连接数
          max-idle: 100     # 最大空闲连接
          min-idle: 50      # 最小空闲连接
          max-wait: 3000ms  # 获取连接最大等待时间
      client-type: jedis # 需要手动指定jedis,否则默认是lettuce

RedisTemplate序列化配置,自定义RedisTemplate以避免默认的JDK序列化问题:

package com.morris.redis.demo.jedis;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        template.setConnectionFactory(factory);
        return template;
    }
}

RedisTemplate的使用:

package com.morris.redis.demo.jedis;

import com.morris.redis.demo.RedisDemoApplication;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.data.redis.core.RedisTemplate;

/**
 * RedisTemplate的使用
 */
@SpringBootApplication
public class JedisSpringBootDemo {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(JedisSpringBootDemo.class, args);
        RedisTemplate redisTemplate = (RedisTemplate) applicationContext.getBean("redisTemplate");

        redisTemplate.opsForValue().set("oo", "xx");
        System.out.println(redisTemplate.opsForValue().get("oo"));
        applicationContext.close();
    }
}

jedis哨兵模式的使用

Jedis配置哨兵模式下的Redis地址需通过哨兵节点列表和主节点名称实现,并结合连接池参数优化。

spring:
  data:
    redis:
      sentinel:
        master: mymaster
        nodes: 127.0.0.1:16380,127.0.0.1:16381,127.0.0.1:16382
      jedis:
        pool:
          max-active: 200    # 最大活跃连接数
          max-idle: 100     # 最大空闲连接
          min-idle: 50      # 最小空闲连接
          max-wait: 3000ms  # 获取连接最大等待时间
      client-type: jedis # 需要手动指定jedis,否则默认是lettuce

jedis cluster的使用

配置文件中配置集群节点:

spring:
  data:
    redis:
      jedis:
        pool:
          max-active: 200    # 最大连接数
          max-idle: 100      # 最大空闲连接数
          min-idle: 50       # 最小空闲连接数
          max-wait: 3000ms   # 获取连接的最大等待时间
      client-type: jedis     # 客户端类型使用 jedis(默认是 lettuce)
      # redis集群模式
      cluster:
        nodes: 127.0.0.1:3001,127.0.0.1:3002,127.0.0.1:3003
        max-redirects: 5

Jedis在初始化时,通过cluster slots命令获取集群中所有槽与节点的对应关系,并将这些信息缓存在本地(JedisClusterInfoCache类中)。每次操作时,客户端直接根据本地缓存确定Key所属的槽及对应的节点,无需依赖服务端重定向。

如果请求发送到错误的节点(如槽迁移或节点故障),Redis会返回MOVED错误,此时Jedis会重新执行cluster slots命令更新本地映射,并重试请求。默认最多重试5次,超过则抛出Too many cluster redirection异常。

Jedis为每个Redis节点创建独立的连接池(JedisPool),确保高并发下的资源复用和线程安全。

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

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

相关文章

SQLMesh信号机制详解:如何精准控制模型评估时机

SQLMesh的信号机制为数据工程师提供了更精细的模型评估控制能力。本文深入解析信号机制的工作原理&#xff0c;通过简单和高级示例展示如何自定义信号&#xff0c;并提供实用的使用技巧和测试方法&#xff0c;帮助读者优化数据管道的调度效率。 一、为什么需要信号机制&#xf…

通义千问-langchain使用构建(二)

目录 序言xinference应用构建构建过程简单概述成效 chatchat应用构建过程成效 总结 序言 在昨天的使用langchain的基础上。又尝试了构建智能问答应用。 使用langchain chatchat这个开源包&#xff0c;构建了一下智能问答系统。 前置项&#xff0c;是使用了一下xinference框架&…

[IMX] 02.GPIO 寄存器

目录 手册对应章节 1.GPIO 复用&#xff08;引脚功能选择&#xff09;- IOMUXC_SW_MUX_CTL_PAD_xxx 2.GPIO 电气特性 - IOMUXC_SW_PAD_CTL_PAD_xxx 3.GPIO 数据与控制寄存器 3.1.数据 - DR 3.2.输入/输出选择 - GDIR 3.3.状态 - PSR 3.4.中断触发控制 - ICR 3.5.中断使…

【电子通识】热敏纸的静态发色性能和动态发色性能测试方法

静态发色性能的测定 测定治具 测定静态发色曲线需要使用三个仪器,包括静态发色仪、秒表(分辨力为0.01 s)、反射光密度计(符合 GB/T23649)。 静态发色曲线使用的测试仪为静态发色仪。其结构如下图所示:包括了保湿压板、金属加热板、温度显示器、控制面板。温度能在50℃到…

AIbase推出全球MCP Server集合平台 收录超12万个MCP服务器客户端

2025年&#xff0c;AI领域迎来了一项重要的技术进展——MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;的广泛应用。全球MCP Server集合平台AIbase(https://mcp.aibase.cn/)应运而生&#xff0c;为AI开发者提供了一站式的MCP服务器和客户端整合…

使用CMake中的configure_file命令自动生成项目版本信息

1 背景 随着实际项目的完善&#xff0c;可维护变的更加重要。在日志中保存项目的版本或是构建信息是一个非常有用的方法。 CMake提供了configure_file()命令&#xff0c;可以帮助开发者在构建项目时&#xff0c;自动生成版本或是构建信息&#xff0c;便于开发者在代码中直接引…

Linux的进程管理和用户管理

gcc与g的区别 比如有两个文件&#xff1a;main.c mainc.cpp&#xff08;分别是用C语言和C语言写的&#xff09;如果要用gcc编译&#xff1a; gcc -o mainc main.c gcc -o mainc mainc.cpp -lstdc表明使用C标准库&#xff1b; 区别一&#xff1a; gcc默认只链接C库&#x…

【springcloud学习(dalston.sr1)】Eureka服务端集群的搭建(含源代码)(二)

该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍&#xff08;含源代码&#xff09;&#xff08;一&#xff09; 这篇文章主要介绍多个eureka服务端的集群环境是如何搭建的。 &#xff08;一&#xff09;eureka的简要说明 Eu…

崩坏星穹铁道 3.3 版本前瞻活动攻略:在黎明升起时坠落

《崩坏星穹铁道》3.3 版本 “在黎明升起时坠落” 将于 5 月 21 日正式上线。本次版本更新内容丰富&#xff0c;新角色、新地图、新活动和新周本 BOSS 等精彩内容&#xff0c;等待开拓者们前去体验。下面就为大家带来 3.3 版本的前瞻活动攻略。 一、新角色与卡池 1.上半卡池&am…

OneNote内容太多插入标记卡死的解决办法

OneNote内容太多插入标记卡死的解决办法 针对平板电脑的OneNote用户适合此类情况&#xff1a; 当向电脑导入几百页pdf可以正常使用&#xff0c;唯独插入标记的时候OneNote直接罢工&#xff0c;只能关闭。关闭时还可能会出现0x000000fxxxxx的错误。 注&#xff1a;仅对于平板…

fpga系列 HDL : Microchip FPGA开发软件 Libero Soc 安装 license申请

启动 注册账号&#xff1a;https://login.microchip.com/申请免费许可&#xff1a;https://www.microchipdirect.com/fpga-software-products C:\Windows\System32>vol驱动器 C 中的卷是 Windows卷的序列号是 ****-****为“D:\Microsemi\License.dat”创建环境变量“LM_LICE…

极简主义现代商务风格PPT模版6套一组分享下载

现代商务风格PPT模版下载https://pan.quark.cn/s/12fbc52124d9 第一张PPT模版&#xff0c;简约风&#xff0c;橄榄绿背景&#xff0c;黑色竖条装饰&#xff0c;文字有中英文标题和占位符。需要提取关键元素&#xff1a;简约、橄榄绿、对称布局、占位文本的位置。 风格​&#…

解码生命语言:深度学习模型TranslationAI揭示RNA翻译新规则

RNA翻译是基因表达的核心环节&#xff0c;其精确调控依赖于翻译起始位点&#xff08;TIS&#xff09;和终止位点&#xff08;TTS&#xff09;的准确识别。传统方法依赖于简单的经验规则&#xff08;如Kozak序列或最长开放阅读框ORF&#xff09;&#xff0c;但忽略了RNA结构、顺…

重磅发布!OpenAI 推出最新模型 GPT-4.1 系列!

今日凌晨&#xff0c;OpenAI宣布开放全新模型GPT-4.1&#xff0c;并于即日起在ChatGPT中投入使用。 超长上下文与卓越编码能力 GPT-4.1作为OpenAI的最新模型&#xff0c;支持长达100万tokens的上下文&#xff0c;是OpenAI首次发布的长窗口模型。相较于前代&#xff0c;GPT-4.1…

sqli-labs靶场第七关——文件导出注入

一&#xff1a;目标 通过sql注入将php代码写入网站目录&#xff0c;通过这个php文件执行命令 二&#xff1a;确认前置条件 %secure_file_priv% 首先我们需要Mysql是否允许导出文件 先尝试在网页中sql注入&#xff0c;检查导出权限 ?id1)) union select 1,secure_file_pr…

解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs-docker MCP解析

解密企业级大模型智能体Agentic AI 关键技术&#xff1a;MCP、A2A、Reasoning LLMs-docker MCP解析 这里面有很重要的原因其中一个很其中一个原因是因为如果你使用docker的方式&#xff0c;你可以在虚拟环境下就类似于这个沙箱的这个机制可以进行隔离。这对于安全&#xff0c;…

OpenCV图像旋转原理及示例

OpenCV计算机视觉开发实践&#xff1a;基于Qt C - 商品搜索 - 京东 图像旋转是数字图像处理的一个非常重要的环节&#xff0c;是图像的几何变换手法之一。图像旋转算法是图像处理的基础算法。在数字图像处理过程中&#xff0c;经常要用到旋转&#xff0c;例如在进行图像扫描时…

【实战篇】数字化打印——打印部署管理接口开发

前言 前面的章节已经介绍了打印管理模块的主要界面设计&#xff0c;本篇介绍用myBuilder开发界面接口&#xff0c;实现最终的功能。 1. 配置打印应用菜单 首先配置挂载好模块菜单 让菜单点击能访问到对应的页面 2. 打印部署管理数据表详细设计 以下是打印部署管理的数据表字…

MacOS Python3安装

python一般在Mac上会自带&#xff0c;但是大多都是python2。 python2和python3并不存在上下版本兼容的情况&#xff0c;所以python2和python3可以同时安装在一台设备上&#xff0c;并且python3的一些语法和python2并不互通。 所以在Mac电脑上即使有自带python&#xff0c;想要使…

idea启动报错:java: 警告: 源发行版 11 需要目标发行版 11(亲测解决)

引起原因 idea的jdk没有替换干净 1.配置project file–Project Structrue–Project 2.配置Modules-Sources file–Project Structrue–Modules-Sources 改为jdk11 3.配置Modules-Dependencies file–Project Structrue–Modules-Dependencies