• 深入了解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在各方面的功能

    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依赖

    1. <!--redis-->
    2. <dependency>
    3. <groupId>redis.clients</groupId>
    4. <artifactId>jedis</artifactId>
    5. <version>2.9.0</version>
    6. </dependency>

    2.建立连接

    先开启我们的Redis

    1. package com.ctb.ssm.redis;
    2. import redis.clients.jedis.Jedis;
    3. /**
    4. * @author
    5. * @remark
    6. * @create  2023-11-06 10:30
    7. */
    8. public class Demo1 {
    9. public static void main(String[] args) {
    10. Jedis jedis = new Jedis("localhost", 6379);//主机地址,端口号
    11. jedis.auth("123456");//密码
    12. System.out.println(jedis.ping());
    13. }
    14. }

    这样就连接成功啦 

    三、Java操作Redis的常见类型数据存储

    1.字符串

    字符串是Redis中最简单的数据类型,也是最常见的数据类型之一。

    1. package com.ctb.ssm.redis;
    2. // 导入Jedis库
    3. import redis.clients.jedis.Jedis;
    4. public class StringExample {
    5. public static void main(String[] args) {
    6. // 创建Jedis对象,连接Redis服务器
    7. Jedis jedis = new Jedis("localhost");
    8. // 存储字符串数据
    9. jedis.set("name", "John Doe");
    10. // 获取字符串数据
    11. String name = jedis.get("name");
    12. System.out.println("Name: " + name);
    13. // 更新字符串数据
    14. jedis.set("name", "Jane Doe");
    15. name = jedis.get("name");
    16. System.out.println("Updated Name: " + name);
    17. // 删除字符串数据
    18. jedis.del("name");
    19. name = jedis.get("name");
    20. System.out.println("Deleted Name: " + name);
    21. // 关闭连接
    22. jedis.close();
    23. }
    24. }

    2.哈希表

    哈希表是Redis中的一种 key-value 类型数据结构,它类似于Java中的Map。

    1. // 导入Jedis库
    2. import redis.clients.jedis.Jedis;
    3. package com.ctb.ssm.redis;
    4. import java.util.HashMap;
    5. import java.util.Map;
    6. public class HashExample {
    7. public static void main(String[] args) {
    8. // 创建Jedis对象,连接Redis服务器
    9. Jedis jedis = new Jedis("localhost");
    10. // 存储哈希表数据
    11. Map<String, String> user = new HashMap<>();
    12. user.put("name", "John Doe");
    13. user.put("age", "30");
    14. user.put("email", "johndoe@example.com");
    15. jedis.hset("user:1", user);
    16. // 获取哈希表数据
    17. Map<String, String> storedUser = jedis.hgetAll("user:1");
    18. System.out.println("Name: " + storedUser.get("name"));
    19. System.out.println("Age: " + storedUser.get("age"));
    20. System.out.println("Email: " + storedUser.get("email"));
    21. // 更新哈希表数据
    22. jedis.hset("user:1", "age", "31");
    23. storedUser = jedis.hgetAll("user:1");
    24. System.out.println("Updated Age: " + storedUser.get("age"));
    25. // 删除哈希表数据
    26. jedis.hdel("user:1", "email");
    27. storedUser = jedis.hgetAll("user:1");
    28. System.out.println("Deleted Email: " + storedUser.get("email"));
    29. // 关闭连接
    30. jedis.close();
    31. }
    32. }

    3.列表

    列表是Redis中的一种有序数据结构,它可以存储多个字符串类型的元素。

    1. package com.ctb.ssm.redis;
    2. // 导入Jedis库
    3. import redis.clients.jedis.Jedis;
    4. import java.util.List;
    5. public class ListExample {
    6. public static void main(String[] args) {
    7. // 创建Jedis对象,连接Redis服务器
    8. Jedis jedis = new Jedis("localhost");
    9. // 存储列表数据
    10. jedis.lpush("fruits", "apple");
    11. jedis.lpush("fruits", "banana");
    12. jedis.lpush("fruits", "orange");
    13. // 获取列表数据
    14. List<String> fruits = jedis.lrange("fruits", 0, -1);
    15. for (String fruit : fruits) {
    16. System.out.println("Fruit: " + fruit);
    17. }
    18. // 弹出列表元素
    19. String poppedFruit = jedis.lpop("fruits");
    20. System.out.println("Popped Fruit: " + poppedFruit);
    21. // 关闭连接
    22. jedis.close();
    23. }
    24. }

    4.集合

    集合是Redis中的一种无序数据结构,它可以存储多个字符串类型的元素,且每个元素都是唯一的。

    1. package com.ctb.ssm.redis;
    2. // 导入Jedis库
    3. import redis.clients.jedis.Jedis;
    4. import java.util.Set;
    5. public class SetExample {
    6. public static void main(String[] args) {
    7. // 创建Jedis对象,连接Redis服务器
    8. Jedis jedis = new Jedis("localhost");
    9. // 存储集合数据
    10. jedis.sadd("tags", "java");
    11. jedis.sadd("tags", "python");
    12. jedis.sadd("tags", "javascript");
    13. // 获取集合数据
    14. Set<String> tags = jedis.smembers("tags");
    15. for (String tag : tags) {
    16. System.out.println("Tag: " + tag);
    17. }
    18. // 判断元素是否存在于集合中
    19. boolean exists = jedis.sismember("tags", "python");
    20. System.out.println("Python exists in tags set: " + exists);
    21. // 删除集合元素
    22. jedis.srem("tags", "python");
    23. exists = jedis.sismember("tags", "python");
    24. System.out.println("Python exists in tags set after removal: " + exists);
    25. // 关闭连接
    26. jedis.close();
    27. }
    28. }

    5.有序集合

    有序集合是Redis中的一种有序数据结构,它可以存储多个字符串类型的元素,每个元素都有一个对应的分值,可以根据分值进行排序。

    1. package com.ctb.ssm.redis;
    2. // 导入Jedis库
    3. import redis.clients.jedis.Jedis;
    4. import java.util.Set;
    5. public class SortedSetExample {
    6. public static void main(String[] args) {
    7. // 创建Jedis对象,连接Redis服务器
    8. Jedis jedis = new Jedis("localhost");
    9. // 存储有序集合数据
    10. jedis.zadd("scores", 90, "Alice");
    11. jedis.zadd("scores", 80, "Bob");
    12. jedis.zadd("scores", 95, "Charlie");
    13. // 获取有序集合数据
    14. Set<String> topScorers = jedis.zrevrange("scores", 0, 2);
    15. for (String scorer : topScorers) {
    16. System.out.println("Top Scorer: " + scorer);
    17. }
    18. // 更新有序集合数据
    19. jedis.zincrby("scores", 5, "Alice");
    20. double aliceScore = jedis.zscore("scores", "Alice");
    21. System.out.println("Updated Alice Score: " + aliceScore);
    22. // 关闭连接
    23. jedis.close();
    24. }
    25. }

    四、Redis的实际应用场景实例

    redis一般用于存储基本不会变换的数据:如会议状态等,在数据库存储的数值需翻译为所对应的状态如待开会议,历史会议等。

    我们就可以用Redis去进行一个存储,然后根据对应的值查出对应的内容。

    1.会议信息实体

    1. package com.ctb.ssm.model;
    2. public class Meeting {
    3. private String id;
    4. private String name;
    5. private int state;
    6. // 构造方法、getter和setter省略
    7. }

    其中,state字段使用int类型表示,1代表待开会议,2代表历史会议,3代表发布会议

    2.自定义注解

    1. package com.ctb.ssm.annotation;
    2. import java.lang.annotation.*;
    3. @Target(ElementType.FIELD)
    4. @Retention(RetentionPolicy.RUNTIME)
    5. public @interface State {
    6. String value();
    7. int code();
    8. }

    在注解中通过value()方法获取会议状态名称,在code()方法获取会议状态数值。

    3.创建切面类

    用于在查询会议信息时遍历会议列表,并根据状态字段的值进行特殊处理

    1. package com.ctb.ssm.Aspect;
    2. import org.aspectj.lang.ProceedingJoinPoint;
    3. import org.aspectj.lang.annotation.*;
    4. import redis.clients.jedis.Jedis;
    5. import redis.clients.jedis.JedisPool;
    6. import redis.clients.jedis.JedisPoolConfig;
    7. @Aspect
    8. @Component
    9. public class MeetingAspect {
    10. private JedisPool jedisPool;
    11. public MeetingAspect() {
    12. JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    13. jedisPool = new JedisPool(jedisPoolConfig, "localhost", 6379);
    14. }
    15. @Around("execution(* com.example.MeetingService.getMeetings())")
    16. public Object processMeetings(ProceedingJoinPoint joinPoint) throws Throwable {
    17. Jedis jedis = jedisPool.getResource();
    18. try {
    19. List meetings = (List) joinPoint.proceed();
    20. for (Meeting meeting : meetings) {
    21. int stateCode = meeting.getState();
    22. // 根据stateCode将会议状态存储到Redis中
    23. jedis.hset("meeting_states", String.valueOf(stateCode), getStateNameByCode(stateCode));
    24. }
    25. return meetings;
    26. } finally {
    27. jedis.close();
    28. }
    29. }
    30. private String getStateNameByCode(int stateCode) {
    31. switch (stateCode) {
    32. case 1:
    33. return "待开会议";
    34. case 2:
    35. return "历史会议";
    36. case 3:
    37. return "发布会议";
    38. default:
    39. return "取消会议";
    40. }
    41. }
    42. }

    我们创建了一个JedisPool并初始化,用于获取Jedis实例来操作Redis。在processMeetings方法中,我们可以获取到查询到的会议列表meetings,并遍历每个Meeting对象。根据会议对象的状态字段 state,我们可以通过调用 jedis.hset() 方法将对应的会议状态名称存储到Redis的哈希表 "meeting_states" 中。

    4.创建控制层(controller层)

    1. @RestController
    2. public class MeetingController {
    3. @Autowired
    4. private MeetingService meetingService;
    5. @GetMapping("/meetings")
    6. public List getMeetings() {
    7. List meetings = meetingService.getMeetings();
    8. return meetings;
    9. }
    10. }

    我们在MeetingController中定义了一个接口 "/meetings",用于获取所有会议信息。在这个接口中,我们调用MeetingService的getMeetings方法获取所有会议信息,并直接返回给前端。

  • 相关阅读:
    完全二叉树你需要了解一下
    9月15日、9月18日上课内容 Zookeeper集群 + Kafka集群
    给矩阵添加地理信息
    离散数学 --- 树 --- 无向树,生成树与最小生成树
    【Day3】最长上升子序列|Python
    【鸿蒙学习笔记】文件管理
    每日一练 | 华为认证真题练习Day122
    MySQL--基本概念(查看数据库及表)
    通过Git Bash将本地文件上传到本地github
    netty - TimerWheel
  • 原文地址:https://blog.csdn.net/weixin_74268571/article/details/134241226