当前位置: 首页 > article >正文

七. Redis 当中 Jedis 的详细刨析与使用

七. Redis 当中 Jedis 的详细刨析与使用

文章目录

  • 七. Redis 当中 Jedis 的详细刨析与使用
  • 1. Jedis 概述
  • 2. Java程序中使用Jedis 操作 Redis 数据
    • 2.1 Java 程序使用 Jedis 连接 Redis 的注意事项
    • 2.2 Java程序通过 Jedis当中操作 Redis 的 key 键值对
    • 2.3 Java程序通过 Jedis 当中操作 Redis 的 string 字符串
    • 2.4 Java程序通过 Jedis 当中操作 Redis 的 list 列表
    • 2.5 Java程序通过 Jedis 当中操作 Redis 的 set 集合
    • 2.6 Java程序通过 Jedis 当中操作 Redis 的 hash 哈希表
    • 2.7 Java程序通过 Jedis 当中操作 Redis 的 Zset 有序集合
  • 3. 最后:


1. Jedis 概述

Jedis 是 Java程序操作 Redis 的工具,就像Java操作MySQL时的JDBC一样的功能

Jedis 工作示意图:

在这里插入图片描述

Jedis 的API 文档: https://www.javadoc.io/doc/redis.clients/jedis/latest/index.html

在这里插入图片描述

下面是来自一位网上网友总结的 Jedis中文文档:这里搬运了一下: https://blog.csdn.net/CYY941027/article/details/109110455

创建 Jedis 对象,使用对应的构造器:

在这里插入图片描述

键值对的操作:

在这里插入图片描述

字符串操作:

在这里插入图片描述

整数和浮点数操作:

在这里插入图片描述

列表List 操作:

在这里插入图片描述

集合(Set) 操作:

在这里插入图片描述

哈希表(Hash) 操作:

在这里插入图片描述

有序集合(Zsort) 操作:

在这里插入图片描述

排序操作:

在这里插入图片描述

我们可以观察到上述 API 的方法,可以明显的发觉这些就是我们在 Redis 当中敲的命令,只不过是被替换成了Java当中的方法使用了。因为我们是要在Java程序当中操作 Redis 的,所以自然是要将命令转换为Java当中的方法来操作。

2. Java程序中使用Jedis 操作 Redis 数据

快速入门:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

我们想要使用 jedis 需要在 pom.xml 文件当中引入相关的 jar 依赖。

在这里插入图片描述

<dependencies><!--        引入 jedis 依赖--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.2.0</version></dependency></dependencies>

Java 程序通过 Jedis 连接数据库之前,需要先将 Linux 当中安装的 Redis 服务器启动起来。

[root@localhost bin]# redis-server /etc/redis.conf # 启动 redis 服务器
[root@localhost bin]# redis-cli # 进入到 Redis 客户端

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.1 Java 程序使用 Jedis 连接 Redis 的注意事项

在这里插入图片描述

package com.rainbowsea.jedis;import org.junit.Test;
import redis.clients.jedis.Jedis;public class JedisTest {// 连接 Redis@Testpublic void con() {// 使用 ip地址 + redis的端口的构造器方法Jedis jedis = new Jedis("192.168.76.145", 6379);String ping = jedis.ping();System.out.println("连接成功 ping 返回的结果 = " + ping);jedis.close();  // 关闭连接}
}

ip地址没错,我们是复制过来的。端口号也没错,是默认的6379 。可显示连接不上。同时还提示我们连接超时了。

在这里插入图片描述

原因和解决方法:

  1. 第一个原因是:我们 Linux 当中的对于 6379 这个端口的防火墙是关闭的。如果防火墙是对于该 6379 端口是关闭,不是开放的。我们外界是无法连接上该端口的。所以我们需要在 Linux 当中将该 6379 端口打开开启。让我们外界(Java 程序)可以连接该 6379端口。

具体操作如下:

[root@localhost bin]# firewall-cmd --list-all

在这里插入图片描述

设置开放的端口号:

[root@localhost bin]# firewall-cmd --add-port=6379/tcp --permanent

在这里插入图片描述

注意:设置后开放端口以后,还得重启一下防火墙才能生效。

重启防火墙:

[root@localhost bin]# firewall-cmd --reload # 重启防火墙

在这里插入图片描述

