深入学习 Redis - 基于 Jedis 通过 Java 客户端操作 Redis
目录
一、Jedis 依赖
二、Java 客户端操控 redis
2.1、准备工作(ssh 隧道)
2.2、概要
2.2、string
2.3、hash
2.4、list
2.5、set
2.5、zset
一、Jedis 依赖
自己去 中央仓库 上面找.
二、Java 客户端操控 redis
2.1、准备工作(ssh 隧道)
想要连接上云服务器上的 redis ,就需要开放 6379 端口,但是一旦开饭这个端口是十分危险的!!!(不出 3 天,你的服务器就会被黑客攻击)
我们有两种办法
- 将 java 程序打包成 jar 包,放到 linux 服务器上执行(过于麻烦,不推荐);
- 匹配 ssh 端口转发,把云服务器的 redis 端口,映射到本地主机(推荐).
因此我们来讲讲第二种办法~
我们在本地 windows 主机上,使用 xshell 连接远程服务器,主要就是通过 ssh 协议(默认走 22 端口)实现通信的,他有一个很重要的特性,就是支持端口转发! 我们只需要配置 ssh 程序监听本地端口,映射到云服务器的端口,就可以实现通过 windows 主机,访问云服务器的 6379 端口.
具体的,我们只需要再 xshell 上配置连接信息即可:

