redis--redisJava客户端:Jedis详解

news2025/5/23 2:28:18

在Redis官网中提供了各种语言的客户端,地址: https://redis.io/docs/latest/develop/clients/

image-20250520165311469

Jedis

以Redis命令做方法名称,学习成本低,简单实用,但是对于Jedis实例是线程不安全的(即创建一个Jedis实例,多线程并发运行时会有线程安全问题,在多线程使用时,必须为每一个线程创建独立的Jedis连接,就是必须要使用连接池的方式来配合使用。)多线程环境下需要基于连接池来使用。

lettuce

Lettuce是基于Netty实现的,支持同步、异步、和响应式编程方式,并且是线程安全的,支持Redis的哨兵模式、集群模式、和管道模式。与spring结构契合度较高,且数据吞吐量也很不错,因此spring工程也默认兼容lettuce模式

Redisson

Redisson是一个基于Redis实现的分布式、可伸缩的Java数据结构集合。包括了Map,Queue,Lock,Semaphore,AtomicLog等强大功能

Jedis快速入门

Jedis官网地址:redis/jedis: Redis Java client 快速入门:

  • 引入依赖

 <!--    引入Jedis依赖-->
     <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
     <dependency>
         <groupId>redis.clients</groupId>
         <artifactId>jedis</artifactId>
         <version>5.2.0</version>
     </dependency>
 <dependencies>
 <!--    引入Jedis依赖-->
     <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
     <dependency>
         <groupId>redis.clients</groupId>
         <artifactId>jedis</artifactId>
         <version>5.2.0</version>
     </dependency>
     <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>4.13.2</version>
         <scope>test</scope>
     </dependency>
     <dependency>
         <groupId>org.junit.jupiter</groupId>
         <artifactId>junit-jupiter-api</artifactId>
         <version>5.11.4</version>
         <scope>test</scope>
     </dependency>
 </dependencies>
  • 建立连接

public class JedisTest {
 private Jedis jedis;
 @BeforeEach
  void setUp(){
     //1.建立连接
     jedis = new Jedis("127.0.0.1",6379);
     //2.选择数据库
     jedis.select(0);
 }
 @Test
     void testString(){
     //存入数据
     String result = jedis.set("name", "lyc");
     System.out.println("result = "+result);
     //获取数据
     String name = jedis.get("name");
     System.out.println("name = "+name);
 }
 
  • 使用Jedis,方法名与Redis命令一致

 @Test
     void testList(){
     //存入数据
     jedis.lpush("mylist","1","2","3");
     for (String s : jedis.lrange("mylist", 0, -1)) {
         System.out.println("s = "+s);
     }
     }
     @Test
     void testHash(){
     //存入数据
     jedis.hset("user:1","name","jack");
     jedis.hset("user:1","age","21");
     //获取数据
         Map<String, String> map = jedis.hgetAll("user:1");
         for (Map.Entry<String, String> entry : map.entrySet()) {
             System.out.println(entry.getKey()+" = "+entry.getValue());
         }
     }
  • 测试

image-20250520214239522

  • 释放资源

 @AfterEach
     void tearDown(){
     //关闭连接
     if (jedis!=null) {
         jedis.close();
     }
 }
 }

注意事项:在释放资源时并不是单纯的close()方法,而是底层调用returnResource()方法

public void close() {
     if (this.dataSource != null) {
         Pool<Jedis> pool = this.dataSource;
         this.dataSource = null;
         if (this.isBroken()) {
             pool.returnBrokenResource(this);
         } else {
             pool.returnResource(this);
         }
     } else {
         this.connection.close();
     }
 ​
 }

Jedis连接池

Jedis本身是线程不安全的,在多线程的环境下,并发访问Jedis可能会导致线程安全问题.

因此在并发的环境下,Jedis需要给每一个线程创建独立的Jedis对象。

此时最好的方案时使用线程池,并且频繁的创建和销毁Jedis对象(连接)会有性能损耗,因此推荐使用Jedis连接池代替Jedis的直连方式。

Jedis连接池使用说明:

定义JedisConnectionFactory工具类:

首先声明静态变量 Jedispool(Jedis连接池),通过静态代码块将Jedispool配置初始化。

静态代码块中,先新建一个JedisPoolConfig(Jedis连接池配置)实例化对象,配置JedisPoolConfig对象的参数,通过其设置最大连接数,最大空闲连接,最小空闲连接,以及最长等待时间(单位为毫秒)。

最终通过JedisPool的有参构造方法将配置,主机号,端口号,超时时间,以及密码传入JedisPool对象。

最后提供了静态方法getJedis用来拿到Jedis对象(实际是调用JedisPool的getResource()方法)。

只要调用这个工具类的getJedis方法就能拿到Jedis对象,都是从连接池获取,用完之后返回到池中,这样就避免了频繁的创建与销毁Jedis对象。