再次执行 firewall-cmd --list-all 命令查看是否,将 6379 端口打开成功。

[root@localhost bin]# firewall-cmd --list-all

在这里插入图片描述

  1. 第二个原因:在Redis 当中的 /etc/redis.conf 文件当中,存在一个 bind ,设置:我们需要将其设置为远程访问的设置。而不是本机设置。

使用 vim 打开该文件,进行修改。

[root@localhost bin]# vim /etc/redis.conf

在这里插入图片描述

在这里插入图片描述

# bind 127.0.0.1 -::1

同样修改了配置之后,需要关闭 Redis 服务,再启动 Redis 服务,配置才能生效。

[root@localhost ~]# redis-cli -p 6379 shutdown # 关闭 Redis 服务
[root@localhost bin]# redis-server /etc/redis.conf # 重启Redis 服务器

在这里插入图片描述

  1. 第三个原因:我们还需要将 protected-mode yes 修改为 no 关闭保护模式,如下图所示
protected-mode no

在这里插入图片描述

同样修改了配置之后,需要关闭 Redis 服务,再启动 Redis 服务,配置才能生效。

我们再次尝试在Java程序当中连接 Redis 。

在这里插入图片描述

  1. Redis 默认是没有配置密码的,但是,没有密码的话,我们 Jedis 会认为是不安全的。我们为 Redis 配置密码。在 /etc/redis.conf 文件当中的 requirepass 配置密码。如下图所示:
 requirepass rainbowsea

在这里插入图片描述

同样修改了配置之后,需要关闭 Redis 服务,再启动 Redis 服务,配置才能生效。

设置密码后:使用 auth 密码 登录。

在这里插入图片描述

在这里插入图片描述

我们再次尝试在Java程序当中连接 Redis 。

注意: 这里我们 Redis 设置了密码,所以我们Java程序连接的时候,需要先执行 auth() 方法进行一个认证登录,才能连接上 Redis 服务。不然是无法连接数上的。

在这里插入图片描述

package com.rainbowsea.jedis;import org.junit.Test;
import redis.clients.jedis.Jedis;public class JedisTest {// 连接 Redis// 1. 如果Redis 设置了密码,则需要进行身份校验// 2. 因为需要连接到 redis端口,比如6379,就需要配置防火墙,放开端口// 3. 注意修改 bind ,支持远程连接// 4 注意关闭保护模式,protected-mode no ,no表示关闭// 5. 注意:设置了密码,需要执行 auth(密码)进行身份验证@Testpublic void con() {// 使用 ip地址 + redis的端口的构造器方法Jedis jedis = new Jedis("192.168.76.145", 6379);// 如果Redis 配置了密码,则需要进行身份校验jedis.auth("rainbowsea");String ping = jedis.ping();System.out.println("连接成功 ping 返回的结果 = " + ping);jedis.close();  // 关闭当前连接,注意并没有关闭 Redis}
}

2.2 Java程序通过 Jedis当中操作 Redis 的 key 键值对

在 Redis 当中是什么命令操作 key的,那么在Java程序中就以该命令的方法操作 key

在这里插入图片描述

在这里插入图片描述


import org.junit.Test;
import redis.clients.jedis.Jedis;import java.util.Set;public class JedisTest {// key 操作@Testpublic void key() {// 创建 jedis 连接对象Jedis jedis = new Jedis("192.168.76.145", 6379);// 密码身份登录jedis.auth("rainbowsea");jedis.set("k1", "v1");jedis.set("k2", "v2");jedis.set("k3", "v3");// 获取keySet<String> keys = jedis.keys("*");for (String key : keys) {System.out.println("key=>" + key);}// 判断 key 是否存在System.out.println("exists:" + jedis.exists("k1")); // TrueSystem.out.println("exists: " + jedis.exists("k99"));// ttlSystem.out.println("ttl:" + jedis.ttl("k2"));System.out.println("k3 = " + jedis.get("k3")); // v3jedis.close();// 关闭当前连接}
}

2.3 Java程序通过 Jedis 当中操作 Redis 的 string 字符串

在这里插入图片描述