Ps:当配置了端口准发后,一定要断开之前的连接,重新连接才能生效.
2.2、概要
基于前面对 redis 指令的学习,这里使用 jedis 这个库来操控 redis。
Ps:一个优秀的库,一定是非常容易上手的,因此接下来介绍的操作,不会覆盖到所有指令,会挑选出一些重要 / 代表性的命令,来进行演示~
使用 jedis 操控 redis 类似于 JDBC ,我们可以先创建 连接池,然后拿到连接,执行完操作后再释放连接,因此后续讲的所有操作,都是基于以下代码:
public static void main(String[] args) {//这里只是开发阶段这么写,要是部署到云服务器上,就需要根据实际情况来配置这个的 ip 和端口号.JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");//使用 try,出代码块时自动释放 jedis 连接(不是关闭,而是放回到连接池中)try(Jedis jedis = jedisPool.getResource()) {// 测试场景:// ......test1(jedis);}}
2.2、string
public class JedisString {private static void test1(Jedis jedis) {System.out.println("------------------------------------");System.out.println("mget 和 mset");//这里为了演示效果,使用之前会先释放所有 keyjedis.flushAll();jedis.mset("key1", "value1", "key2", "value2", "key3", "value3");List<String> values = jedis.mget("key1", "key2", "key3", "key100");System.out.println(values);}private static void test2(Jedis jedis) {System.out.println("------------------------------------");System.out.println("getrange 和 setrange");jedis.flushAll();jedis.set("key", "helloworld");String value1 = jedis.getrange("key", 2, 5);System.out.println("value1: " + value1);jedis.setrange("key", 2, "cykkk");String value2 = jedis.get("key");System.out.println("value2: " + value2);}private static void test3(Jedis jedis) {System.out.println("------------------------------------");System.out.println("append");jedis.flushAll();jedis.set("key1", "hello");jedis.append("key1", " world");String value1 = jedis.get("key1");System.out.println("value1: " + value1);}private static void test4(Jedis jedis) {System.out.println("------------------------------------");System.out.println("incr 和 decr");jedis.flushAll();jedis.set("key1", "10");jedis.incr("key1");System.out.println("inct key1: " + jedis.get("key1"));jedis.set("key1", "10");jedis.decr("key1");System.out.println("decr key2: " + jedis.get("key1"));}public static void main(String[] args) {//这里只是开发阶段这么写,要是部署到云服务器上,就需要根据实际情况来配置这个的 ip 和端口号.JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");//使用 try,出代码块时自动释放 jedis 连接(不是关闭,而是放回到连接池中)try(Jedis jedis = jedisPool.getResource()) {// 测试场景:// ......test1(jedis);test2(jedis);test3(jedis);test4(jedis);}}}

2.3、hash
public class JedisHash {private static void test1(Jedis jedis) {System.out.println("-----------------------------------");System.out.println("hset 和 hget");jedis.flushAll();jedis.hset("key1", "f1", "v1");String result = jedis.hget("key1", "f1");System.out.println("result: " + result);Map<String, String> map = new HashMap<>();map.put("f1", "v1");map.put("f2", "v2");map.put("f3", "v3");jedis.hset("key2", map);System.out.println("key2: " + jedis.hgetAll("key2"));}private static void test2(Jedis jedis) {System.out.println("-----------------------------------");System.out.println("hexists");jedis.flushAll();jedis.hset("key1", "f1", "v1");boolean result1 = jedis.hexists("key1", "f1");boolean result2 = jedis.hexists("key1", "f2");System.out.println("result1: " + result1);System.out.println("result2: " + result2);}private static void test3(Jedis jedis) {System.out.println("-----------------------------------");System.out.println("hdel");jedis.flushAll();jedis.hset("key1", "f1", "v1");jedis.hset("key1", "f2", "v2");jedis.hset("key1", "f3", "v3");long result = jedis.hdel("key1", "f1");System.out.println("result: " + result);System.out.println("f1: " + jedis.hget("key1", "f1"));System.out.println("f2: " + jedis.hget("key1", "f2"));System.out.println("f3: " + jedis.hget("key1", "f3"));}private static void test4(Jedis jedis) {System.out.println("-----------------------------------");System.out.println("hkeys 和 hvals");jedis.flushAll();Map<String, String> map = new HashMap<>();map.put("f1", "v1");map.put("f2", "v2");map.put("f3", "v3");jedis.hmset("key1", map);Set<String> set = jedis.hkeys("key1");List<String> list = jedis.hvals("key1");System.out.println("key1 -> field:" + set);System.out.println("key2 -> value:" + list);}public static void main(String[] args) {JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");try(Jedis jedis = jedisPool.getResource()) {test1(jedis);test2(jedis);test3(jedis);test4(jedis);}}}

2.4、list
public class JedisList {private static void test1(Jedis jedis) {System.out.println("---------------------------");System.out.println("lpush 和 lrange");jedis.flushAll();jedis.lpush("key1", "value1", "value2", "value3");List<String> result = jedis.lrange("key1", 0 ,-1);System.out.println(result);}private static void test2(Jedis jedis) {System.out.println("---------------------------");System.out.println("rpush");jedis.flushAll();jedis.rpush("key1", "value1", "value2", "value3");List<String> result = jedis.lrange("key1", 0 ,-1);System.out.println(result);}private static void test3(Jedis jedis) throws InterruptedException {System.out.println("---------------------------");System.out.println("blpop");jedis.flushAll();List<String> result = jedis.blpop(100, "key1");System.out.println(result.get(0));System.out.println(result.get(1));}public static void main(String[] args) throws InterruptedException {JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");try(Jedis jedis = jedisPool.getResource()) {test1(jedis);test2(jedis);test3(jedis);}}}

2.5、set
public class JedisSet {private static void test1(Jedis jedis) {System.out.println("-------------------------");System.out.println("sadd 和 smembers");jedis.flushAll();jedis.sadd("key1", "m1", "m2", "m3");Set<String> set = jedis.smembers("key1");System.out.println(set);}private static void test2(Jedis jedis) {System.out.println("-------------------------");System.out.println("sismember");jedis.flushAll();jedis.sadd("key1", "m1", "m2", "m3");boolean result1 = jedis.sismember("key1", "m2");boolean result2 = jedis.sismember("key1", "m100");System.out.println("result1: " + result1);System.out.println("result2: " + result2);}private static void test3(Jedis jedis) {System.out.println("-------------------------");System.out.println("scard");jedis.flushAll();jedis.sadd("key1", "m1", "m1", "m3");long result = jedis.scard("key1");System.out.println("result: " + result);}private static void test4(Jedis jedis) {System.out.println("-------------------------");System.out.println("spop");jedis.flushAll();jedis.sadd("key1", "m1", "m1", "m3");String result = jedis.spop("key1");System.out.println("result: " + result);}private static void test5(Jedis jedis) {System.out.println("-------------------------");System.out.println("sinter");jedis.flushAll();jedis.sadd("key1", "m1", "m2", "m3");jedis.sadd("key2", "m2", "m3", "m4");Set<String> set = jedis.sinter("key1", "key2");System.out.println(set);}private static void test6(Jedis jedis) {System.out.println("-------------------------");System.out.println("sinter");jedis.flushAll();jedis.sadd("key1", "m1", "m2", "m3");jedis.sadd("key2", "m2", "m3", "m4");long len = jedis.sinterstore("keyStore", "key1", "key2");System.out.println("len: " + len);System.out.println("keyStore: " + jedis.smembers("keyStore"));}public static void main(String[] args) {JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");try(Jedis jedis = jedisPool.getResource()) {test1(jedis);test2(jedis);test3(jedis);test4(jedis);test5(jedis);test6(jedis);}}}

2.5、zset
public class JedisZset {private static void test1(Jedis jedis) {System.out.println("-----------------------------");System.out.println("zadd 和 zrange");jedis.flushAll();jedis.zadd("key1", 10, "aaa");Map<String, Double> map = new HashMap<>();map.put("bbb", 20.0);map.put("ccc", 30.0);jedis.zadd("key1", map);List<String> list = jedis.zrange("key1", 0 ,-1);System.out.println(list);}private static void test2(Jedis jedis) {System.out.println("-----------------------------");System.out.println("zcard");jedis.flushAll();jedis.zadd("key1", 10, "aaa");jedis.zadd("key1", 20, "bbb");jedis.zadd("key1", 30, "ccc");long len = jedis.zcard("key1");System.out.println(len);}private static void test3(Jedis jedis) {System.out.println("-----------------------------");System.out.println("zrem");jedis.flushAll();jedis.zadd("key1", 10, "aaa");jedis.zadd("key1", 20, "bbb");jedis.zadd("key1", 30, "ccc");long count = jedis.zrem("key1", "aaa", "bbb", "xxx");System.out.println(count);}private static void test4(Jedis jedis) {System.out.println("-----------------------------");System.out.println("zscore 和 zrank");jedis.flushAll();jedis.zadd("key1", 10, "aaa");jedis.zadd("key1", 20, "bbb");jedis.zadd("key1", 30, "ccc");Double score = jedis.zscore("key1", "bbb");Long rank = jedis.zrank("key1", "bbb");System.out.println("score: " + score);System.out.println("rank: " + rank);}public static void main(String[] args) {JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");try(Jedis jedis = jedisPool.getResource()) {test1(jedis);test2(jedis);test3(jedis);test4(jedis);}}}

相关文章:
深入学习 Redis - 基于 Jedis 通过 Java 客户端操作 Redis
目录 一、Jedis 依赖 二、Java 客户端操控 redis 2.1、准备工作(ssh 隧道) 2.2、概要 2.2、string 2.3、hash 2.4、list 2.5、set 2.5、zset 一、Jedis 依赖 自己去 中央仓库 上面找. 二、Java 客户端操控 redis 2.1、准备工作(ssh 隧…...
019 - STM32学习笔记 - Fatfs文件系统(一) - FatFs文件系统初识
019 - STM32学习笔记 - Fatfs文件系统(一) - FatFs文件系统初识 最近工作比较忙,没时间摸鱼学习,抽空学点就整理一点笔记。 1、文件系统 在之前学习Flash的时候,可以调用SPI_FLASH_BufferWrite函数,将数…...
Selenium开发环境搭建
1.下载Python https://www.python.org/downloads/ 下载下来选择自己创建的路径进行安装,然后配置环境变量 cmd命令框查看 2.安装selenium cmd命令框输入: pip install selenium3.下载pycharm https://www.jetbrains.com/pycharm/download/#sec…...
解决 The ‘more_itertools‘ package is required
在使用爬虫获取维基百科数据时看到了一个很好的项目: 博客:https://blog.51cto.com/u_15919249/5962100 项目地址:https://github.com/wjn1996/scrapy_for_zh_wiki 但在使用过程中遇到若干问题,记录一下: The more_it…...
手把手教你在云环境炼丹(部署Stable Diffusion WebUI)
前几天写了一篇《手把手教你在本机安装Stable Diffusion秋叶整合包》的文章,有些同学反映对硬件的要求太高,显卡太TM贵了。今天我再分享一个云服务器炼丹的方法,方便大家快速入门上手,这个云服务不需要特殊网络设置,能…...
pytorch-gpu 极简安装
1、进入pytoch官网:PyTorch 找到pytorch-gpu版本,看到CUDA11.8、11.7、CPU,这里我选择安装CUDA11.8 2、下载CUDA Toolkit:CUDA Toolkit 11.8 Downloads | NVIDIA Developer 3、下载CUDANN:cuDNN Download | NVIDIA D…...
有道云笔记迁移到自建服务器Joplin
当前有道云笔记各项业务开始逐渐向会员靠拢,如一开始不受限的多端同步现在非会员限制成了两个终端,估计以后会有越来越多的免费内容会逐渐的向会员转移,因此博主开始考虑自建服务器来搞一个云笔记服务端。 因博主已有黑群晖,并且有…...
qt源码--事件系统之QAbstractEventDispatcher
1、QAbstractEventDispatcher内容较少,其主要是定义了一些注册接口,如定时器事件、socket事件、注册本地事件、自定义事件等等。其源码如下: 其主要定义了大量的纯虚函数,具体的实现会根据不同的系统平台,实现对应的方…...
深入了解Python中的os.path.join函数
深入了解Python中的os.path.join函数 1. 引言 在Python中,处理文件和目录路径是常见的任务。为了简化路径的拼接和操作,Python提供了os.path模块,其中的join函数是一个非常重要且常用的函数。本文将深入介绍os.path.join函数的用法和注意事…...
Node.js:execSync执行一个shell命令
默认输出是Buffer对象 const { execSync } require(child_process)let out execSync("echo hi") console.log(out); // <Buffer 68 69 0a>需要转为字符串 const { execSync } require(child_process)let out execSync("echo hi") console.log(…...
《入门级-Cocos2d 4.0塔防游戏开发》---第二课:游戏加载界面开发
目录 一、开发环境介绍 二、开发内容 2.1 修改窗口的大小。 2.2 添加加载场景相关代码 2.3 添加资源 三、显示效果 四、知识点 4.1 Sprite 4.2 定时器 一、开发环境介绍 操作系统:UOS1060专业版本。 cocos2dx:版本 环境搭建教程: 统信UOS下配…...
打卡力扣题目十二
#左耳听风 ARST 打卡活动重启# 目录 一、问题 二、解题方法一 三、解题方法二 关于 ARTS 的释义 —— 每周完成一个 ARTS: ● Algorithm: 每周至少做一个 LeetCode 的算法题 ● Review: 阅读并点评至少一篇英文技术文章 ● Tips: 学习至少一个技术技巧 ● Share: …...
QT服务器练习
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//给服务器指针实例化空间server new QTcpServer(this); }Widget::~Widget() {delete ui; }//启动服务器按钮对…...
Vcenter 创建 虚拟机配置 Thin Provision 模式 disk
介绍 在vCenter中选择虚拟磁盘格式通常也取决于您的需求和使用情况。 vSphere支持多种虚拟磁盘格式,以下是一些常见的格式: Thick Provision Lazy Zeroed:这是vSphere中的默认格式。它会预分配虚拟磁盘所需的存储空间,但只有在虚…...
初识mysql数据库之事务的概念及操作
目录 一、数据库多客户端访问问题 1. 数据库的CURD无限制带来的问题 2. 如何解决CURD导致的问题 二、事务的概念 1. 什么是事务 2. 事务的四个属性 3. mysql对事务的管理 4. 为什么会有事务 5. 事务的版本支持 三、事务的操作 1. 事务提交方式 2. 事务操作的准备工…...
MPL-2.0(Mozilla Public License 2.0)
MPL-2.0(Mozilla Public License 2.0)是一种开源软件许可证,由 Mozilla 组织于2012年发布,用于授权开源项目。MPL-2.0 是 MPL-1.1 许可证的继任版本,旨在更好地适应现代开源软件的发展和使用。 MPL-2.0 许可证的主要特…...
Qt+OpenCV+VTK在VS2017中配置路径
QtOpenCVVTK在VS2017中配置路径 《Qt环境配置》《OpenCV环境配置》《VTK环境配置》 《Qt环境配置》 包含目录: D:\Qt\Qt5.12.11\5.12.11\msvc2017_64\include D:\Qt\Qt5.12.11\5.12.11\msvc2017_64\include\QtWidgets D:\Qt\Qt5.12.11\5.12.11\msvc2017_64\include…...
线性代数(应用篇):第五章:特征值与特征向量、第六章:二次型
文章目录 第5章 特征值与特征向量、相似矩阵(一) 特征值与特征向量1.定义2.性质3.求解(1)具体型矩阵试根法、多项式带余除法:三阶多项式分解因式 (2)抽象型矩阵 (二) 相似1.矩阵相似(1)定义(2)性质 2.相似对角化(1)定义(2)相似对角化的条件(n阶矩阵A可相…...
Java8实战-总结9
Java8实战-总结9 Lambda表达式把Lambda付诸实践:环绕执行模式第1步:记得行为参数化第2步:使用函数式接口来传递行为第3步:执行一个行为第4步:传递Lambda 使用函数式接口PredicateConsumerFunction原始类型特化 Lambda表…...
大数据开发面试必问:Hive调优技巧系列一
Hive必问调优 Hive 调优拆解:Hive SQL 几乎是每一位互联网分析师的必备技能,相信很多小伙伴都有被面试官问到 Hive 优化问题的经历。所以掌握扎实的 HQL 基础尤为重要,hive优化也是小伙伴应该掌握的一项技能,本篇文章具体从hive建表优化、HQ…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
aardio 自动识别验证码输入
技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”,于是尝试整合图像识别与网页自动化技术,完成了这套模拟登录流程。核心思路是:截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...
[特殊字符] 手撸 Redis 互斥锁那些坑
📖 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作,想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁,也顺便跟 Redisson 的 RLock 机制对比了下,记录一波,别踩我踩过…...
UE5 音效系统
一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类,将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix,将上述三个类翻入其中,通过它管理每个音乐…...
SQL注入篇-sqlmap的配置和使用
在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap,但是由于很多朋友看不了解命令行格式,所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习,链接:https://wwhc.lanzoue.com/ifJY32ybh6vc…...