代码如下:

 
public class JedisConnectionFactory {
     private static JedisPool jedisPool;
     static {
         //配置连接池
         JedisPoolConfig config = new JedisPoolConfig();
         // 最大连接数
         config.setMaxTotal(10);
         // 最大空闲连接数
         config.setMaxIdle(5);
         // 最小空闲连接
         config.setMinIdle(5);
         // 获取连接时的最大等待毫秒数
         config.setMaxWaitMillis(1000);
         // 在获取连接的时候检查有效性
         config.setTestOnBorrow(true);
         //创建连接池对象
         jedisPool = new JedisPool(config,"192.168.1.100", 6379);
     }
     // 获取Jedis实例
     public static Jedis getJedis() {
         return jedisPool.getResource();
     }
 }

将原来的直接新建Jedis对象改为使用连接池

 @BeforeEach
  void setUp(){
     //1.建立连接
    jedis = JedisConnectionFactory.getJedis();
     //2.选择数据库
     jedis.select(0);
 }

再次测试

image-20250520214217640

测试成功。

总结:Jedis中的所有方法都是我们在Redis中学到的命令,这样虽然降低了学习难度,但是导致Jedis显得非常臃肿,因此我们接下来学习的就是由spring整合的SpringDataRedis。

希望对大家有所帮助

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

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

相关文章

[CSS3]百分比布局

移动端特点 PC和手机 PC端网页和移动端网页的有什么不同? PC屏幕大&#xff0c;网页固定版心手机屏幕小&#xff0c;网页宽度多数为100% 谷歌模拟器 使用谷歌模拟器可以在电脑里面调试移动端的网页 屏幕尺寸 了解屏幕尺寸概念 屏幕尺寸: 指的是屏幕对角线的长度&#xff…

【Java微服务组件】异步通信P2—Kafka与消息

欢迎来到啾啾的博客&#x1f431;。 记录学习点滴。分享工作思考和实用技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 欢迎评论交流&#xff0c;感谢您的阅读&#x1f604;。 目录 引言Kafka与消息生产者发送消息到Kafka批处理发送设计消息的幂等信息确保消息送达acks配置…

R语言空间数据处理入门教程

我的课程《R语言空间数据处理入门教程》已重新恢复课程售卖&#xff0c;有需要的读者可以学习。 &#x1f447;点击下方链接&#xff08;文末“阅读原文”可直达&#xff09;&#xff0c;立即开启你的空间数据之旅&#xff1a; https://www.bilibili.com/cheese/play/ss13775…

使用zap,对web应用/API接口 做安全检测

https://www.zaproxy.org/getting-started/ 检测方法 docker pull ghcr.io/zaproxy/zaproxy:stable# 执行baseline测试 docker run -t ghcr.io/zaproxy/zaproxy:stable zap-baseline.py \ -t https://baseline.yeshen.org# 执行api测试 docker run -t ghcr.io/zaproxy/zaproxy…

UE5.6新版本—— 动画光照系统重点更新

UE5.6预览版已经可以下载&#xff0c;发布会在下个月的6.5号发布。 5.6界面UI设计 5.6 对引擎进行了大规模的重新设计&#xff0c;先看整体内容&#xff0c;主题UI设计 被调整了位置&#xff0c;左边大多数的选择&#xff0c;框选工具&#xff0c;吸附工具&#xff0c;挪到了左…

腾讯位置服务重构出行行业的技术底层逻辑

位置智能&#xff1a;重构出行行业的技术底层逻辑 在智慧城市建设与交通出行需求爆发的双重驱动下&#xff0c;位置服务正从工具层跃升为出行行业的核心基础设施。腾讯位置服务以“连接物理世界与数字空间”为核心理念&#xff0c;通过构建高精度定位、实时数据融合、智能决策…

如何用JAVA手写一个Tomcat

一、初步理解Tomcat Tomcat是什么&#xff1f; Tomcat 是一个开源的 轻量级 Java Web 应用服务器&#xff0c;核心功能是 运行 Servlet/JSP。 Tomcat的核心功能&#xff1f; Servlet 容器&#xff1a;负责加载、实例化、调用和销毁 Servlet。 HTTP 服务器&#xff1a;监听端口…

使用 Qt QGraphicsView/QGraphicsScene 绘制色轮

使用 Qt QGraphicsView/QGraphicsScene 绘制色轮 本文介绍如何在 Qt 中利用 QGraphicsView 和 QGraphicsScene 实现基础圆形绘制&#xff0c;以及进阶的色轮&#xff08;Color Wheel&#xff09;效果。 色轮是色彩选择器的常见控件&#xff0c;广泛应用于图形设计、绘画和 UI …

使用glsl 来做视频矫正

描述、优点 使用glsl来代替opencv的undistort 和 鱼眼矫正,并且最后使用opencv的LUT给glsl 来使用,来达到加速的目的,并且做到和opencv 一模一样的效果,达到实时视频的加速矫正。 优点: 没有cuda,也可以做到实时视频矫正,包含各类板子和amd的cpu,intel核显 矫正的基本作…

