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

news2024/11/24 19:52:47

目录

前言

一、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 {

    @Autowired
    private MeetingService meetingService;

    @GetMapping("/meetings")
    public List<Meeting> getMeetings() {
        List<Meeting> meetings = meetingService.getMeetings();
        return meetings;
    }
}

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

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

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

相关文章

应用场景 | 中小河流治理监测系统,提升流域智能感知能力

当前&#xff0c;受全球气候变化和人类活动影响&#xff0c;我国中小河流洪涝灾害呈多发、频发趋势&#xff0c;中小河流洪水已成为严重威胁人民群众生命财产安全的重大风险隐患。中小河流治理作为一项重要的民生水利任务&#xff0c;近十年来国家不断加大以防洪为主的治理投入…

初始JVM虚拟机

JVM组成 图解 程序计数器 在JVM线程私有的内存区域中。每个线程都有自己独立的程序计数器。 程序计数器用于存储当前线程正在执行的字节码指令的地址。指示着当前线程执行到了哪一条字节码指令。 堆 是线程共享的区域&#xff0c;用于存储对象的实例和数组对象&#xff1b; …

使用OkHttp库爬取百度云视频详细步骤

目录 摘要 一、OkHttp库简介 二、爬虫基本概念 三、使用OkHttp库爬取百度云视频 1、发送HTTP请求 2、处理响应 3、下载文件 四、可能遇到的问题及解决方案 五、注意事项 总结与建议 摘要 本文将详细介绍如何使用OkHttp库爬取百度云视频。文章首先简要介绍OkHttp库和…

三国志14信息查询小程序(历史武将信息一览)制作更新过程03-主要页面的设计

1&#xff0c;小程序的默认显示 分为三部分&#xff0c;头部的标题、中间的内容区和底部的标签栏。点击标签可以切换不同页面&#xff0c;这是在app.json文件中配置的。代码如下&#xff1a; //所有用到的页面都需要在 pages 数组中列出&#xff0c;否则小程序可能会出现错误或…

YOLO v2(2016.12)

文章目录 AbstractIntroduction当前存在的困境基于此&#xff0c;我们给出了方法 BetterBatch NormalizationHigh Resolution ClassifierConvolutional With Anchor BoxesDimension ClustersDirect location predictionFine-Grained FeaturesMulti-Scale TrainingFurther Exper…

Python教程:随机函数,开始猜英文单词的游戏

开始猜英文单词的游戏… 总计生命次数&#xff1a;3次 -----------游戏开始中…----------- &#xff1f;&#xff1f;&#xff1f;&#xff1f;请猜一个&#xff0c;4位数的单词:mafr 猜错了&#xff0c;再努力一下 -----------你还有2次生命------------ ma&#xff1f;&…

如何防范AI诈骗

如何防范AI诈骗 &#x1f607;博主简介&#xff1a;我是一名正在攻读研究生学位的人工智能专业学生&#xff0c;我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑&#xff0c;欢迎随时来交流哦&#xff01;&#x1f604; ✨座右铭&#…

这款AI-3D模型实现了无数人的建模梦

hi&#xff0c;同学们&#xff0c;本期是第25期AI生产力工具教程 别说各位&#xff0c;连我也不敢信&#xff0c;现在制作3D模型比泡杯奶茶的时间还要快&#xff01; 最近发现了一个天花板级的图片生成3D模型的AI工具——Artefacts.Ai&#xff0c;喂1张图片&#xff0c;就能创…

《持续交付:发布可靠软件的系统方法》- 读书笔记(十一)

持续交付&#xff1a;发布可靠软件的系统方法&#xff08;十一&#xff09; 第三部分——交付生态圈第 11 章 基础设施和环境管理11.1 引言11.2 理解运维团队的需要11.2.1 文档与审计11.2.2 异常事件的告警11.2.3 保障 IT 服务持续性的计划11.2.4 使用运维团队熟悉的技术 11.3 …

11.4-GPT4AllTools版本已开始对小部分GPT3.5用户内测推送