import org.junit.Test;
import redis.clients.jedis.Jedis;import java.util.List;
import java.util.Set;public class JedisTest {// string 操作@Testpublic void string() {// 创建 jedis 连接对象Jedis jedis = new Jedis("192.168.76.145", 6379);// 密码身份登录jedis.auth("rainbowsea");// 批量设置k-vjedis.mset("s1","jack","s2","scott","s3","rainbow");// 批量获取List<String> mget = jedis.mget("s1", "s2");for (String s : mget) {System.out.println("s -> " + s);}jedis.close();}
}

2.4 Java程序通过 Jedis 当中操作 Redis 的 list 列表

在这里插入图片描述


import org.junit.Test;
import redis.clients.jedis.Jedis;import java.util.List;
import java.util.Set;public class JedisTest {// list 操作@Testpublic void list() {// 创建 jedis 连接对象Jedis jedis = new Jedis("192.168.76.145", 6379);// 密码身份登录jedis.auth("rainbowsea");// 添加 list 数据jedis.lpush("name_list", "jack", "tom", "nono");List<String> nameList = jedis.lrange("name_list", 0, -1);for (String name : nameList) {System.out.println("name -->" + name);}jedis.close();}
}

2.5 Java程序通过 Jedis 当中操作 Redis 的 set 集合

在这里插入图片描述


import org.junit.Test;
import redis.clients.jedis.Jedis;import java.util.List;
import java.util.Set;public class JedisTest {// set 操作@Testpublic void set() {// 创建 jedis 连接对象Jedis jedis = new Jedis("192.168.76.145", 6379);// 密码身份登录jedis.auth("rainbowsea");jedis.sadd("city","北京","上海");jedis.sadd("city","广州");jedis.sadd("city","深圳");Set<String> smembers = jedis.smembers("city");for (String city : smembers) {System.out.println("city -->" + city);}jedis.close(); // 关闭连接}
}

2.6 Java程序通过 Jedis 当中操作 Redis 的 hash 哈希表

在这里插入图片描述


import org.junit.Test;
import redis.clients.jedis.Jedis;import java.util.List;
import java.util.Set;public class JedisTest {// hash操作@Testpublic void hash() {// 创建 jedis 连接对象Jedis jedis = new Jedis("192.168.76.145", 6379);// 密码身份登录jedis.auth("rainbowsea");jedis.hset("hash01", "name", "李白");jedis.hset("hash01", "age", "18");// 获取hash 的值String name = jedis.hget("hash01", "name");System.out.println("name - >" + name);jedis.close();}
}

也可以先构建一个 Java的 map,然后再加入到 Redis 当中的 hash 值当中。

在这里插入图片描述


import org.junit.Test;
import redis.clients.jedis.Jedis;import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;public class JedisTest {// hash操作@Testpublic void hash2() {// 创建 jedis 连接对象Jedis jedis = new Jedis("192.168.76.145", 6379);// 密码身份登录jedis.auth("rainbowsea");// 先构建一个Java的mapMap<String, String> maps = new HashMap<>();maps.put("job", "Java工程师");maps.put("name", "李华");maps.put("emial", "lihua@qq.com");jedis.hset("hash02", maps);// 获取hash 的值List<String> person = jedis.hmget("hash02", "name", "job", "emial");for (String s : person) {System.out.println("s = >" + s);}jedis.close();}
}

2.7 Java程序通过 Jedis 当中操作 Redis 的 Zset 有序集合

在这里插入图片描述


import org.junit.Test;
import redis.clients.jedis.Jedis;import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;public class JedisTest {// zset 有序集合操作@Testpublic void zset() {// 创建 jedis 连接对象Jedis jedis = new Jedis("192.168.76.145", 6379);// 密码身份登录jedis.auth("rainbowsea");jedis.zadd("heros", 1, "关羽");jedis.zadd("heros", 2, "张飞");jedis.zadd("heros", 3, "赵云");jedis.zadd("heros", 4, "马超");jedis.zadd("heros", 5, "黄忠");// 取出Set<String> heros = jedis.zrange("heros", 0, -1);  // 默认是升序(根据 score 评分值升序)for (String hero : heros) {System.out.println("hero = " + hero);}jedis.close();}
}

注意: 可以使用 zrevrange() 方法/命令,是个降序(根据 score评分值进行降序)

Set<String> heros = jedis.zrevrange("heros", 0, -1);  // 降序(根据 score 评分值降序)

在这里插入图片描述


