深入了解Jedis:Java操作Redis的常见类型数据存储

news/2024/11/16 21:43:59/

目录

前言

一、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在各方面的功能

  1. 连接管理和连接池:

    • Jedis通过Jedis类提供了与Redis服务器建立连接和通信的功能。
    • Jedis内置了连接池功能,可以通过JedisPool类来管理连接池。连接池可以提高性能,减少每次创建和释放连接的开销。
  2. 数据类型支持:

    • Jedis支持Redis的所有数据类型,包括字符串、哈希表、列表、集合和有序集合等。
    • 对于每种数据类型,Jedis都提供了相应的方法来进行添加、获取、更新和删除等操作。
  3. 事务支持:

    • Jedis支持事务操作,可以将多个Redis命令放在一个事务中执行。
    • 通过Transaction类,可以将多个命令添加到事务中,然后一起提交或回滚,以保证操作的原子性。
  4. 管道支持:

    • Jedis支持管道操作,可以一次性发送多个命令,从而减少与Redis服务器之间的网络往返次数,提高性能。
    • 通过Pipeline类,可以将多个命令添加到管道中,然后一次性发送给Redis服务器。
  5. 发布-订阅模式支持:

    • Jedis支持Redis的发布-订阅模式,可以用于实现消息队列、事件通知等功能。
    • 通过JedisPubSub类,可以创建一个订阅器来监听指定的频道,并在收到消息时执行相应的回调方法。
  6. 数据序列化和反序列化:

    • Jedis支持自定义数据序列化和反序列化,可以通过实现RedisSerializer接口来对数据进行自定义处理。
    • 默认情况下,Jedis使用Java的序列化机制来进行数据的序列化和反序列化,但也提供了其他序列化方式,如JSON、XML等。
  7. 高级特性支持:

    • Jedis提供了一些高级特性,如分布式锁、Lua脚本执行、位图操作、地理位置相关操作等。
    • 分布式锁可以实现分布式系统中的并发控制,确保同一时刻只有一个线程可以访问共享资源。
    • 通过JedisCluster类,可以方便地操作Redis集群,进行数据读写和管理。

2.特点

  1. 易于使用:Jedis提供了简单易用的API,使得Java开发人员可以轻松地与Redis进行交互,不需要编写复杂的网络通信和协议解析代码。

  2. 高性能:Jedis使用基于Netty的高性能通信框架,能够快速响应Redis服务器的请求,并且内置连接池功能,可以减少连接的创建和释放开销。

  3. 支持所有Redis数据类型:Jedis支持Redis的所有数据类型,包括字符串、哈希表、列表、集合和有序集合等,可以进行添加、获取、更新和删除等操作。

  4. 事务和管道支持:Jedis支持事务和管道操作,可以将多个命令一次性发送给Redis服务器,从而提高性能并保证操作的原子性。

  5. 发布-订阅模式支持:Jedis支持Redis的发布-订阅模式,可以用于实现消息队列、事件通知等功能。

  6. 数据序列化支持:Jedis支持自定义数据序列化方式,可以通过实现RedisSerializer接口来对数据进行自定义处理。

  7. 分布式锁支持:Jedis提供了分布式锁的实现,可以在分布式系统中实现并发控制,确保同一时刻只有一个线程可以访问共享资源。

  8. 高级特性支持:Jedis提供了一些高级特性,如Lua脚本执行、位图操作、地理位置相关操作等。

  9. 集群支持: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方法获取所有会议信息,并直接返回给前端。


http://www.ppmy.cn/news/1201888.html

相关文章

python-fire 链式调用解决命令行无法自动结束

python-fire 链式调用,可以一个命令行运行多个命令(也就是连续调用多个方法), calculator.py 代码 import fireclass Calculator:def __init__(self):self.result 0self.express 0def __str__(self):print(完成)return f{self.express} {self.result}# return def add(self,…

【HarmonyOS】HarmonyOS Test测试用例中一些断言API的使用

【关键词】 单元测试框架、HarmonyOS Test、assertThrowError、assertFail、assertEqual 【测试代码及测试结果展示】 这里以新建API9工程自动生成的ohosTest来编写单元测试代码。 1、 测试代码&#xff1a; import { describe, it, expect } from ohos/hypium import abil…

CSS 简介

一、CSS简介&#xff1a; CSS (Cascading Style Sheets&#xff0c;层叠样式表&#xff09;&#xff0c;是一种用来为结构化文档&#xff08;如 HTML 文档或 XML 应用&#xff09;添加样式&#xff08;字体、间距和颜色等&#xff09;的计算机语言&#xff0c;CSS 文件扩展名为…

ZooKeeper调优

服务器硬件配置 建议 Zookeeper 的服务器最好专属(或是资源隔离的)。磁盘由于 Zookeeper 的数据写入磁盘,强烈建议要使用 SSD。 Linux操作系统优化 Zookeeper 的性能会很明显受到交换分区的影响。建议部署 Zookeeper 的服务器关闭交换分区功能或是通过内核参数调整,减少…

「掌握创意,释放想象」——Photoshop 2023,你的无限可能!

Adobe Photoshop 2023(PS2023) 来了,全世界数以百万计的设计师、摄影师和艺术家使用 Photoshop 将不可能变为可能。从海报到包装&#xff0c;从基本的横幅到漂亮的网站&#xff0c;从令人难忘的徽标到引人注目的图标&#xff0c;Photoshop 2023让创意世界不断前进。借助直观的工…

Django初窥门径-自定义用户模型

前言 自定义用户模型在Django应用中是一个重要的话题&#xff0c;它涉及到如何根据您的项目需求以及特定的用户身份验证和授权需求来调整用户模型。在以下前言中&#xff0c;我将讲述为什么自定义用户模型是如此重要以及其潜在的优势&#xff1a; 随着Web应用的不断发展&…

Gson 解析容错框架

官网 GitHub - getActivity/GsonFactory: Gson 解析容错框架&#xff0c;愿从此再无 Json 解析报错&#xff0c;另外还适配了 Kotlin 默认值&#xff0c;和后台返回空值的情况 项目简介 Gson 解析容错框架&#xff0c;愿从此再无 Json 解析报错&#xff0c;另外还适配了 Kot…

『MySQL快速上手』-②-数据库基础

文章目录 1.什么是数据库2.MySQL的基本使用2.1 MySQL的安装2.2 连接MySQL服务器2.3 服务器、数据库与表的关系2.4 使用案例 3.SQL语句分类4.存储引擎4.1 什么是存储引擎4.2 查看存储引擎 1.什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库&#xff1f;文…