Redis ⑨-Jedis | Spring Redis

在这里插入图片描述

Jedis

通过 Jedis 可以连接 Redis 服务器。

通过 Maven 引入 Jedis 依赖。

<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.2.0</version>
</dependency>

连接 Redis 服务器。

这里设置了 ssh 端口转发,将本地的 8888 端口转发到远程的 6379 端口。

还需修改 Redis 的配置文件:

  1. 将 bind 的地址改为 0.0.0.0
  2. 将 protected-mode 改为 no
public class RedisCon {public static void main(String[] args) {try (JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");Jedis jedis = jedisPool.getResource()) {String pong = jedis.ping(); // 测试连接System.out.println(pong);}}
}

通用命令

GET、SET

private static void getAndSet(Jedis jedis) {jedis.flushAll(); // TODO 清除所有键避免影响操作jedis.set("k1", "111");System.out.println(jedis.get("k1"));SetParams params = new SetParams(); // ? 设置额外参数params.ex(1);params.nx();jedis.set("k2", "222", params); // ? 相当于设置了 1s 过期时间和添加方式为 NX
//        Thread.sleep(2000);System.out.println(jedis.get("k2"));
}

输出:

111
222 | null

EXISTS、DEL

private static void existsAndDel(Jedis jedis) {jedis.flushAll();jedis.set("k1", "111");jedis.set("k2", "111");long trueExists = jedis.exists("k1", "k2"); // ? 这里的参数为变长参数System.out.println(trueExists);long successDel = jedis.del("k2", "k3");System.out.println(successDel);
}

输出:

2
1

KEYS

private static void keys(Jedis jedis) {jedis.flushAll();jedis.set("k1", "111");jedis.set("k2", "111");jedis.set("k3", "111");jedis.set("k4", "111");Set<String> keys = jedis.keys("*");System.out.println(keys);
}

输出:

[k1, k2, k3, k4]

EXPIRE、TTL

private static void expiresAndTTL(Jedis jedis) {jedis.flushAll();jedis.set("k1", "111");jedis.expire("k1", 10);long time = jedis.ttl("k1");System.out.println(time);
}

输出:

10

type

private static void type(Jedis jedis) {jedis.flushAll();jedis.set("k1", "111");System.out.println("type:" + jedis.type("k1"));jedis.lpush("k2", "111");System.out.println("type:" + jedis.type("k2"));jedis.hset("k3", "f1", "v1");System.out.println("type:" + jedis.type("k3"));jedis.sadd("k4", "111");System.out.println("type:" + jedis.type("k4"));jedis.zadd("k5", 30, "m1");System.out.println("type:" + jedis.type("k5"));
}

输出:

type:string
type:list
type:hash
type:set
type:zset

string 类型

MSET、MGET

private static void msetAndMget(Jedis jedis) {jedis.flushAll();jedis.mset("k1", "111", "k2", "222", "k3", "你好");List<String> mgetRes = jedis.mget("k1", "k2", "k3", "k4");System.out.println(mgetRes);
}

输出:

[111, 222, 你好, null]

SETRANGE、GETRANGE

private static void setrangeAndGetrange(Jedis jedis) {jedis.flushAll();jedis.set("k1", "hello world");String getrangeRes = jedis.getrange("k1", 6, 10);System.out.println(getrangeRes);jedis.setrange("k1", 6, "redis");System.out.println(jedis.getrange("k1", 0, -1));
}

输出:

world
hello redis

APPEND

private static void append(Jedis jedis) {jedis.flushAll();jedis.set("k1", "It's MyGO");long appendRes = jedis.append("k1", "!!!!!");System.out.println(appendRes);System.out.println(jedis.get("k1"));
}

输出:

10
It's MyGO!!!!!

INCR、DECR

private static void incrAndDecr(Jedis jedis) {jedis.flushAll();jedis.set("k1", "100");long incrRes = jedis.incr("k1");System.out.println(incrRes);jedis.set("k2", "100");long decrRes = jedis.decr("k2");System.out.println(decrRes);
}

输出:

101
99

list 类型

LPUSH、LRANGE

private static void lpushAndLrange(Jedis jedis) {jedis.flushAll();jedis.lpush("k1", "111", "222", "333");List<String> lrangeRes = jedis.lrange("k1", 0, -1);System.out.println(lrangeRes);
}

输出:

[333, 222, 111]

RPUSH

private static void rpush(Jedis jedis) {jedis.flushAll();jedis.rpush("k1", "111", "222", "333");List<String> lrangeRes = jedis.lrange("k1", 0, -1);System.out.println(lrangeRes);
}

输出:

[111, 222, 333]

LPOP、RPOP

private static void lpopAndRpop(Jedis jedis) {jedis.flushAll();jedis.rpush("k1", "111", "222", "333");String res = jedis.lpop("k1");System.out.println(res);res = jedis.lpop("k1");System.out.println(res);res = jedis.lpop("k1");System.out.println(res);res = jedis.lpop("k1");System.out.println(res);jedis.rpush("k1", "111", "222", "333");res = jedis.rpop("k1");System.out.println(res);res = jedis.rpop("k1");System.out.println(res);res = jedis.rpop("k1");System.out.println(res);res = jedis.rpop("k1");System.out.println(res);
}

输出:

333
222
111
null
333
222
111

BLPOP、LLEN

private static void blpopAndLlen(Jedis jedis) {jedis.flushAll();List<String> blpopRes = jedis.blpop(100, "k1");System.out.println("key:" + blpopRes.get(0));System.out.println("val:" + blpopRes.get(1));long len = jedis.llen("k1");System.out.println(len);
}

输出:

key:k1
val:111
2

set 类型

SADD、SMEMBERS、SCARD

private static void saddAndSmembersAndScard(Jedis jedis) {jedis.flushAll();jedis.sadd("k1", "111", "222", "333");Set<String> smembersRes = jedis.smembers("k1");System.out.println(smembersRes);long len = jedis.scard("k1");System.out.println(len);
}

输出:

[111, 222, 333]
3

SISMEMBER、SPOP

private static void sismemberAndSpop(Jedis jedis) {jedis.flushAll();jedis.sadd("k1", "111", "222", "333");boolean sismemberRes = jedis.sismember("k1", "111");System.out.println(sismemberRes);String spopRes = jedis.spop("k1");System.out.println(spopRes);spopRes = jedis.spop("k1");System.out.println(spopRes);spopRes = jedis.spop("k1");System.out.println(spopRes);spopRes = jedis.spop("k1");System.out.println(spopRes);
}

输出:

true
111
222
333
null

SINTER、SINNTERSTORE

private static void sinterAndSinterstore(Jedis jedis) {jedis.flushAll();jedis.sadd("k1", "111", "222", "333");jedis.sadd("k2", "111", "222", "444");Set<String> sinterRes = jedis.sinter("k1", "k2");System.out.println(sinterRes);jedis.sinterstore("k3","k1", "k2");Set<String> res = jedis.smembers("k3");System.out.println(res);
}

输出:

[111, 222]
[111, 222]

hash 类型

HSET、HGET

private static void hsetAndHget(Jedis jedis) {jedis.flushAll();jedis.hset("k1", "f1", "111");Map<String, String> fv = Map.of("f2", "222", "f3", "333");jedis.hset("k1", fv);String hgetRes = jedis.hget("k1", "f2");System.out.println(hgetRes);
}

输出:

222

HEXISTS、HDEL

private static void hexistsAndHdel(Jedis jedis) {jedis.flushAll();Map<String, String> fv = Map.of("f1", "111", "f2", "222", "f3", "333");jedis.hset("k1", fv);boolean hexistsRes = jedis.hexists("k1", "f1");System.out.println(hexistsRes);long hdelRes = jedis.hdel("k1", "f1", "f2", "f3", "f4");System.out.println(hdelRes);
}

输出:

true
3

HKEYS、HVALS

private static void hkeysAndHvals(Jedis jedis) {jedis.flushAll();Map<String, String> fv = Map.of("f1", "111", "f2", "222", "f3", "333");jedis.hset("k1", fv);Set<String> hkeysRes = jedis.hkeys("k1");System.out.println(hkeysRes);List<String> hvalsRes = jedis.hvals("k1");System.out.println(hvalsRes);
}

输出:

[f1, f2, f3]
[111, 222, 333]

HMSET、HMGET

private static void hmsetAndHmget(Jedis jedis) {jedis.flushAll();Map<String, String> fv = Map.of("f1", "111", "f2", "222", "f3", "333");jedis.hmset("k1", fv);List<String> hmgetRes = jedis.hmget("k1", "f1", "f2", "f3", "f4");System.out.println(hmgetRes);
}

输出:

[111, 222, 333, null]

Zset 类型

ZADD、ZRANGE

private static void zaddAndZrange(Jedis jedis) {jedis.flushAll();jedis.zadd("k1", 10.0, "zhangsan");Map<String, Double> ms = Map.of("lishi", 20.0, "wangwu", 30.0);jedis.zadd("k1", ms);List<String> zrangeRes = jedis.zrange("k1", 0, -1);System.out.println(zrangeRes);List<Tuple> membersWithScores = jedis.zrangeWithScores("k1", 0, -1);System.out.println(membersWithScores);System.out.println(membersWithScores.get(0).getElement());System.out.println(membersWithScores.get(0).getScore());
}

输出:

[zhangsan, lishi, wangwu]
[[zhangsan,10.0], [lishi,20.0], [wangwu,30.0]]
zhangsan
10.0

ZCARD、ZREM

private static void zcardAndZrem(Jedis jedis) {jedis.flushAll();Map<String, Double> ms = Map.of("zhangsan", 10.0, "lishi", 20.0, "wangwu", 30.0);jedis.zadd("k1", ms);long zcardRes = jedis.zcard("k1");System.out.println(zcardRes);long zremRes = jedis.zrem("k1", "zhangsan", "lishi", "zhaoliu");System.out.println(zremRes);
}

输出:

3
2

ZSCORE、ZRANK

private static void zscoreAndZrank(Jedis jedis) {jedis.flushAll();Map<String, Double> ms = Map.of("zhangsan", 10.0, "lishi", 20.0, "wangwu", 30.0);jedis.zadd("k1", ms);Double zscoreRes = jedis.zscore("k1", "zhangsan");System.out.println(zscoreRes);Long zrankRes = jedis.zrank("k1", "lishi");System.out.println(zrankRes);
}

输出:

10.0
1

Spring Boot 集成 Redis

在创建 spring-boot 项目时,选择 Redis 依赖。
在这里插入图片描述
在 application.yml 中配置 Redis 连接信息。

这里配置了端口转发,正常输入服务器的公网 IP 地址和 6379 端口即可。

spring:data:redis:port: 8888host: 127.0.0.1

string 类型

@RestController
public class StringController {@AutowiredStringRedisTemplate redisTemplate;@GetMapping("/string")public String string() {// TODO 先清除数据库redisTemplate.execute((RedisConnection connection) -> {connection.flushAll();return null;});redisTemplate.opsForValue().set("k1", "111");Map<String, String> kv = Map.of("k2", "222", "k3", "333");redisTemplate.opsForValue().multiSet(kv);return redisTemplate.opsForValue().get("k1");}
}

输出:

111

list 类型

@RestController
public class ListController {@AutowiredStringRedisTemplate redisTemplate;@GetMapping("/list")public List<String> list() {redisTemplate.execute((RedisConnection connection) -> {connection.flushAll();return null;});redisTemplate.opsForList().leftPush("k1", "111");redisTemplate.opsForList().leftPushAll("k1", "222", "333", "444");redisTemplate.opsForList().leftPop("k1");return redisTemplate.opsForList().range("k1", 0, -1);}
}

输出:

["333","222","111"
]

set 类型

@RestController
public class SetController {@AutowiredStringRedisTemplate redisTemplate;@GetMapping("/set")public Set<String> set() {redisTemplate.execute((RedisConnection connection) -> {connection.flushAll();return null;});redisTemplate.opsForSet().add("k1", "111", "222", "333", "444");Long size = redisTemplate.opsForSet().size("k1");System.out.println("size:" + size);Boolean isMember = redisTemplate.opsForSet().isMember("k1", "222");System.out.println("isMember:" + isMember);Long remove = redisTemplate.opsForSet().remove("k1", "444");System.out.println("remove:" + remove);return redisTemplate.opsForSet().members("k1");}
}

输出:

size:3
isMember:true
remove:1
["111","222","333"
]

hash 类型

@RestController
public class HashController {@AutowiredStringRedisTemplate redisTemplate;@GetMapping("/hash")public Map<Object, Object> hash() {redisTemplate.execute((RedisConnection connection) -> {connection.flushAll();return null;});redisTemplate.opsForHash().put("k1", "f1", "v1");Map<String, String> fv = Map.of("f2", "v2", "f3", "v3", "f4", "v4");redisTemplate.opsForHash().putAll("k1", fv);Long size = redisTemplate.opsForHash().size("k1");System.out.println("size:" + size);Boolean hasKey = redisTemplate.opsForHash().hasKey("k1", "f1");System.out.println("hasKey:" + hasKey);Long delete = redisTemplate.opsForHash().delete("k1", "f4");System.out.println("delete:" + delete);return redisTemplate.opsForHash().entries("k1");}
}

输出:

size:4
hasKey:true
delete:1
{"f1": "v1","f3": "v3","f2": "v2"
}

zset 类型

@RestController
public class ZsetController {@AutowiredStringRedisTemplate redisTemplate;@GetMapping("/zset")public Set<ZSetOperations.TypedTuple<String>> zset() {redisTemplate.execute((RedisConnection connection) -> {connection.flushAll();return null;});redisTemplate.opsForZSet().add("k1", "zhangsan", 10.0);redisTemplate.opsForZSet().add("k1", "lishi", 20.0);redisTemplate.opsForZSet().add("k1", "wangwu", 30.0);redisTemplate.opsForZSet().add("k1", "zhaoliu", 40.0);Long remove = redisTemplate.opsForZSet().remove("k1", "wangwu");System.out.println("remove:" + remove);Long rank = redisTemplate.opsForZSet().rank("k1", "lishi");System.out.println("rank:" + rank);Long size = redisTemplate.opsForZSet().size("k1");System.out.println("size:" + size);return redisTemplate.opsForZSet().rangeWithScores("k1", 0, -1);}
}

输出:

remove:1
rank:1
size:3
[lishi=20.0, zhangsan=10.0, zhaoliu=40.0]
[{"value": "zhangsan","score": 10.0},{"value": "lishi","score": 20.0},{"value": "zhaoliu","score": 40.0}
]

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

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

相关文章

【人工智能】解锁AI潜能:LM Studio多模型并行运行DeepSeek与开源大模型的实践指南

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着大语言模型(LLM)的快速发展,LM Studio作为一款本地化部署工具,以其简单易用的图形化界面和强大的模型管理能力受到广泛关注。本文深…

Node.js面试题

一、什么是Node.js&#xff1f; Node.js 是一个开源的跨平台 JavaScript 运行时环境&#xff0c;允许开发者在服务器端运行 JavaScript 代码。它基于 Chrome 的 V8 JavaScript 引擎构建&#xff0c;能够高效地处理 I/O 操作&#xff0c;适合构建高性能的网络应用。 异步非阻塞&…

Playwright MCP 入门实战:自动化测试与 Copilot 集成指南

什么是 MCP&#xff1f; MCP&#xff08;Model Context Protocol&#xff09; 是一种为大语言模型&#xff08;LLM&#xff09;设计的协议&#xff0c;MCP充当 LLM 与实际应用之间的桥梁或“翻译器”&#xff0c;将自然语言转化为结构化指令&#xff0c;使得模型可以更精确、高…

达梦DM数据库安装步骤

文章目录 1、下载并解压缩2、安装DM数据库2.1 运行安装程序2.2 选择语言与时区2.3 安装向导2.4 许可证协议2.5 Key文件2.6 选择组件2.7 安装位置2.8 安装前小结2.9 安装过程2.10 已完成2.11 初始化 3、配置实例3.1选择操作方式3.2创建数据库模版3.3指定数据库目录3.4数据库标识…

电商双11美妆数据分析(2)

接下来用seaborn包给出每个店铺各个大类以及各个小类的销量销售额 关于性别 接下来考虑性别因素&#xff0c;了解各类产品在男性消费者中的销量占比 男士的销量基本来自于清洁类&#xff0c;其次是补水类。而这两类正是总销量中占比最高的两类。 非男士专用中&#xff0c;补水…

54.实现Trie(前缀树)

Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构&#xff0c;用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景&#xff0c;例如自动补全和拼写检查。 请你实现 Trie 类&#xff1a; Trie() 初始化前缀树对象。void insert(String wo…

Excel文件批量处理指南 | 用VBA一键操作文件夹所有工作簿

系列文章 Excel跨文件夹批处理黑科技 | 用VBA递归遍历所有子目录 目录 系列文章&#x1f4c1; Excel文件批量处理指南 | 用VBA一键操作文件夹所有工作簿一、场景痛点与解决方案二、核心代码架构解析1. 文件遍历引擎2. 安全打开机制3. 错误处理框架 三、7大实战应用场景场景1&a…

南京大学OpenHarmony技术俱乐部正式揭牌 仓颉编程语言引领生态创新

2025年4月24日&#xff0c;由OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;项目群技术指导委员会与南京大学软件学院共同举办的“南京大学OpenHarmony技术俱乐部成立大会暨基础软件与生态应用论坛”在南京大学仙林校区召开。 大会聚焦国产自主编程语言…

C++回调函数学习

C回调函数学习 遇到问题&#xff0c;要学习C回调函数 遇到问题&#xff0c;要学习C回调函数 来吧&#xff0c;直接看代码吧 共有4种方法&#xff0c;每种方法都有标识&#xff0c;对用的屏蔽和打开就可以使用 原文在这里&#xff1a; #include<iostream> #include<f…

PDF解析新范式:Free2AI工具实测

在数字化浪潮中,PDF文件已成为企业、政府及个人存储与传递信息的核心载体。然而,PDF内容的提取与处理始终是行业痛点——无论是合同解析、研究报告整理,还是大规模知识库构建,传统方法常面临效率低、成本高、准确率不足等问题。Free2AI基于智能体技术与大模型算力,为PDF内…

【JS逆向基础】WEB自动化

前言&#xff1a;随着互联网的发展&#xff0c;前端技术也在不断变化&#xff0c;数据的加载方式也不再是单纯的服务端渲染了。现在你可以看到很多网站的数据可能都是通过接口的形式传输的&#xff0c;或者即使不是接口那也是一些 JSON 的数据&#xff0c;然后经过 JavaScript …

大型旋转机械信号趋势分析算法模块

大型旋转机械信号趋势分析算法模块&#xff0c;作为信号处理算法工具箱的主要功能模块&#xff0c;可应用于各类关键机械部件&#xff08;轴承、齿轮、转子等&#xff09;的信号分析、故障探测、趋势劣化评估等&#xff0c;采用全Python语言&#xff0c;以B/S模式&#xff0c;通…

01背包专题4:小A点菜

题目背景 uim 神犇拿到了 uoi 的 ra&#xff08;镭牌&#xff09;后&#xff0c;立刻拉着基友小 A 到了一家……餐馆&#xff0c;很低端的那种。 uim 指着墙上的价目表&#xff08;太低级了没有菜单&#xff09;&#xff0c;说&#xff1a;“随便点”。 题目描述 不过 uim …

探索SQLMesh中的Jinja宏:提升SQL查询的灵活性与复用性

在数据工程和数据分析领域&#xff0c;SQL是不可或缺的工具。随着项目复杂度的增加&#xff0c;如何高效地管理和复用SQL代码成为了一个重要课题。SQLMesh作为一款强大的工具&#xff0c;不仅支持标准的SQL语法&#xff0c;还引入了Jinja模板引擎的宏功能&#xff0c;极大地提升…

MySQL的深度分页如何优化?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL的深度分页如何优化?】面试题。希望对大家有帮助&#xff1b; MySQL的深度分页如何优化? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MySQL的深度分页在处理大数据量时可能会导致性能瓶颈&#xff0c;特别是在…

SpringBoot3集成Mybatis

文章目录 基础使用代码1. 创建Spring Boot 3项目并添加依赖2. 配置数据库连接3. 创建实体类4. 创建Mapper接口5. 创建Service层6. 创建Controller层7. 主应用类 踩坑记录1. 依赖版本不兼容2. Mapper接口扫描问题3. 数据库连接问题4. Java版本问题 心得体会 基础使用代码 1. 创…

汽车加气站操作工考试知识点总结

汽车加气站操作工考试知识点总结 加气站基本知识 了解加气站类型&#xff08;CNG、LNG、LPG等&#xff09;及其特点。 熟悉加气站的主要设备&#xff0c;如储气瓶组、压缩机、加气机、卸气柱、安全阀等。 掌握加气站工艺流程&#xff0c;包括卸气、储气、加压、加气等环节。…

88、合并两个有序数组

题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;…

在ubuntu的docker上常用的docker命令

在 Ubuntu 系统上使用 Docker 时&#xff0c;以下是最常用的前 200 个 Docker 命令&#xff0c;并按类别进行分类。这些命令涵盖了 Docker 的基本操作、管理容器、镜像、网络、卷等方面的功能&#xff0c;适用于日常使用和高级管理任务。 1. 基本命令 这些是与 Docker 交互的基…

ICode国际青少年编程竞赛—Python—4级训练场—复杂嵌套循环

ICode国际青少年编程竞赛—Python—4级训练场—复杂嵌套循环 icode练习时遇到卡顿没有思路时怎么办&#xff0c;题目也很难找到不会的那道题&#xff5e;针对这个问题&#xff0c;我们开发了通过“步数”、“积木行数”来快速定位到你不会的题目&#xff5e; 题目会持续更新…