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

springboot3 redis 常用操作工具类

在 Spring Boot 3 中,操作 Redis 通常使用 Spring Data Redis 提供的工具类,如 RedisTemplate 和 StringRedisTemplate。以下是一个详细的 Redis 操作工具类的实现,涵盖了常用功能。

完整的 Redis 工具类

以下工具类可以实现基本的 Redis 操作,例如字符串、哈希、列表、集合和有序集合等。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.*;
import org.springframework.stereotype.Component;import java.util.*;
import java.util.concurrent.TimeUnit;@Component
public class RedisUtils {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;/*** 设置值*/public void set(String key, Object value, long timeout, TimeUnit timeUnit) {redisTemplate.opsForValue().set(key, value, timeout, timeUnit);}/*** 获取值*/public Object get(String key) {return redisTemplate.opsForValue().get(key);}/*** 删除键*/public void delete(String key) {redisTemplate.delete(key);}/*** 批量删除*/public void deleteKeys(String pattern) {Set<String> keys = redisTemplate.keys(pattern);if (keys != null && !keys.isEmpty()) {redisTemplate.delete(keys);}}/*** 设置键的过期时间*/public boolean expire(String key, long timeout, TimeUnit unit) {return Boolean.TRUE.equals(redisTemplate.expire(key, timeout, unit));}/*** 获取剩余过期时间*/public long getExpire(String key) {return Optional.ofNullable(redisTemplate.getExpire(key)).orElse(0L);}/*** 检查键是否存在*/public boolean hasKey(String key) {return Boolean.TRUE.equals(redisTemplate.hasKey(key));}/*** 增加值*/public long increment(String key, long delta) {return Optional.ofNullable(redisTemplate.opsForValue().increment(key, delta)).orElse(0L);}/*** 哈希操作:设置值*/public void hSet(String key, String hashKey, Object value) {redisTemplate.opsForHash().put(key, hashKey, value);}/*** 哈希操作:获取值*/public Object hGet(String key, String hashKey) {return redisTemplate.opsForHash().get(key, hashKey);}/*** 列表操作:左推入*/public void lPush(String key, Object value) {redisTemplate.opsForList().leftPush(key, value);}/*** 列表操作:右弹出*/public Object rPop(String key) {return redisTemplate.opsForList().rightPop(key);}/*** 集合操作:添加元素*/public void sAdd(String key, Object... values) {redisTemplate.opsForSet().add(key, values);}/*** 集合操作:获取所有元素*/public Set<Object> sMembers(String key) {return redisTemplate.opsForSet().members(key);}/*** 有序集合操作:添加元素*/public void zAdd(String key, Object value, double score) {redisTemplate.opsForZSet().add(key, value, score);}/*** 有序集合操作:获取范围内的元素*/public Set<Object> zRange(String key, long start, long end) {return redisTemplate.opsForZSet().range(key, start, end);}
}

工具类的使用

设置和获取值

@Autowired
private RedisUtils redisUtils;public void testSetValue() {redisUtils.set("key", "value", 10, TimeUnit.MINUTES);Object value = redisUtils.get("key");System.out.println("Value: " + value);
}

删除键

redisUtils.delete("key");

哈希操作

redisUtils.hSet("hashKey", "field", "value");
Object value = redisUtils.hGet("hashKey", "field");
System.out.println("Hash Value: " + value);

列表操作

redisUtils.lPush("listKey", "value1");
Object value = redisUtils.rPop("listKey");
System.out.println("List Value: " + value);

集合操作

redisUtils.sAdd("setKey", "value1", "value2");
Set<Object> members = redisUtils.sMembers("setKey");
System.out.println("Set Members: " + members);

有序集合操作

redisUtils.zAdd("zSetKey", "value1", 1.0);
Set<Object> range = redisUtils.zRange("zSetKey", 0, -1);
System.out.println("ZSet Range: " + range);

注意事项

使用合适的序列化方式 默认情况下,RedisTemplate 使用的是 JdkSerializationRedisSerializer,这可能导致数据在 Redis 中以二进制形式存储。你可以配置自定义的序列化器,例如 StringRedisSerializer 或 Jackson2JsonRedisSerializer。