import org.junit.Test;
import redis.clients.jedis.Jedis;import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;public class JedisTest {// zset 有序集合操作@Testpublic void zset() {// 创建 jedis 连接对象Jedis jedis = new Jedis("192.168.76.145", 6379);// 密码身份登录jedis.auth("rainbowsea");jedis.zadd("heros", 1, "关羽");jedis.zadd("heros", 2, "张飞");jedis.zadd("heros", 3, "赵云");jedis.zadd("heros", 4, "马超");jedis.zadd("heros", 5, "黄忠");// 取出//Set<String> heros = jedis.zrange("heros", 0, -1);  // 默认是升序(根据 score 评分值升序)Set<String> heros = jedis.zrevrange("heros", 0, -1);  // 降序(根据 score 评分值降序)for (String hero : heros) {System.out.println("hero = " + hero);}jedis.close();}
}

3. 最后:

感谢网友的总结:https://blog.csdn.net/CYY941027/article/details/109110455

“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”

在这里插入图片描述

相关文章:

七. Redis 当中 Jedis 的详细刨析与使用

七. Redis 当中 Jedis 的详细刨析与使用 文章目录 七. Redis 当中 Jedis 的详细刨析与使用1. Jedis 概述2. Java程序中使用Jedis 操作 Redis 数据2.1 Java 程序使用 Jedis 连接 Redis 的注意事项2.2 Java程序通过 Jedis当中操作 Redis 的 key 键值对2.3 Java程序通过 Jedis 当中…...

Vue3学习笔记-事件-4

一、事件处理 使用v-on或者后面加事件&#xff1a; <template><button v-on:click"addCount()">{{count}}</button> </template> 二、事件传参 传event&#xff1a; 不传参时&#xff0c;默认自动接收 event 传自定义参数时&#xff0c…...

艾瑞泽8车机安装软件

电脑安装搞机助手 车机打开工程模式/加密项 密码是序列号*802018 打开adb 电脑打开搞机助手/扩展功能/cmd命令行 把安装包放入adb 输入adb push F:\carapk\qq_music_car.apk /data/local/tmp 格式&#xff1a; adb push 电脑路径 adb路径 进入abd adb shell 进入指定文件夹 cd …...

c++ list的front和pop_front的概念和使用案例

在 C 中&#xff0c;std::list 是一种双向链表容器&#xff0c;提供了对序列中元素的快速插入和删除操作。以下是 std::list 容器的 front 和 pop_front 方法的概念和使用案例。 front 概念&#xff1a;front 成员函数返回对 std::list 容器中第一个元素的引用。如果列表为空…...

NLP深度学习 DAY5:Sequence-to-sequence 模型详解

Seq2Seq&#xff08;Sequence-to-Sequence&#xff09;模型是一种用于处理输入和输出均为序列任务的深度学习模型。它最初被设计用于机器翻译&#xff0c;但后来广泛应用于其他任务&#xff0c;如文本摘要、对话系统、语音识别、问答系统等。 核心思想 Seq2Seq 模型的目标是将…...

04树 + 堆 + 优先队列 + 图(D1_树(D17_综合刷题练习))

目录 1. 二叉树的前序遍历&#xff08;简单&#xff09; 1.1. 题目描述 1.2. 解题思路 方法一&#xff1a;递归&#xff08;推荐使用&#xff09; 方法二&#xff1a;非递归&#xff08;扩展思路&#xff09; 2. 二叉树的中序遍历&#xff08;中等&#xff09; 2.1. 题目…...

猫眼Java开发面试题及参考答案(上)

详细介绍项目,像项目中如何用 Redis,用到 Redis 哪些数据类型,项目中遇到哪些问题,怎么解决的 在我参与的一个电商项目中,Redis 发挥了至关重要的作用。这个电商项目主要是为用户提供商品浏览、购物车管理、订单处理等一系列功能。 在项目中使用 Redis 主要是为了提升系统…...

理解PLT表和GOT表

1 简介 现代操作系统都是通过库来进行代码复用&#xff0c;降低开发成本提升系统整体效率。而库主要分为两种&#xff0c;一种是静态库&#xff0c;比如windows的.lib文件&#xff0c;macos的.a&#xff0c;linux的.a&#xff0c;另一种是动态库&#xff0c;比如windows的dll文…...

