深入了解Jedis:Java操作Redis的常见类型数据存储
目录
前言
一、Jedis介绍
1.Jedis在各方面的功能
2.特点
二、Java连接Redis
1.导入pom依赖
2.建立连接
三、Java操作Redis的常见类型数据存储
1.字符串
2.哈希表
3.列表
4.集合
5.有序集合
四、Redis的实际应用场景实例
1.会议信息实体
2.自定义注解
3.创建切面类
4.创建控制层(controller层)
前言
Redis作为一个高性能、多数据结构支持、原子性操作以及高可用性和扩展性的内存缓存数据库,在现代化的互联网服务中具有非常重要的地位。在Java应用程序中,使用Redis来操作常见的数据类型是必不可少的一项技能。本文将为大家介绍Java如何操作Redis中的常见数据类型,包括字符串、哈希表、列表、集合和有序集合。
一、Jedis介绍
Jedis是一款Java语言编写的Redis客户端,它提供了比较全面的Redis命令操作,可以方便地使用Java代码来访问和操作Redis服务器。Jedis底层使用了Java网络IO框架Netty和Java序列化框架Kryo,具有良好的性能和稳定性。
1.Jedis在各方面的功能
连接管理和连接池:
- Jedis通过
Jedis
类提供了与Redis服务器建立连接和通信的功能。- Jedis内置了连接池功能,可以通过
JedisPool
类来管理连接池。连接池可以提高性能,减少每次创建和释放连接的开销。数据类型支持:
- Jedis支持Redis的所有数据类型,包括字符串、哈希表、列表、集合和有序集合等。
- 对于每种数据类型,Jedis都提供了相应的方法来进行添加、获取、更新和删除等操作。
事务支持:
- Jedis支持事务操作,可以将多个Redis命令放在一个事务中执行。
- 通过
Transaction
类,可以将多个命令添加到事务中,然后一起提交或回滚,以保证操作的原子性。管道支持:
- Jedis支持管道操作,可以一次性发送多个命令,从而减少与Redis服务器之间的网络往返次数,提高性能。
- 通过
Pipeline
类,可以将多个命令添加到管道中,然后一次性发送给Redis服务器。发布-订阅模式支持:
- Jedis支持Redis的发布-订阅模式,可以用于实现消息队列、事件通知等功能。
- 通过
JedisPubSub
类,可以创建一个订阅器来监听指定的频道,并在收到消息时执行相应的回调方法。数据序列化和反序列化:
- Jedis支持自定义数据序列化和反序列化,可以通过实现
RedisSerializer
接口来对数据进行自定义处理。- 默认情况下,Jedis使用Java的序列化机制来进行数据的序列化和反序列化,但也提供了其他序列化方式,如JSON、XML等。
高级特性支持:
- Jedis提供了一些高级特性,如分布式锁、Lua脚本执行、位图操作、地理位置相关操作等。
- 分布式锁可以实现分布式系统中的并发控制,确保同一时刻只有一个线程可以访问共享资源。
- 通过
JedisCluster
类,可以方便地操作Redis集群,进行数据读写和管理。
2.特点
易于使用:Jedis提供了简单易用的API,使得Java开发人员可以轻松地与Redis进行交互,不需要编写复杂的网络通信和协议解析代码。
高性能:Jedis使用基于Netty的高性能通信框架,能够快速响应Redis服务器的请求,并且内置连接池功能,可以减少连接的创建和释放开销。
支持所有Redis数据类型:Jedis支持Redis的所有数据类型,包括字符串、哈希表、列表、集合和有序集合等,可以进行添加、获取、更新和删除等操作。
事务和管道支持:Jedis支持事务和管道操作,可以将多个命令一次性发送给Redis服务器,从而提高性能并保证操作的原子性。
发布-订阅模式支持:Jedis支持Redis的发布-订阅模式,可以用于实现消息队列、事件通知等功能。
数据序列化支持:Jedis支持自定义数据序列化方式,可以通过实现
RedisSerializer
接口来对数据进行自定义处理。分布式锁支持:Jedis提供了分布式锁的实现,可以在分布式系统中实现并发控制,确保同一时刻只有一个线程可以访问共享资源。
高级特性支持:Jedis提供了一些高级特性,如Lua脚本执行、位图操作、地理位置相关操作等。
集群支持:Jedis通过
JedisCluster
类提供了集群操作功能,可以方便地操作Redis集群。
二、Java连接Redis
redis与mysq都是数据库,java操作redis其实跟操作mysql的过程是差不多的,首先都是导入依赖、建立连接,只是方式不同,redis是非关系数据库而mysql是关系数据库。
什么是关系数据库与非关系数据库?
- 关系数据库 是一种基于关系模型的数据库系统,其中数据以表格形式组织,并使用 SQL(Structured Query Language)进行查询和管理。在关系数据库中,数据由多个表格组成,每个表格包含多个行和列,每行代表一个记录,每列代表一个属性。关系数据库中的表格之间可以建立关系,通过这些关系可以实现数据的联合查询和更新。关系数据库最常见的例子是MySQL、Oracle和SQL Server等。
- 非关系数据库(NoSQL)是相对于传统的关系数据库而言的,它采用了非关系数据模型来存储和处理数据。非关系数据库通常不使用表格,而是使用其他形式的数据结构,例如键值对、文档、图形等,以便更好地处理大量非结构化数据。NoSQL数据库通常具有较高的可扩展性、灵活性和性能,并且能够处理复杂的数据处理任务。非关系数据库最常见的例子是MongoDB、Cassandra和Redis等。
1.导入pom依赖
在maven项目中导入redis的pom依赖
<!--redis--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version></dependency>
2.建立连接
先开启我们的Redis
package com.ctb.ssm.redis;import redis.clients.jedis.Jedis;/*** @author 彪* @remark* @create 2023-11-06 10:30*/
public class Demo1 {public static void main(String[] args) {Jedis jedis = new Jedis("localhost", 6379);//主机地址,端口号jedis.auth("123456");//密码System.out.println(jedis.ping());}
}
这样就连接成功啦
三、Java操作Redis的常见类型数据存储
1.字符串
字符串是Redis中最简单的数据类型,也是最常见的数据类型之一。
package com.ctb.ssm.redis;// 导入Jedis库
import redis.clients.jedis.Jedis;public class StringExample {public static void main(String[] args) {// 创建Jedis对象,连接Redis服务器Jedis jedis = new Jedis("localhost");// 存储字符串数据jedis.set("name", "John Doe");// 获取字符串数据String name = jedis.get("name");System.out.println("Name: " + name);// 更新字符串数据jedis.set("name", "Jane Doe");name = jedis.get("name");System.out.println("Updated Name: " + name);// 删除字符串数据jedis.del("name");name = jedis.get("name");System.out.println("Deleted Name: " + name);// 关闭连接jedis.close();}
}
2.哈希表
哈希表是Redis中的一种 key-value 类型数据结构,它类似于Java中的Map。
// 导入Jedis库
import redis.clients.jedis.Jedis;package com.ctb.ssm.redis;import java.util.HashMap;
import java.util.Map;public class HashExample {public static void main(String[] args) {// 创建Jedis对象,连接Redis服务器Jedis jedis = new Jedis("localhost");// 存储哈希表数据Map<String, String> user = new HashMap<>();user.put("name", "John Doe");user.put("age", "30");user.put("email", "johndoe@example.com");jedis.hset("user:1", user);// 获取哈希表数据Map<String, String> storedUser = jedis.hgetAll("user:1");System.out.println("Name: " + storedUser.get("name"));System.out.println("Age: " + storedUser.get("age"));System.out.println("Email: " + storedUser.get("email"));// 更新哈希表数据jedis.hset("user:1", "age", "31");storedUser = jedis.hgetAll("user:1");System.out.println("Updated Age: " + storedUser.get("age"));// 删除哈希表数据jedis.hdel("user:1", "email");storedUser = jedis.hgetAll("user:1");System.out.println("Deleted Email: " + storedUser.get("email"));// 关闭连接jedis.close();}
}
3.列表
列表是Redis中的一种有序数据结构,它可以存储多个字符串类型的元素。
package com.ctb.ssm.redis;// 导入Jedis库
import redis.clients.jedis.Jedis;import java.util.List;public class ListExample {public static void main(String[] args) {// 创建Jedis对象,连接Redis服务器Jedis jedis = new Jedis("localhost");// 存储列表数据jedis.lpush("fruits", "apple");jedis.lpush("fruits", "banana");jedis.lpush("fruits", "orange");// 获取列表数据List<String> fruits = jedis.lrange("fruits", 0, -1);for (String fruit : fruits) {System.out.println("Fruit: " + fruit);}// 弹出列表元素String poppedFruit = jedis.lpop("fruits");System.out.println("Popped Fruit: " + poppedFruit);// 关闭连接jedis.close();}
}
4.集合
集合是Redis中的一种无序数据结构,它可以存储多个字符串类型的元素,且每个元素都是唯一的。
package com.ctb.ssm.redis;// 导入Jedis库
import redis.clients.jedis.Jedis;import java.util.Set;public class SetExample {public static void main(String[] args) {// 创建Jedis对象,连接Redis服务器Jedis jedis = new Jedis("localhost");// 存储集合数据jedis.sadd("tags", "java");jedis.sadd("tags", "python");jedis.sadd("tags", "javascript");// 获取集合数据Set<String> tags = jedis.smembers("tags");for (String tag : tags) {System.out.println("Tag: " + tag);}// 判断元素是否存在于集合中boolean exists = jedis.sismember("tags", "python");System.out.println("Python exists in tags set: " + exists);// 删除集合元素jedis.srem("tags", "python");exists = jedis.sismember("tags", "python");System.out.println("Python exists in tags set after removal: " + exists);// 关闭连接jedis.close();}
}
5.有序集合
有序集合是Redis中的一种有序数据结构,它可以存储多个字符串类型的元素,每个元素都有一个对应的分值,可以根据分值进行排序。
package com.ctb.ssm.redis;// 导入Jedis库
import redis.clients.jedis.Jedis;import java.util.Set;public class SortedSetExample {public static void main(String[] args) {// 创建Jedis对象,连接Redis服务器Jedis jedis = new Jedis("localhost");// 存储有序集合数据jedis.zadd("scores", 90, "Alice");jedis.zadd("scores", 80, "Bob");jedis.zadd("scores", 95, "Charlie");// 获取有序集合数据Set<String> topScorers = jedis.zrevrange("scores", 0, 2);for (String scorer : topScorers) {System.out.println("Top Scorer: " + scorer);}// 更新有序集合数据jedis.zincrby("scores", 5, "Alice");double aliceScore = jedis.zscore("scores", "Alice");System.out.println("Updated Alice Score: " + aliceScore);// 关闭连接jedis.close();}
}
四、Redis的实际应用场景实例
redis一般用于存储基本不会变换的数据:如会议状态等,在数据库存储的数值需翻译为所对应的状态如待开会议,历史会议等。
我们就可以用Redis去进行一个存储,然后根据对应的值查出对应的内容。
1.会议信息实体
package com.ctb.ssm.model;public class Meeting {private String id;private String name;private int state;// 构造方法、getter和setter省略
}
其中,state字段使用int类型表示,1代表待开会议,2代表历史会议,3代表发布会议
2.自定义注解
package com.ctb.ssm.annotation;import java.lang.annotation.*;@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface State {String value();int code();
}
在注解中通过value()方法获取会议状态名称,在code()方法获取会议状态数值。
3.创建切面类
用于在查询会议信息时遍历会议列表,并根据状态字段的值进行特殊处理
package com.ctb.ssm.Aspect;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;@Aspect
@Component
public class MeetingAspect {private JedisPool jedisPool;public MeetingAspect() {JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();jedisPool = new JedisPool(jedisPoolConfig, "localhost", 6379);}@Around("execution(* com.example.MeetingService.getMeetings())")public Object processMeetings(ProceedingJoinPoint joinPoint) throws Throwable {Jedis jedis = jedisPool.getResource();try {List<Meeting> meetings = (List<Meeting>) joinPoint.proceed();for (Meeting meeting : meetings) {int stateCode = meeting.getState();// 根据stateCode将会议状态存储到Redis中jedis.hset("meeting_states", String.valueOf(stateCode), getStateNameByCode(stateCode));}return meetings;} finally {jedis.close();}}private String getStateNameByCode(int stateCode) {switch (stateCode) {case 1:return "待开会议";case 2:return "历史会议";case 3:return "发布会议";default:return "取消会议";}}
}
我们创建了一个JedisPool并初始化,用于获取Jedis实例来操作Redis。在processMeetings方法中,我们可以获取到查询到的会议列表meetings,并遍历每个Meeting对象。根据会议对象的状态字段 state
,我们可以通过调用 jedis.hset()
方法将对应的会议状态名称存储到Redis的哈希表 "meeting_states" 中。
4.创建控制层(controller层)
@RestController
public class MeetingController {@Autowiredprivate MeetingService meetingService;@GetMapping("/meetings")public List<Meeting> getMeetings() {List<Meeting> meetings = meetingService.getMeetings();return meetings;}
}
我们在MeetingController中定义了一个接口 "/meetings",用于获取所有会议信息。在这个接口中,我们调用MeetingService的getMeetings方法获取所有会议信息,并直接返回给前端。
相关文章:

深入了解Jedis:Java操作Redis的常见类型数据存储
目录 前言 一、Jedis介绍 1.Jedis在各方面的功能 2.特点 二、Java连接Redis 1.导入pom依赖 2.建立连接 三、Java操作Redis的常见类型数据存储 1.字符串 2.哈希表 3.列表 4.集合 5.有序集合 四、Redis的实际应用场景实例 1.会议信息实体 2.自定义注解 3.创建切面…...
angular+ionic+npm项目运行
angularionicnpm项目运行 错误记录(1)Downloading binary from https://github.com/sass/node-sass/releases/download/v4.14.1/win32-x64-72_binding.node(2)The npm warning "A requires a peer of B but none is installe…...

【数据库】数据库模式 Schema
数据库模式 Schema 1.MySQL2.PostgreSQL3.SQL Server4.Oracle5.SQLite 在数据库的术语中,模式(schema)是一个逻辑概念,用于组织数据库中的对象。模式中的对象通常包括 表、索引、数据类型、序列、视图、存储过程、主键、外键 等等…...

RPC 原理详解
文章目录 什么是 RPCRPC 基本原理RPC核心功能服务寻址数据编解码网络传输一次RPC的调用过程 实践基于HTTP协议的RPC基于TCP协议的RPC 什么是 RPC RPC(Remote Procedure Call),即远程过程调用,它允许像调用本地服务一样调用远程服…...

新版Helix QAC 100%覆盖MISRA C++:2023
Helix QAC 2023.3预期将100%覆盖在2023年第四季度发布的新的MISRA C:2023规则。 此外,该版本支持更多的C20语言特性,并改进了Perforce Validate平台和Helix QAC与Validate的集成,以及其他质量改进。 编码标准覆盖率(MISRA C:202…...
maven 项目添加 git-hook 脚本,约束提交内容格式
git 提交代码,推送代码,可以通过在 .git/hooks 目录中的 bash 脚本来做一定的验证工作。 本例使用插件 maven-antrun-plugin 自动输出脚本至 .git/hooks 目录中,在 pom.xml 中的使用示例如下: <plugin><groupId>org.…...
18、Flink的SQL 支持的操作和语法
Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…...

泛微OA_lang2sql 任意文件上传漏洞复现
简介 泛微OA E-mobile系统 lang2sql接口存在任意文件上传漏洞,由于后端源码中没有对文件没有校验,导致任意文件上传。攻击者可利用该参数构造恶意数据包进行上传漏洞攻击。 漏洞复现 FOFA语法: title"移动管理平台-企业管理" 页…...

Rust编程基础核心之所有权(上)
1.什么是所有权? Rust 的核心功能(之一)是 所有权(ownership)。虽然该功能很容易解释,但它对语言的其他部分有着深刻的影响。 所有程序都必须管理其运行时使用计算机内存的方式。一些语言中具有垃圾回收机制&#x…...
优化改进YOLOv5算法之添加DCNv3模块,有效提升目标检测效果
目录 前言 1 DCNv3原理 1.1 DCNv2 1.2 DCNv3 1.3 模型架构 2 YOLOv5算法中加入DCNv3模块...

VSCode 连接不上 debian 的问题
之前一台笔记本上安装了 debian12,当时用 vscode 是可以连接上的,但今天连接突然就失败了,失败信息是这样的: 查看失败信息 因为 debian 是自动获取 ip 地址的,以前能连接上时,ip 地址是 104,然…...

【ElasticSearch系列-06】Es集群架构的搭建以及集群的核心概念
ElasticSearch系列整体栏目 内容链接地址【一】ElasticSearch下载和安装https://zhenghuisheng.blog.csdn.net/article/details/129260827【二】ElasticSearch概念和基本操作https://blog.csdn.net/zhenghuishengq/article/details/134121631【三】ElasticSearch的高级查询Quer…...
软考高级系统架构设计师系列案例考点专题六:面向服务架构设计
软考高级系统架构设计师系列案例考点专题六:面向服务架构设计 一、面向服务架构设计内容大纲二、SOA概述和发展三、SOA和微服务的区别四、SOA的参考架构五、SOA主要协议和规范六、SOA设计标准和原则七、SOA设计模式八、SOA构建和实施一、面向服务架构设计内容大纲 SOA概述和发…...

【入门Flink】- 07Flink DataStream API【万字篇】
DataStream API 是 Flink 的核心层 API。一个 Flink 程序,其实就是对DataStream的各种转换。 代码基本上都由以下几部分构成: 执行环境(Execution Environment) 1)创建执行环境StreamExecutionEnvironment StreamExe…...

AI:55-基于深度学习的人流量检测
🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…...
node版本管理工具nvm
node版本管理工具nvm 要在本地拥有多个 Node.js 版本,并根据不同的环境切换不同的 Node.js 版本,你可以使用工具如 nvm(Node Version Manager)来管理和切换 Node.js 版本。 以下是关于如何使用这两个工具的简要说明:…...

stable-diffusion-webui安装Wav2Lip
常见错误 1.错误:Torch is not able to use GPU; add --skip-torch-cuda-test to COMMANDLINE_ARGS variable to disable this check 修改代码: launch_utils.py 删除三个地方:...

Nacos-2.2.2源码修改集成高斯数据库GaussDB,postresql
一 ,下载代码 Release 2.2.2 (Apr 11, 2023) alibaba/nacos GitHub 二, 执行打包 mvn -Prelease-nacos -Dmaven.test.skiptrue -Drat.skiptrue clean install -U 或 mvn -Prelease-nacos ‘-Dmaven.test.skiptrue’ ‘-Drat.skiptrue’ clean instal…...

Linux 内核中根据文件inode号获取其对应的struct inode
文章目录 前言一、简介二、iget_locked2.1 简介2.2 内核中使用2.3 LKM demo 三、ext4_iget3.1 简介3.2 LKM demo 前言 文件inode号和struct inode结构体请参考: Linux文件路径,目录项,inode号关联 Linux文件系统 struct inode 结构体解析 一…...

Pycharm-community-2021版安装和配置
一、下载Pycharm-community-2021 1.从官网下载pycharm-community Pycharm 版本官网 二、安装PyCharm 1.打开下载完成的安装包,点击Next 2.安装PyCharm到其他位置,点击Next 3.一定把更新PATH变量勾上,可以创建桌面快捷方式,创建关联,最后…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...