当前位置: 首页 > article >正文

redis--redisJava客户端:Jedis详解

在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;@BeforeEachvoid setUp(){//1.建立连接jedis = new Jedis("127.0.0.1",6379);//2.选择数据库jedis.select(0);}@Testvoid testString(){//存入数据String result = jedis.set("name", "lyc");System.out.println("result = "+result);//获取数据String name = jedis.get("name");System.out.println("name = "+name);}
 
  • 使用Jedis,方法名与Redis命令一致

 @Testvoid testList(){//存入数据jedis.lpush("mylist","1","2","3");for (String s : jedis.lrange("mylist", 0, -1)) {System.out.println("s = "+s);}}@Testvoid 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

  • 释放资源

 @AfterEachvoid 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对象改为使用连接池

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

再次测试

image-20250520214217640

测试成功。

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

希望对大家有所帮助

相关文章:

redis--redisJava客户端:Jedis详解

在Redis官网中提供了各种语言的客户端&#xff0c;地址&#xff1a; https://redis.io/docs/latest/develop/clients/ Jedis 以Redis命令做方法名称&#xff0c;学习成本低&#xff0c;简单实用&#xff0c;但是对于Jedis实例是线程不安全的&#xff08;即创建一个Jedis实例&a…...

[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;挪到了左…...

TypeScript 泛型讲解

如果说 TypeScript 是一门对类型进行编程的语言&#xff0c;那么泛型就是这门语言里的&#xff08;函数&#xff09;参数。本章&#xff0c;我将会从多角度讲解 TypeScript 中无处不在的泛型&#xff0c;以及它在类型别名、对象类型、函数与 Class 中的使用方式。 一、泛型的核…...

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

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

面试相关的知识点

1 vllm 1.1常用概念 1 vllm&#xff1a;是一种大模型推理的框架&#xff0c;使用了张量并行原理&#xff0c;把大型矩阵分割成低秩矩阵&#xff0c;分散到不同的GPU上运行。 2 模型推理与训练&#xff1a;模型训练是指利用pytorch进行对大模型进行预训练。 模型推理是指用训…...

如何用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 …...

游戏开发实战(三):Python复刻「崩坏星穹铁道」嗷呜嗷呜事务所---源码级解析该小游戏背后的算法与设计模式【纯原创】

文章目录 奇美拉类摸鱼仔&#xff0c;负能量&#xff0c;真老实&#xff0c;小坏蛋&#xff0c;压力怪治愈师小团体画饼王平凡王坏脾气抗压包请假狂请假王内卷王受气包跑路侠看乐子背锅侠抢功劳急先锋说怪话帮倒忙小夸夸工作狂职业经理严酷恶魔职场清流 开始工作吧小奇美拉没想…...

使用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;也是一个专门为支持开源项目而生的非盈利性…...

LLM驱动下的软件工程再造:驾驭调试、测试与工程化管理的智能新范式

摘要: 大语言模型(LLM)驱动的软件开发正以前所未有的力量重塑整个行业,从以人为中心的编码模式迅速转向意图驱动和AI编排的智能生成。这场变革带来了生产力的指数级飞跃,但也对传统软件工程中调试、测试和代码工程化管理的核心支柱发起了深刻挑战。本文将剖析这些根本性转…...

大语言模型与人工智能:技术演进、生态重构与未来挑战

目录 技术演进:从专用AI到通用智能的跃迁核心能力:LLM如何重构AI技术栈应用场景:垂直领域的技术革命生态关系:LLM与AI技术矩阵的协同演进挑战局限:智能天花板与伦理困境未来趋势:从语言理解到世界模型1. 技术演进:从专用AI到通用智能的跃迁 1.1 三次技术浪潮的跨越 #me…...

SpringSecurity授权、认证

引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifactI…...

蓝桥杯19682 完全背包

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

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

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

leetcode 3355. 零数组变换 I 中等

给定一个长度为 n 的整数数组 nums 和一个二维数组 queries&#xff0c;其中 queries[i] [li, ri]。 对于每个查询 queries[i]&#xff1a; 在 nums 的下标范围 [li, ri] 内选择一个下标 子集。将选中的每个下标对应的元素值减 1。 零数组 是指所有元素都等于 0 的数组。 …...

【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;再加上昨天晚上关电脑前…...

创建react工程并集成tailwindcss

1. 创建工程 npm create vite admin --template react 2.集成tailwndcss 打开官网跟着操作一下就行。 Installing Tailwind CSS with Vite - Tailwind CSS...

TDengine 安全部署配置建议

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

Axure全链路交互设计:快速提升实现能力(基础交互+高级交互)

想让你的设计稿像真实App一样丝滑&#xff1f;本专栏带你玩转Axure交互&#xff0c;从选中高亮到动态面板骚操作&#xff0c;再到中继器表单花式交互&#xff0c;全程动图教学&#xff0c;一看就会&#xff01; 本专栏系统讲解多个核心交互效果&#xff0c;是你的Axure交互急救…...

为什么wifi有信号却连接不上?

WiFi有信号&#xff0c;无法连接WiFi网络的可能原因及解决方法&#xff1a; 1.长时间使用路由器&#xff0c;路由器可能会出现假死现象。重启无线路由器即可。 2.认证类型不合适。尝试更改路由器的认证类型&#xff0c;选择安全的 “WPA2-PSK” 类型模式要好&#xff0c;下面…...

蓝桥杯框架-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;因为此时模…...