总结11..

#include <stdio.h> #include <string.h> #define MAXN 1001 #define MAXM 1000001 int n, m; char maze[MAXN][MAXN]; int block[MAXN][MAXN]; // 标记每个格子所属的连通块编号 int blockSize[MAXN * MAXN]; // 记录每个连通块的大小 int dx[] {0, 0, 1, -1};…...

35.Word:公积金管理中心文员小谢【37】

目录 Word1.docx ​ Word2.docx Word2.docx ​ 注意本套题还是与上一套存在不同之处 Word1.docx 布局样式的应用设计页眉页脚位置在水平/垂直方向上均相对于外边距居中排列&#xff1a;格式→大小对话框→位置→水平/垂直 按下表所列要求将原文中的手动纯文本编号分别替换…...

FinRobot:一个使用大型语言模型的金融应用开源AI代理平台

“FinRobot: An Open-Source AI Agent Platform for Financial Applications using Large Language Models” 论文地址&#xff1a;https://arxiv.org/pdf/2405.14767 Github地址&#xff1a;https://github.com/AI4Finance-Foundation/FinRobot 摘要 在金融领域与AI社区间&a…...

C基础寒假练习(2)

一、输出3-100以内的完美数&#xff0c;(完美数&#xff1a;因子和(因子不包含自身)数本身 #include <stdio.h>// 函数声明 int isPerfectNumber(int num);int main() {printf("3-100以内的完美数有:\n");for (int i 3; i < 100; i){if (isPerfectNumber…...

【网络】应用层协议http

文章目录 1. 关于http协议2. 认识URL3. http协议请求与响应格式3.1 请求3.2 响应 3. http的常见方法4. 状态码4.1 常见状态码4.2 重定向 5. Cookie与Session5.1 Cookie5.1.1 认识Cookie5.1.2 设置Cookie5.1.3 Cookie的生命周期 5.2 Session 6. HTTP版本&#xff08;了解&#x…...

RabbitMQ深度探索:简单实现 MQ

基于多线程队列实现 MQ &#xff1a; 实现类&#xff1a; public class ThreadMQ {private static LinkedBlockingDeque<JSONObject> broker new LinkedBlockingDeque<JSONObject>();public static void main(String[] args) {//创建生产者线程Thread producer n…...

React+AI 技术栈(2025 版)

文章目录 核心&#xff1a;React TypeScript元框架&#xff1a;Next.js样式设计&#xff1a;Tailwind CSSshadcn/ui客户端状态管理&#xff1a;Zustand服务器状态管理&#xff1a;TanStack Query动画效果&#xff1a;Motion测试工具表格处理&#xff1a;TanStack Table表单处理…...

计算机从何而来?计算技术将向何处发展?

计算机的前生&#xff1a;机械计算工具的演进 算盘是计算机的起点&#xff0c;它其实是一台“机械式半自动化运算器”。打算盘的“口诀”其实就是它的编程语言&#xff0c;算盘珠就是它的存储器。 第二阶段是可以做四则运算的加法器、乘法器。1642年&#xff0c;法国数学家帕斯…...

Docker使用指南(二)——容器相关操作详解(实战案例教学,创建/使用/停止/删除)

目录 1.容器操作相关命令​编辑 案例一&#xff1a; 案例二&#xff1a; 容器常用命令总结&#xff1a; 1.查看容器状态&#xff1a; 2.删除容器&#xff1a; 3.进入容器&#xff1a; 二、Docker基本操作——容器篇 1.容器操作相关命令 下面我们用两个案例来具体实操一…...

从通讯工具到 AI 助理,AI手机如何发展?

随着AI进军各行各业&#xff0c;全面AI化时代已经到来。手机&#xff0c;作为现代人类的“数字器官”之一&#xff0c;更是首当其冲地融入了这一变革浪潮之中。 2024年年初&#xff0c;OPPO联合IDC发布了《AI手机白皮书》&#xff0c;公布OPPO已迈向AI手机这一全新阶段。到如今…...

小程序-基础加强

前言 这一节把基础加强讲完 1. 导入需要用到的小程序项目 2. 初步安装和使用vant组件库 这里还可以扫描二维码 其中步骤四没什么用 右键选择最后一个 在开始之前&#xff0c;我们的项目根目录得有package.json 没有的话&#xff0c;我们就初始化一个 但是我们没有npm这个…...