示例配置:

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(connectionFactory);// 设置 Key 和 Value 的序列化器template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));// 设置 Hash Key 和 Value 的序列化器template.setHashKeySerializer(new StringRedisSerializer());template.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));template.afterPropertiesSet();return template;}
}

连接池和性能优化

使用 Redis 连接池提高性能,例如配置连接池大小和最大连接数。
避免频繁使用 keys 命令,生产环境建议使用 SCAN。

过期策略

对临时数据设置合理的过期时间,避免占用过多内存。

总结

工具类封装了 Redis 常见操作,方便调用和管理。
根据需求选择适合的 Redis 数据结构(String、Hash、List、Set、ZSet)。

配置合适的序列化方式和连接池,确保性能和数据易读性。

相关文章:

springboot3 redis 常用操作工具类

在 Spring Boot 3 中&#xff0c;操作 Redis 通常使用 Spring Data Redis 提供的工具类&#xff0c;如 RedisTemplate 和 StringRedisTemplate。以下是一个详细的 Redis 操作工具类的实现&#xff0c;涵盖了常用功能。 完整的 Redis 工具类 以下工具类可以实现基本的 Redis 操…...

OJ随机链表的复制题目分析

题目内容&#xff1a; 138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 分析&#xff1a; 这道题目&#xff0c;第一眼感觉非常乱&#xff0c;这是正常的&#xff0c;但是我们经过仔细分析示例明白后&#xff0c;其实也并不是那么难。现在让我们一起来分析分析…...

如何不修改模型参数来强化大语言模型 (LLM) 能力?

前言 如果你对这篇文章感兴趣&#xff0c;可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」&#xff0c;查看完整博客分类与对应链接。 大语言模型 (Large Language Model, LLM, e.g. ChatGPT) 的参数量少则几十亿&#xff0c;多则上千亿&#xff0c;对其的训…...

Win11+WLS Ubuntu 鸿蒙开发环境搭建(二)

参考文章 penHarmony南向开发笔记&#xff08;一&#xff09;开发环境搭建 OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——标准系统移植指南&#xff08;一&#xff09; OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——小型系统芯片移植指南&#xff08;二&…...

Qemu配置QXL显卡支持分辨率

默认情况下&#xff0c;创建的vm的视频RAM限制为16MB。在win操作系统中分辨率最高就只能调到1024x768。 <video><model typecirrus vram16384 heads1 primaryyes/><address typepci domain0x0000 bus0x00 slot0x02 function0x0/> </video>单单修改ram…...

Hack The Box-Starting Point系列Three

答案 How many TCP ports are open?&#xff08;靶机开了几个TCP端口&#xff09; 2What is the domain of the email address provided in the “Contact” section of the website?&#xff08;网站的“CONTACT”部分提供的电子邮件地址的域是什么&#xff1f;&#xff09…...

人工智能-Python多任务编程-进程、线程

多任务的实现方式 多进程 多线程 1 多任务的两种表现形式 并发: 在一段时间内交替去执行多个任务&#xff08;任务数大于CPU核心数&#xff09;并行: 在一段时间内真正的同时一起执行多个任务&#xff08;任务数小于等于CPU核心数&#xff09; 2 进程 进程&#xff08;Proc…...

智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之9 重新开始 之2

本文要点 对程序设计而言&#xff1a;前者基于一个自上而下的 分类体系--&#xff08;生物遗传基因&#xff09;&#xff0c;后者者需要一个收集差异的自下而上的差异继承路径--&#xff08;系统继承源流&#xff09; 就是 广义和狭义 分类学。 共性对齐 和 差异收集 正是两者…...

Postman[7] 内置动态参数及自定义的动态参数

postman 内置动态参数和自定义的动态参数 1.内置动态参数 格式&#xff1a;{{$参数名}} 1.1时间戳 {{$timestamp}} //生成当前时间的时间戳 1.2随机整数 {{$randomint}} //生成0-1000之间的随机数 1.3GUID字符串 {{$guid}} //生成随机GUID字符串 2.自定义动态参数 格式…...

