【Redis学习笔记04】Jedis客户端(上)

Java客户端操作Redis

Java生态丰富,自定义的客户端非常多,常见的有Jedis、Lettuce、以及Spring整合后的RedisTemplate,但是对于初学者而言,从Jedis开始入门学习是非常容易上手的,因为Jedis中的API与原生Redis命令高度一致。

1. 引入Jedis依赖

此处引入如下依赖:

  • Jedis:Java操作Redis客户端
  • Junit:方便编写单元测试
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.4.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
</dependency>

2. 配置Xshell端口转发

  1. 操作步骤:1. 打开Xshell点击属性 => 2. 配置SSH隧道 => 3. 配置如下端口转发内容

image.png

  1. 打开windows cmd程序输入:netstat -ano | findstr 8888如果观察如下

image.png

  1. 确保redis.conf配置中设置protect-mode为no以及bind为0.0.0.0

3. 编写Demo

使用Jedis的步骤如下:

  1. 创建JedisPool连接池对象(配置redis服务器所在IP地址+端口号)
  2. 从JedisPool连接池中取出连接对象,并操作其中提供的API方法
  3. 解析响应内容
/*** 测试Redis连通性* @author 米饭好好吃*/
@Test
public void testPing() {// 1. 创建JedisPoolJedisPool pool = new JedisPool("tcp://127.0.0.1:8888");// 2. 获取连接对象try(Jedis jedis = pool.getResource();) {// 设置密码(如果有)jedis.auth("xxxxxx");// 3. 调用API-pingString pong = jedis.ping();// 4. 解析响应结果System.out.println(pong);}
}

4. 测试通用命令

  1. 测试SET、GET命令:
    :::success
    注意:此处GET、SET命令是针对string类型的,此处测试通用命令需要借助SET、GET命令
    :::
/*** 测试通用命令* @author 米饭好好吃*/
public class TestCommon {// redis连接池对象private JedisPool pool;@Beforepublic void init() {pool = new JedisPool("tcp://127.0.0.1:6379");}/*** 测试SET、GET命令*/@Testpublic void testGETAndSET() {// 1. 获取连接对象try(Jedis jedis = pool.getResource();) {// 2. 配置密码(如果有的话)jedis.auth("xxxxxx");// 3. 清空数据库jedis.flushDB();// 4. 测试SET命令jedis.set("k1", "hello");// 5. 测试GET命令String resp = jedis.get("k1");System.out.println("k1: " + resp);// 6. 测试SET 选项NX命令SetParams params = new SetParams();params.nx(); // 不存在才新增jedis.set("k1", "222", params);resp = jedis.get("k1");System.out.println("k1: " + resp);}}
}
  1. 测试EXISTS命令:

/*** 测试EXISTS命令* @author 米饭好好吃*/
@Test
public void testEXISTS() {// 1. 获取到redis连接对象try(Jedis jedis = pool.getResource();) {// 2. 配置密码(如果有的话)jedis.auth("xxxxxx");// 3. 清空数据库jedis.flushDB();// 4. 测试EXISTS命令jedis.set("k1", "111");boolean exists = jedis.exists("k1");System.out.println("k1: " + exists);jedis.del("k1");exists = jedis.exists("k1");System.out.println("k1: " + exists);}
}
  1. 测试DEL命令:
/*** 测试DEL命令* @author 米饭好好吃*/
@Test
public void testDEL() {// 1. 创建redis连接对象try(Jedis jedis = pool.getResource();) {// 2. 配置密码(如果有的话)jedis.auth("xxxxxx");// 3. 清空数据库jedis.flushDB();// 4. 测试del命令jedis.set("k1", "111");jedis.set("k2", "222");jedis.set("k3", "333");long delCount = jedis.del("k1", "k2", "k3");System.out.println("delCount: " + delCount);String resp = jedis.get("k1");System.out.println("k1: " + resp);}
}

注意:DEL命令中参数列表为可边长参数,可以同时删除多个key,并且返回值为删除成功的个数,这与命令行中DEL命令一致

  1. 测试KEYS命令:
/*** 测试KEYS命令* @author 米饭好好吃*/
@Test
public void testKEYS() {// 1. 获取redis连接对象try(Jedis jedis = pool.getResource();) {// 2. 配置密码(如果有的话)jedis.auth("xxxxxx");// 3. 清空数据库jedis.flushDB();// 4. 测试KEYS命令jedis.set("k1", "111");jedis.set("k2", "222");jedis.set("k3", "333");Set<String> keys = jedis.keys("*");System.out.println("keys: " + keys);}
}