03-Web后端基础(Maven基础)

1. 初始Maven 1.1 介绍 Maven 是一款用于管理和构建Java项目的工具&#xff0c;是Apache旗下的一个开源项目 。 Apache 软件基金会&#xff0c;成立于1999年7月&#xff0c;是目前世界上最大的最受欢迎的开源软件基金会&#xff0c;也是一个专门为支持开源项目而生的非盈利性…

蓝桥杯19682 完全背包

问题描述 有 N 件物品和一个体积为 M 的背包。第 i 个物品的体积为 vi​&#xff0c;价值为 wi​。每件物品可以使用无限次。 请问可以通过什么样的方式选择物品&#xff0c;使得物品总体积不超过 M 的情况下总价值最大&#xff0c;输出这个最大价值即可。 输入格式 第一行…

DeepSeek源码解构:从MoE架构到MLA的工程化实现

文章目录 **一、代码结构全景&#xff1a;从模型定义到分布式训练****二、MoE架构&#xff1a;动态路由与稀疏激活的工程化实践****1. 专家路由机制&#xff08;带负载均衡&#xff09;****数学原理&#xff1a;负载均衡损失推导** **三、MLA注意力机制&#xff1a;低秩压缩与解…

【VLNs篇】02:NavGPT-在视觉与语言导航中使用大型语言模型进行显式推理

方面 (Aspect)内容总结 (Content Summary)论文标题NavGPT: 在视觉与语言导航中使用大型语言模型进行显式推理 (NavGPT: Explicit Reasoning in Vision-and-Language Navigation with Large Language Models)核心问题探究大型语言模型 (LLM) 在复杂具身场景&#xff08;特别是视…

(T_T),不小心删掉RabbitMQ配置文件数据库及如何恢复

一、不小心删除 今天是2025年5月15日&#xff0c;非常沉重的一天&#xff0c;就在今早8点左右的时候我打算继续做我的毕业设计&#xff0c;由于开机的过程十分缓慢&#xff08;之前没有&#xff09;&#xff0c;加上刚开机电脑有卡死的迹象&#xff0c;再加上昨天晚上关电脑前…

TDengine 安全部署配置建议

背景 TDengine 的分布式、多组件特性导致 TDengine 的安全配置是生产系统中比较关注的问题。本文档旨在对 TDengine 各组件及在不同部署方式下的安全问题进行说明&#xff0c;并提供部署和配置建议&#xff0c;为用户的数据安全提供支持。 安全配置涉及组件 TDengine 包含多…

蓝桥杯框架-LED蜂鸣器继电器

蓝桥杯框架-LED蜂鸣器继电器 一&#xff0c;新建工程文件二&#xff0c;配置keil三&#xff0c;完善框架 一&#xff0c;新建工程文件 在桌面上新建一个文件夹&#xff1a;用于存放所有工程文件 在文件夹中再建立一个文件夹DEMO_01&#xff1a;这是我们的第一个工程文件 在第…

uniapp-商城-64-后台 商品列表(商品修改---页面跳转,深浅copy应用,递归调用等)

完成了商品的添加和展示&#xff0c;下面的文字将继续进行商品页面的处理&#xff0c;主要为商品信息的修改的页面以及后天逻辑的处理。 本文主要介绍了商品信息修改页面的实现过程。首先&#xff0c;页面布局包括编辑和删除功能&#xff0c;未来还可添加上架和下架按钮。通过c…

Dify的大语言模型(LLM) AI 应用开发平台-本地部署

前言 今天闲着&#xff0c;捣鼓一下 Dify 这个开源平台&#xff0c;在 mac 系统上&#xff0c;本地部署并运行 Dify 平台&#xff0c;下面记录个人在本地部署Dify 的过程。 Dify是什么&#xff1f; Dify是一个开源的大语言模型&#xff08;LLM&#xff09;应用开发平台&#…

使用教程:8x16模拟开关阵列可级联XY脚双向导通自动化接线

以下通过点亮LED进行基本使用流程演示&#xff0c;实际可以连接复杂外设&#xff08;SPI、CAN、ADC等&#xff09; 单模块使用 RX、TX、5V和GND接到串口模块&#xff1b;X5接5V&#xff1b;Y2接LED;LED-接GND 串口模块插上电脑后&#xff0c;LED没有亮&#xff1b;因为此时模…

8 种快速易用的Python Matplotlib数据可视化方法

你是否曾经面对一堆复杂的数据&#xff0c;却不知道如何让它们变得直观易懂&#xff1f;别慌&#xff0c;Python 的 Matplotlib 库是你数据可视化的最佳伙伴&#xff01;它简单易用、功能强大&#xff0c;能将枯燥的数字变成引人入胜的图表。无论是学生、数据分析师还是程序员&…