04-c++类和对象(下)

一、友元 前面学习的类中&#xff0c;只能通过该类的公共方法访问私有数据。而如果将某个函数设置为类的友元&#xff0c;那么这个函数就可以直接访问该类的私有数据&#xff0c;破坏了类的封装性&#xff0c;只在某些特定的情况下使用。 友元的分类&#xff1a;普通全局函数…...

《解密奖励函数:引导智能体走向最优策略》

在强化学习领域&#xff0c;奖励函数是核心要素&#xff0c;它决定了智能体如何学习和决策。设计一个恰当的奖励函数&#xff0c;能让智能体在复杂环境中不断探索、优化&#xff0c;最终实现最优策略。 奖励函数的重要性 奖励函数就像是一个引导者&#xff0c;它告诉智能体什…...

AF3 AtomAttentionEncoder类的init_pair_repr方法解读

AlphaFold3 的 AtomAttentionEncoder 类中,init_pair_repr 方法方法负责为原子之间的关系计算成对表示(pair representation),这是原子转变器(atom transformer)模型的关键组成部分,直接影响对蛋白质/分子相互作用的建模。 init_pair_repr源代码: def init_pair_repr(…...

VScode 格式化代码空格记录

点击 -> “文件” -> “首选项" -> “设置” -> 按下图操作&#xff1a; 怎么格式化代码空格&#xff0c;先看下&#xff1a; 保存代码后&#xff0c;这代码自动格式化发&#xff0c;如下图&#xff1a; 你可以试试看就即可...

28.Marshal.PtrToStringAnsi C#例子

//怎么说呢&#xff0c;这个代码Marshal的英文意思有将军&#xff0c;控制等等&#xff0c; //我的理解是类似于console控制台。 //然后后面这个Ansi是一种ASCII的扩展&#xff0c;还有其他编码方式可选 就是一个把后面的指针转化为字符串的一个代码 这是用法…...

Git的使用流程(详细教程)

目录 01.Git是什么&#xff1f; 1.1 Git简介 1.2 SVN与Git的最主要的区别 1.3 GIt主要特点 02.Git是干什么的&#xff1f; 2.1.Git概念汇总 2.2 工作区/暂存区/仓库 2.3 Git使用流程 03.Git的安装配置 3.1 Git的配置文件 3.2 配置-初始化用户 3.3 Git可视化…...

第R3周:RNN-心脏病预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 文章目录 一、前言二、代码流程1、导入包&#xff0c;设置GPU2、导入数据3、数据处理4、构建RNN模型5、编译模型6、模型训练7、模型评估 电脑环境&#xff1a;…...

clickhouse Cannot execute replicated DDL query, maximum retries exceeded报错解决

报错信息 在clickhouse中执行DDL命令对表进行改动时&#xff0c;出现报错Cannot execute replicated DDL query, maximum retries exceeded 解决方案 一、官方解决方案 官方说这是一个特定版本的bug&#xff0c;但是实际我自己用的22.9.34版本&#xff0c;也存在这个问题&a…...

【时时三省】(C语言基础)常见的动态内存错误

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 对NULL指针的解引用操作 示例&#xff1a; malloc申请空间的时候它可能会失败 比如我申请一块非常大的空间 那么空间可能就会开辟失败 正常的话要写一个if&#xff08;p&#xff1d;&#x…...

【JVM】总结篇-字节码篇

字节码篇 Java虚拟机的生命周期 JVM的组成 Java虚拟机的体系结构 什么是Java虚拟机 虚拟机&#xff1a;指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统 &#xff0c;是物理机的软件实现。常用的虚拟机有VMWare&#xff0c;Visual Box&…...

二十三种设计模式-抽象工厂模式

抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种方式&#xff0c;用于创建一系列相关或相互依赖的对象&#xff0c;而不需要指定它们具体的类。这种模式主要用于系统需要独立于其产品的创建逻辑时&#xff0c;并且…...

【docker】Dockerfile 中使用宿主机代理的方式

在Dockerfile中配置代理主要有这几种方式&#xff0c;让我系统地整理一下&#xff1a; 构建参数方式&#xff08;BUILD ARG&#xff09; # 方式1&#xff1a;在Dockerfile顶部定义 ARG HTTP_PROXYhttp://proxy:7890 ARG HTTPS_PROXYhttp://proxy:7890# 方式2&#xff1a;在构…...

现代无线通信接收机架构:超外差、零中频与低中频的比较分析

写在前面&#xff1a;本博客是对三种接收机架构的学习笔记&#xff0c;仅供个人学习记录使用。内容主要是上网查阅的资料&#xff0c;以及个人的一些理解。如有错误的地方请指出&#xff01; 文章目录 一、通信机基本架构 1、射频发射级的基本组成及完成功能2、射频接收级的基…...

CSS 图片廊:网页设计的艺术与技巧

CSS 图片廊&#xff1a;网页设计的艺术与技巧 引言 在网页设计中&#xff0c;图片廊是一个重要的组成部分&#xff0c;它能够以视觉吸引的方式展示图片集合&#xff0c;增强用户的浏览体验。CSS&#xff08;层叠样式表&#xff09;作为网页设计的主要语言之一&#xff0c;提供…...

Gemini和ChatGPT全面对比分析,有什么区别和优势?

当 AI 聊天机器人首次出现时&#xff0c;每个人都在竞相发布自己的足够好的第一版 AI 聊天机器人&#xff0c;很容易在 Gemini 与 ChatGPT 等应用程序之间进行比较。但随着 Google 和 OpenAI 不断添加新功能、模型和访问其聊天机器人的方式&#xff0c;差异变得不那么明显。 现…...

Ansys Discovery 中的网格划分方法:探索模式

本篇博客文章将介绍 Ansys Discovery 中可用于在探索模式下进行分析的网格划分方法。我们将在下一篇博客中介绍 Refine 模式下的网格划分技术。 了解 Discovery Explore 模式下的网格划分 网格划分是将几何模型划分为小单元以模拟系统在不同条件下的行为的过程。这是通过创建…...

前 5 名 IPhone 解锁工具/软件

设备已禁用并且您无法访问它&#xff1f;如果您无法通过密码解锁&#xff0c;尝试 iPhone 解锁软件可能是最好的解决方案。 虽然市场上有很多免费或付费的 iPhone 解锁工具&#xff0c;但您可能不知道它们之间的区别以及如何选择最适合您的工具。 本文将介绍 5 款iPhone 解锁…...

富士通 自动进纸 扫描仪 scan 按钮 触发设置

附赠光盘里的驱动和软件都先装好&#xff0c;然后3步&#xff0c; 1&#xff0c;控制面板&#xff0c;对着设备右键&#xff0c;详细设置&#xff0c;触发对应&#xff0c;选择stream capture软件。&#xff08;差不多就这意思&#xff0c;懂的自然懂&#xff09; 2&#xff…...

SpringCloud系列教程:微服务的未来 (五)枚举处理器、JSON处理器、分页插件实现

在现代 Java 开发中&#xff0c;我们常常需要处理各种通用的功能和需求&#xff0c;诸如枚举的处理、JSON 数据处理&#xff0c;以及分页查询等。这些功能虽然看似简单&#xff0c;但在实际开发中往往涉及到许多细节和优化。为了提高开发效率、减少重复代码的编写&#xff0c;我…...

dos2unix: command not found

如果你在终端或命令行界面中遇到了“dos2unix: command not found”的错误&#xff0c;这意味着你的系统中没有安装dos2unix工具。dos2unix是一个用于将文本文件中的DOS/Mac格式的行结束符转换为Unix/Linux格式的行结束符的工具。 以下是一些解决方法&#xff1a; 安装dos2un…...

使用 Docker 查看 Elasticsearch 错误日志

在使用 Elasticsearch&#xff08;简称 ES&#xff09;的过程中&#xff0c;我们可能会遇到各种问题。为了快速定位和解决这些问题&#xff0c;查看错误日志是关键。本文将介绍如何使用 Docker 查看 Elasticsearch 的错误日志&#xff0c;并提供一些实用技巧。 1. 安装 Docker…...

Scala 访问修饰符

Scala 访问修饰符 在编程语言中&#xff0c;访问修饰符是一种重要的语法元素&#xff0c;它用于控制类、对象、特质、接口、方法和变量的访问级别。Scala作为一种多范式编程语言&#xff0c;也提供了丰富的访问修饰符&#xff0c;以实现封装和隐藏内部实现细节。本文将详细介绍…...

VisualRules规则引擎语法介绍

VisualRules规则引擎是一款用于处理复杂业务规则的引擎&#xff0c;广泛应用于金融、保险、医疗等领域。它通过将业务逻辑从代码中分离出来&#xff0c;以可配置的方式管理和执行规则。以下是VisualRules规则引擎的基本语法和使用方法&#xff1a; 1. 规则定义 规则通常由 条件…...

UDP_TCP

目录 1. 回顾端口号2. UDP协议2.1 理解报头2.2 UDP的特点2.3 UDP的缓冲区及注意事项 3. TCP协议3.1 报头3.2 流量控制2.3 数据发送模式3.4 捎带应答3.5 URG && 紧急指针3.6 PSH3.7 RES 1. 回顾端口号 在 TCP/IP 协议中&#xff0c;用 “源IP”&#xff0c; “源端口号”…...

web端显示spine动画

一、说明 &#xff08;1&#xff09;这边使用的spine版本是3.8.99 spine包含3个部分,可以将三个文件上传到cdn&#xff0c;三个文件放在相同的目录中 test.atlas 、 test.json 、test.png &#xff08;2&#xff09;pixi.js - v7.0.4 https://github.com/pixijs/pixijs &…...

【74HC192减法24/20/72进制】2022-5-17

缘由用74ls192设计一个72进制的减法计数器&#xff0c;需要有逻辑电路图-硬件开发-CSDN问答...

前端安全措施:接口签名、RSA加密、反调试、反反调试、CAPTCHA验证

文章目录 引言I 设置防爬虫功能使用robots.txt文件通过配置HTTP头部中的X-Robots-TagII 禁止打开开发者工具反复清空控制台无限debugger反调试检查是否按下了F12或其他调试快捷键禁用右键监听调试快捷键例子III 屏蔽粘贴/复制/剪切/选中IV 知识扩展: javascript内置命令调试分…...

算法攻略:顺序表的进阶之路——移除元素

题目如下&#xff1a; 思路&#xff1a; 双指针法 nums[src] val&#xff0c;srcnums[src] ! val&#xff0c;src的值赋值给dst&#xff0c;src和dst都 注&#xff1a; 1&#xff09;双指针法&#xff1a;只是抽象出了两个指向数组的变量&#xff0c;并不是真的指针。 2&#…...

zookeeper+kafka

一、zookeeper 1.概述 zoo: 开源的分布式框架协调服务 zookeeper的工作机制&#xff1a;基于观察者模式设计的分布式结构&#xff0c;负责存储和管理架构当中的元信息&#xff0c;架构当中的应用接受观察者的监控&#xff0c;一旦数据有变化&#xff0c;通知对应的zookeeper&a…...

大循环引起CPU负载过高

一、问题背景 环境&#xff1a;jdk1.8 tomcat7 在一次发布时&#xff0c;cpu出现负载过高&#xff0c;其负载突破200%&#xff0c;并且响应时间也大幅度超时。 二、问题分析 【1】发布前做过压测&#xff0c;并没有发现cpu异常升高的现象&#xff0c;所以其可能与生产环境的请…...

xdoj ROT13加密

标题 ROT13加密 问题描述 ROT13是一种古典加密方法&#xff0c;其加密原理是把一个字母用字母表位置相距13的字母来进行 替换&#xff0c;例如字母‘a’用字母‘n’来替换&#xff0c;字母‘z’用字母‘m’来替换。 输入一段字符串&#xff0c;然后把其中的大小写字母按照上…...

图数据库 | 17、高可用分布式设计(上)

我们在前面的文章中&#xff0c;探索了多种可能的系统扩展方式&#xff0c;以及每种扩展方式的优劣。 本篇文章将通过具体的架构设计方案来对每一种方案的设计、投入产出比、各项指标与功能&#xff0c;以及孰优孰劣等进行评价。 在设计高性能、高可用图数据库的时候&#xf…...

五类推理(逻辑推理、概率推理、图推理、基于深度学习的推理)的开源库 (一)

在开发中&#xff0c;有一些开源库可以实现不同类型的推理&#xff0c;包括逻辑推理、概率推理、图推理、基于深度学习的推理等。以下是五类推理&#xff08;逻辑推理、概率推理、图推理、基于深度学习的推理&#xff09;的现成开源库&#xff0c;它们各自的功能、特点和适用场…...

java Redisson 实现限流每秒/分钟/小时限制N个

1.引入maven包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.redisson</groupId><artifactId>red…...

麒麟操作系统服务架构保姆级教程(八)数据库拆分静态业务拆分和负载均衡

当我们网站的访问量提升上来了&#xff0c;平均每分钟上千条访问量&#xff0c;但是服务器的性能是有限的&#xff0c;所以就需要将单台的架构进行拆分了&#xff0c;但是web服务器的内容不同怎么办&#xff0c;就会用到咱们的共享存储&#xff0c;两台web服务器今天咱们将LNMP…...

LQ24fresh

目录 C. 录入成绩 D. 标记名字 E. 奖杯排列 C. 录入成绩 &#xff08;1&#xff09;以国特 G 为切入点&#xff0c;枚举每一个 G 单独时是否为合法字符串&#xff0c;若合法 G1 有多少个 &#xff08;2&#xff09;用到的两个 string 函数&#xff1a; s.erase( i, a ) &…...

Postman[8] 断言

1.常见的断言类型 status code: code is 200 //检查返回的状态码是否为200 Response body&#xff1a; contain string //检查响应中包含指定字符串包含指定的值 response body:json value check/ /检查响应中其中json的值 Response body&#xff1a; is equal to string …...

YOLOv8/YOLOv11改进 添加CBAM、GAM、SimAM、EMA、CAA、ECA、CA等多种注意力机制

目录 前言 CBAM GAM SimAM EMA CAA ECA CA 添加方法 YAML文件添加 使用改进训练 前言 本篇文章将为大家介绍Ultralytics/YOLOv8/YOLOv11中常用注意力机制的添加&#xff0c;可以满足一些简单的涨点需求。本文仅写方法&#xff0c;原理不多讲解&#xff0c;需要可跳…...

C语言return与 ? :

上次讲解过一次函数&#xff0c;函数要配合return返回东西&#xff0c;但是在编写一些程序的时候我发现了很多冷门逻辑语法还没有掌握&#xff0c;当时讲课也是看一眼就过去了&#xff08;死去的记忆开始攻击我&#xff09; Return&#xff0c;爽&#xff01; 现在有一个小问…...

持续大额亏损,销量增幅有限,北汽蓝谷依旧黯然神伤

撰稿 | 行星 来源 | 贝多财经 “起了个大早&#xff0c;赶了个晚集”&#xff0c;用在如今的北汽蓝谷身上再合适不过。 2025年的第一个工作日&#xff0c;北汽蓝谷新能源科技股份有限公司&#xff08;SH:600733&#xff0c;简称“北汽蓝谷”&#xff09;对外披露了子公司北京…...

(五)开机自启动以及scp工具文件传输小问题

文章目录 程序开机自启动先制作一个可执行程序第一种 通过命令行实现程序开机自启动第二种 通过 Linux 系统镜像实现程序开机自启动 scp工具文件传输小问题 程序开机自启动 原因&#xff1a;做成产品后&#xff0c;用户直接开机使用&#xff0c;总不能在开机执行程序后才可以使…...