注意:KEYS命令返回的是一个Java当中的Set类型,这是因为redis中的key都是不允许重复且对于顺序没有要求的,KEYS方法可以传递一个pattern参数,即KEYS命令后紧跟的匹配模式

  1. 测试EXPIRE、TTL命令:
/*** 测试EXPIRE命令* @author 米饭好好吃*/
@Test
public void testEXPIRE() {// 1. 获取redis连接对象try(Jedis jedis = pool.getResource();) {// 2. 设置密码(如果有的话)jedis.auth("xxxxxx");// 3. 清空数据库jedis.flushDB();// 4. 测试expire、ttljedis.set("k1", "111");jedis.expire("k1", 10);long ttl = jedis.ttl("k1");System.out.println("ttl: " + ttl);}
}
  1. 测试TYPE命令:
/*** 测试TYPE命令* @author 米饭好好吃*/
@Test
public void testTYPE() {// 1. 获取redis连接对象try(Jedis jedis = pool.getResource();) {// 2. 设置密码(如果有的话)jedis.auth("xxxxxx");// 3. 清空数据库jedis.flushDB();// 4. 测试type命令jedis.hset("k1", "f1", "v1");jedis.lpush("k2", "11", "22", "33");jedis.sadd("k3", "abc");System.out.println("k1: " + jedis.type("k1"));System.out.println("k2: " + jedis.type("k2"));System.out.println("k3: " + jedis.type("k3"));}
}

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

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

相关文章

Android Bugreport分析工具:ChkBugReport教程

安装&#xff1a; 如果下载地址过期请看原仓库地址的wiki&#xff0c;或许会有更新&#xff1a;https://github.com/sonyxperiadev/ChkBugReport/wiki 提前下载好如下文件&#xff1a; ​​​​​​http://sonyxperiadev.github.io/ChkBugReport/download/chkbugreport (Lau…

Python中的上下文管理器(contextlib)模块

Python中的contextlib模块提供了一些用于创建和管理上下文管理器&#xff08;context managers&#xff09;的工具。上下文管理器是实现了__enter__()和__exit__()方法的对象&#xff0c;它们通常用于确保在代码块执行前后执行某些操作&#xff0c;比如资源获取与释放、设置和重…

一分钟有60秒,这个有趣的原因你知道吗?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

string类的模拟实现的一些改进

上回我们完成了string类的模拟实现&#xff0c;不过之前写的传统写法本篇&#xff0c;我们将要对其进行一些改进&#xff0c;写成参考的是现代写法&#xff0c;这样写可以提高可读性。 上回我们写好的string类 //string.h #pragma once#define _CRT_SECURE_NO_WARNINGS 1 #p…

常见汇编指令

下面是一些包含汇编指令 MOV、PUSH、POP、LEA、LDS、ADD、ADC、INC、SUB、SBB、DEC、CMP、MUL、DIV、AND、OR、XOR、NOT、TEST、SHL、SAL、SHR、SAR、ROL、ROR、RCL、RCR、LODS、MOVS 的例题。这些例题展示了每条指令的用法及其作用。 1. MOV 指令 MOV AX, BX ; 将寄存器 B…

github stylesmile fastboot介绍

**Fastboot是一个极速的Java Web框架&#xff0c;旨在提供高效的启动速度和低内存占用**。 Fastboot的设计理念是为了让Java应用能够以极短的时间启动&#xff0c;并且占用非常少的内存资源。项目的定位是成为Java领域内最佳的云原生解决方案&#xff0c;为开发者提供一个高效…

像素坐标系与图像坐标系

前言 在数字图像处理中&#xff0c;经常会看到使用 (x, y) 表示图像中的某个像素点。 在一些图像处理库&#xff0c;例如 Pillow 、OpenCV 、Numpy 中也会使用到坐标系处理图像的像素点。 介绍 无论是像素坐标系还是图像坐标系&#xff0c;其原理都是一样的&#xff1a; 以…

[AIGC] BFS算法详解以及实例应用

BFS&#xff08;Breadth-First Search&#xff0c;广度优先搜索&#xff09;是一种用于图的查找算法&#xff0c;可以用来解决许多问题&#xff0c;比如寻找最短路径&#xff0c;检查图是否连通&#xff0c;检查图中是否存在环等。 文章目录 BFS算法的概念BFS算法的步骤BFS示例…

UI学习(二)

UI学习&#xff08;二&#xff09; 文章目录 UI学习&#xff08;二&#xff09;布局子视图手动布局自动布局 导航控制器导航控制器基础导航控制器的切换导航栏工具栏 分栏控制器分栏控制器协议部分的内容UITableView基础部分相关的协议函数高级协议与单元格 多界面传值 布局子视…

C++迈向精通:STL的Deque复现