OpenAI已经开始小规模推送GPT4 AllTools功能&#xff0c;部分GPT博主已经第一时间体验了此功能&#xff0c;此功能特色是整合目前的多模态功能以及文件上传和联网模块&#xff0c;无需切换&#xff0c;更要全面综合 可上传包括 PDF、数据文件在内的任意文档&#xff0c;并进行分…

idea使用lombok编译问题

idea编译报错问题如下&#xff1a; java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled.Your processor is: com.sun.proxy.$Proxy26Lombok supports: OpenJDK javac, ECJ解决方案&#xff1a;在idea配置中File->Setti…

Java_类和对象详解

文章目录 前言简单认识类类定义和使用类的实例化引用的一些注意事项 类和对象的说明及关系this引用为什么要有this引用this应用this特性 构造方法构造特性及应用用this简化用idea编译器快捷创建构造 封装封装的概念访问限定符 封装的扩展-包包的概念导入包中的类自定义包常见的…

数据结构(c语言版) 顺序表

代码 #include <stdio.h> #include <stdlib.h>typedef int E; //这里我们的元素类型就用int为例吧&#xff0c;先起个别名//定义结构体 struct List{E * array;int capacity; //数组的容量int size; };//给结构体指针起别名 typedef struct List * ArrayLis…

【每日OJ题—— 141. 环形链表(链表)】

每日OJ题—— 141. 环形链表&#xff08;链表&#xff09; 1.题目&#xff1a;141. 环形链表2.方法讲解2.1 解法2.1.1 图文解析2.1.2 代码的实现2.1.3提交通过展示 1.题目&#xff1a;141. 环形链表 2.方法讲解 2.1 解法 2.1.1 图文解析 我们可以根据上述思路来解决本题。具体…

一机服务万人,拓世法宝AI智能商业数字人一体机,解锁文旅新表达

在人工智能的强劲推动下&#xff0c;人们走进了一个令人振奋的数字化时代。如何让文化传承与现代科技完美融合&#xff0c;成为一个十分有趣的议题&#xff0c;当AI技术结合文旅生活&#xff0c;便悄然开启了一种全新的旅游服务模式——AI数字文旅。 在我国国家博物馆、文旅大…

重生奇迹mu翅膀的合成!

你熟悉合成流程的话&#xff0c;只要拥有足够的材料&#xff0c;你便能拥有自己心仪的翅膀&#xff01;它的存在不仅仅只是美丽&#xff0c;其属性更是远远超过一般的装备概念&#xff0c;对游戏人物的加成幅度值得你投入&#xff01; 职业不同且翅膀各异 重生奇迹mu里面有着…

“抖音电商:颠覆传统,助力创新,引领未来电商新潮流“

一、引言 随着科技的飞速发展&#xff0c;电子商务已经成为人们日常生活的重要组成部分。近年来&#xff0c;抖音电商的异军突起&#xff0c;以其独特的助力方式&#xff0c;打破了传统电商的格局&#xff0c;引领了电商行业的新潮流。本文将探讨抖音电商的助力方式&#xff0…

正逆解项目

主要概念 正解&#xff1a;根据传动链的关节角度计算位置信息、旋量、姿态四位数、旋转矩阵 逆解&#xff1a;根据位置信息、旋量、姿态四位数、旋转矩阵计算传动链的关节角度 主要指责 下图为逆解的主要数据格式&#xff0c;Java端主要负责作为服务端接受客户端的报文消息&…

安全好用的远程协同运维软件重点推荐-行云管家

对于运维小伙伴而言&#xff0c;一个安全好用的远程协同运维软件至关重要&#xff0c;不仅可以提高工作率&#xff0c;降低工作风险&#xff0c;还能快速解决运维难题。目前市面上远程协同运维软件品牌比较多&#xff0c;这里我们小编给推荐行云管家IT远程协同运维平台。 安全…

不用流氓软件,如何在户外使用手机听下载到家中电脑里的音乐文件呢?

文章目录 本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是本教程使用环境&#xff1a;1 群晖系统安装audiostation套件2 下载移动端app3 内网穿透&#xff0c;映射至公网 很多老铁想在上班路上听点喜欢的歌或者相声解解闷儿&#xff0c;于是打开手…