【CSS】谈谈你对BFC的理解

理解 CSS 中的 BFC&#xff08;块格式化上下文&#xff09; 在 CSS 中&#xff0c;BFC&#xff08;Block Formatting Context&#xff09; 是一个非常重要的概念&#xff0c;它决定了元素如何对其子元素进行定位&#xff0c;以及与其他元素的关系。理解 BFC 对于解决常见的布局…...

kubernetes-部署性能监控平台

在当今快速发展的云计算时代&#xff0c;Kubernetes 已成为容器编排的事实标准。随着越来越多的应用迁移到 Kubernetes 平台上&#xff0c;如何有效地监控集群的健康状态、资源使用情况以及应用性能变得尤为重要。一个完善的监控系统可以帮助我们及时发现问题、优化资源配置&am…...

【Uniapp-Vue3】iconfont图标库的使用

先在iconfont图标库中将需要的图标加入购物车 点击右侧购物车的图标 点击添加至项目&#xff0c;可以选中项目进行加入&#xff0c;也可以点击文件加号创建一个新的项目并添加 加入以后会来到如下界面&#xff0c;点击下载至本地 双击打开下载的.zip文件 将.css和.ttf文件进…...

Linux find 命令 | grep 命令 | 查找 / 列出文件或目录路径 | 示例

注&#xff1a;本文为 “Linux find 命令 | grep 命令使用” 相关文章合辑。 未整理去重。 如何在 Linux 中查找文件 作者&#xff1a; Lewis Cowles 译者&#xff1a; LCTT geekpi | 2018-04-28 07:09 使用简单的命令在 Linux 下基于类型、内容等快速查找文件。 如果你是 W…...

Day 28 卡玛笔记

这是基于代码随想录的每日打卡 77. 组合 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ]示例 2…...

1.PPT:天河二号介绍【12】

目录 NO1 NO2.3.4.5 NO6.7.8.9​ NO1 PPT&#xff1a;新建一个空白演示文档→保存到考生文件夹下&#xff1a;天河二号超级计算机.pptx幻灯片必须选择一种设计主题&#xff1a;设计→主题&#xff08;随便选中一种&#xff09;幻灯片的版式&#xff1a;开始→版式&#x…...

AI大模型开发原理篇-4:神经概率语言模型NPLM

神经概率语言模型&#xff08;NPLM&#xff09;概述 神经概率语言模型&#xff08;Neural Probabilistic Language Model, NPLM&#xff09; 是一种基于神经网络的语言建模方法&#xff0c;它将传统的语言模型和神经网络结合在一起&#xff0c;能够更好地捕捉语言中的复杂规律…...

物联网领域的MQTT协议,优势和应用场景

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;作为轻量级发布/订阅协议&#xff0c;凭借其低带宽消耗、低功耗与高扩展性&#xff0c;已成为物联网通信的事实标准。其核心优势包括&#xff1a;基于TCP/IP的异步通信机制、支持QoS&#xff08;服务质量&…...

电控---中断

中断 1.处理器系统在执行代码的时候&#xff0c;会从存储器依次取出指令和数据&#xff0c;这种能力需要在处理器里保存一个存储器地址&#xff0c;就是所谓的程序计数器&#xff08;Program Counter,PC&#xff09;&#xff0c;也叫程序指针 2.当外部中断&#xff08;Extern …...

动态规划DP 背包问题 多重背包问题(朴素版+二进制优化+单调队列)

概览检索 动态规划DP 概览&#xff08;点击链接跳转&#xff09; 动态规划DP 背包问题 概览&#xff08;点击链接跳转&#xff09; 多重背包问题1 原题链接 AcWiing 4. 多重背包问题1 题目描述 有 N种物品和一个容量是 V的背包。 第 i 种物品最多有 si件&#xff0c;每件体…...

调试与错误修复:Cursor 如何成为你的编程助手

引言 调试是软件开发过程中最耗时且最具挑战性的环节之一。据统计&#xff0c;开发者平均将 50% 以上的编码时间 用于定位和修复错误。传统调试工具&#xff08;如断点调试器、日志分析&#xff09;虽能解决问题&#xff0c;但往往需要开发者手动追溯代码执行流程&#xff0c;…...