C迈向精通&#xff1a;STL的Deque复现 最近忙着写一个其他的小玩意&#xff0c;好久没更新博客了&#xff0c;手痒更新一下&#xff1a; 本期来讲一讲C中的STL中的deque的底层实现原理。 deque的地位 STL中的deque的地位很高 主要原因是由于泛型思想和对于其他容器的影响&am…

2024年6月9日 (周日) 叶子游戏新闻

万能嗅探: 实测 网页打开 某视频号、某音、某红薯、某站&#xff0c;可以做到无水印的视频和封面下载功能哦&#xff0c;具体玩法大家自行发挥吧。 《Funko Fusion》发布新预告 20款影视作品齐聚一堂第三人称动作游戏新作《Funko Fusion》今日发布最新实机演示。该游戏融合了整…

Linxu: Dynamic debug 简介

文章目录 1. 前言2. 什么是 Dynamic debug (dyndbg) ?3. Dynamic debug (dyndbg) 的使用3.1 开启 Dynamic debug (dyndbg) 功能3.2 使用 Dynamic debug (dyndbg) 功能 4. Dynamic debug (dyndbg) 的实现4.1 内核接口 dynamic_pr_debug() 的实现4.2 debugfs 导出控制节点 contr…

力扣hot100学习记录(十二)

94. 二叉树的中序遍历 给定一个二叉树的根节点 root&#xff0c;返回它的中序遍历。 题意 给定一个二叉树&#xff0c;返回它的中序遍历 思路 采用递归的思想&#xff0c;只要根节点不为空&#xff0c;则一直递归遍历左子树&#xff0c;然后将根节点的值存入结果&#xff0c;…

AutoCAD Mechanical机械版专业的计算机辅助设计软件安装包下载安装!

AutoCAD机械版作为一款专业的计算机辅助设计软件&#xff0c;不仅具备卓越的二维绘图功能&#xff0c;更是拥有令人瞩目的3D建模工具&#xff0c;为机械设计师们提供了前所未有的创作空间。 在AutoCAD机械版的3D建模环境中&#xff0c;用户可以借助一系列简洁明了的命令&#…

数智融通 创新发展|亚信科技携AntDB、Data OS与隐私计算产品,赋能企业高质量发展

5月21日&#xff0c;亚信科技在云端举办了一场别开生面的研讨会——“数智融通 创新发展”&#xff0c;聚焦企业数智化升级的前沿话题。资深产品经理和技术架构师们面对面深入交流&#xff0c;分享创新成果与实战案例&#xff0c;共同探索企业数智化转型的新路径。 图1&#xf…

网络安全形势与WAF技术分享

我一个朋友的网站&#xff0c;5月份时候被攻击了&#xff0c;然后他找我帮忙看看&#xff0c;我看他的网站、网上查资料&#xff0c;不看不知道&#xff0c;一看吓一跳&#xff0c;最近几年这网络安全形势真是不容乐观&#xff0c;在网上查了一下资料&#xff0c;1、中国信息通…

基础数据结构 -- 栈

1. 简介 堆栈又名栈&#xff08;stack&#xff09;&#xff0c;他是计算机科学中最基础的数据结构之一。可以算是一种受限制的线性结构&#xff0c;&#xff0c;具有后进先出&#xff08;LIFO&#xff0c; Last In First Out&#xff09;的特性。由于此特性&#xff0c;堆栈常用…

在 Zustand 中管理状态能使用类(Class)吗

在 Zustand 中&#xff0c;通常不推荐使用类&#xff08;Class&#xff09;来管理状态&#xff0c;因为 Zustand 的设计理念是基于函数式编程和 React Hooks 的。然而&#xff0c;仍然可以在 Zustand 中间接地使用类&#xff0c;但这并不是 Zustand 的典型用法。 如果确实想要…

(第30天)二叉树阶段总结

目录 1.判断二叉树是否对称或相同统一思路遍历顺序递归和迭代 2.求二叉树的最大深度题目解读递归法逻辑迭代法逻辑 3.求二叉树的最小深度题目解读递归法逻辑遍历法逻辑 4.求二叉树的节点数递归法迭代法 5.判断二叉树是否是平衡二叉树题目解读递归法迭代法 6.求二叉树的所有路径…

OPenCV的重要结构体Mat

一 Mat Mat是什么&#xff1f; Mat有什么好处&#xff1f; class CV_EXPORTS Mat{ public: ... int dims;//维数 int rows,cols;//行列数 uchar *data;//存储数据的指针 int *refcount;//引用计数 ...};二 Mat属性 三 Mat拷贝 1 Mat浅拷贝 Mat A Aimread(file,IMREAD_COLOR) …