面试系列 - Redis分布式锁3种实现方式对比分析

NVIDIA GPU Operator简易说明 中发现GPU,需要安装驱动、部署device plugin等一系列操作,使用GPU。方案,MPS方案目前可以单独试用部署,相信很快会集成到Operator中。的方式对节点单独设置驱动型号,驱动版本推荐见。个人经验是推荐使用较高版本。Operator可以。 阅读详情

目录

一、SETNX命令的方式:

二、SETNX实现的分布式锁 

三、Redlock分布式锁


在分布式系统中,实现分布式锁是一个常见的问题,Redis 是一个常用的工具,用于实现分布式锁。

一、SETNX命令的方式:

  • 实现原理: 该方式使用 Redis 的 SETNX 命令(SET if Not eXists)来尝试设置一个锁键。如果该键不存在,它会被设置,并且返回成功。如果键已存在,表示锁已被其他客户端持有,则获取锁失败。

  • 优点: 实现简单,易于理解。适用于基本的锁需求。

  • 缺点: 存在死锁风险,如果持有锁的客户端发生崩溃或其他故障,锁可能会一直被占用。没有续约机制,可能导致锁超时。适用于单节点 Redis 环境。

SETNX 是 Redis 中的一个命令,用于设置一个键的值,但仅当该键不存在时。你可以使用 SETNX 命令来实现基本的分布式锁。

返回值:

  • 1 设置key成功

  • 0 设置key失败

以下是使用 Java 和 Jedis 客户端,演示如何使用 SETNX 来实现分布式锁:

import redis.clients.jedis.Jedis;

public class DistributedLock {

    private static final String LOCK_KEY = "mylock";
    private static final int LOCK_EXPIRE = 10000; // 锁的过期时间(毫秒)
    private static final int ACQUIRE_TIMEOUT = 2000; // 获取锁的超时时间(毫秒)

    public static boolean acquireLock(Jedis jedis, String lockValue) {
        long startTime = System.currentTimeMillis();
        try {
            while (System.currentTimeMillis() - startTime < ACQUIRE_TIMEOUT) {
                Long result = jedis.setnx(LOCK_KEY, lockValue); // 尝试获取锁
                if (result == 1) {
                    // 锁获取成功
                    jedis.pexpire(LOCK_KEY, LOCK_EXPIRE); // 设置锁的过期时间
                    return true;
                } else {
                    // 锁获取失败,等待一段时间后重试
                    Thread.sleep(50); // 等待一段时间后重试
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false; // 获取锁失败
    }

    public static void releaseLock(Jedis jedis, String lockValue) {
        try {
            String currentValue = jedis.get(LOCK_KEY);
            if (currentValue != null && currentValue.equals(lockValue)) {
                jedis.del(LOCK_KEY); // 释放锁
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost", 6379);
        String lockValue = "unique-lock-value";

        if (acquireLock(jedis, lockValue)) {
            // 获取锁成功,执行业务逻辑
            System.out.println("Lock acquired. Executing business logic...");

            // 模拟业务逻辑执行
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            releaseLock(jedis, lockValue); // 释放锁
            System.out.println("Lock released.");
        } else {
            System.out.println("Failed to acquire lock.");
        }

        jedis.close();
    }
}

在上面的示例中,acquireLock 方法尝试使用 SETNX 命令来获取锁,如果获取成功,它将设置锁的过期时间,然后返回 true。如果获取锁失败,它会等待一段时间后重试,直到达到获取锁的超时时间为止。

releaseLock 方法用于释放锁,它会首先检查当前锁是否属于当前客户端,然后删除锁。

二、SETNX实现的分布式锁 

  • 实现原理: 与 SETNX 不同,该方式在设置锁键时加入了过期时间。通过 SET 命令设置锁键,并为其设置一个过期时间。如果持有锁的客户端在指定时间内未续约锁,锁会自动过期释放。

  • 优点: 有自动过期机制,降低死锁风险。适用于单节点 Redis 环境。

  • 缺点: 仍然存在死锁风险,例如客户端在获取锁后崩溃,未能续约锁,锁可能会过早释放。不适用于多节点 Redis 环境。

以下是使用 Java 和 Jedis 客户端来实现基于 SETNX 的分布式锁的示例:

import redis.clients.jedis.Jedis;

public class DistributedLock {
    private static final String LOCK_KEY = "mylock";
    private static final String LOCK_VALUE = "locked";
    private static final int LOCK_EXPIRE_TIME = 10000; // 锁的过期时间,单位毫秒

    public static boolean acquireLock(Jedis jedis) {
        // 使用 SETNX 命令尝试获取锁
        Long result = jedis.setnx(LOCK_KEY, LOCK_VALUE);
        if (result == 1) {
            // 获取锁成功,设置锁的过期时间
            jedis.pexpire(LOCK_KEY, LOCK_EXPIRE_TIME);
            return true;
        }
        // 获取锁失败
        return false;
    }

    public static void releaseLock(Jedis jedis) {
        // 释放锁
        jedis.del(LOCK_KEY);
    }

    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost", 6379);

        try {
            if (acquireLock(jedis)) {
                // 获取锁成功,执行业务逻辑
                System.out.println("Lock acquired. Executing business logic...");
                Thread.sleep(5000); // 模拟业务逻辑执行
            } else {
                System.out.println("Failed to acquire lock.");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            releaseLock(jedis);
            System.out.println("Lock released.");
            jedis.close();
        }
    }
}

在这个示例中,acquireLock 方法使用 setnx 命令尝试获取锁,如果返回值是 1,表示获取锁成功,然后设置锁的过期时间(通过 pexpire 命令)。releaseLock 方法用于释放锁,它使用 del 命令来删除锁键。

三、Redlock分布式锁

Redlock 是一个用于实现分布式锁的算法,由 Redis 的作者 Antirez 在一篇博客中提出。它的目标是提供高可用性和分布式环境下的锁定机制,以防止多个客户端同时访问共享资源。Redlock 是一种基于多个 Redis 节点的互斥锁算法。

  • 实现原理:

  1. 多个 Redis 节点: Redlock 需要至少 N 个 Redis 节点来工作。这些节点可以分布在不同的机器上,以确保高可用性。

  2. 锁的获取: 客户端尝试在 N 个 Redis 节点上获取锁,使用 SETNX 命令(SET if Not eXists)。

  3. 设置过期时间: 为了避免死锁,锁必须设置一个过期时间,确保锁在一段时间后自动释放。

  4. 成功获取锁: 如果客户端成功在至少 N/2 + 1 个节点上获取锁,并且锁设置了相同的唯一标识,那么锁被视为成功获取。

  5. 续约锁: 客户端可以定期续约锁,即在锁过期前延长锁的过期时间。这有助于防止锁过早释放。

  6. 释放锁: 客户端可以释放锁,通过删除在至少 N/2 + 1 个节点上设置的锁

  • 优点: 提供更高的锁可用性,适用于多节点 Redis 环境。具备容错性,可以应对 Redis 节点故障。

  • 缺点: 实现相对复杂,引入了网络通信的延迟。需要精心配置和调整以确保性能和可用性。可能需要较长的锁定和续约时间,导致锁等待时间较长。

简单的 Java 示例,演示如何使用 Jedis 客户端库来实现 Redlock 分布式锁:

import redis.clients.jedis.Jedis;

public class RedlockDemo {
    private static final String LOCK_KEY = "mylock";
    private static final int LOCK_EXPIRE_TIME = 10000; // 锁的过期时间,单位毫秒

    public static void main(String[] args) {
        Jedis jedis1 = new Jedis("redis-node-1", 6379);
        Jedis jedis2 = new Jedis("redis-node-2", 6379);
        Jedis jedis3 = new Jedis("redis-node-3", 6379);

        Redlock redlock = new Redlock(jedis1, jedis2, jedis3);

        try {
            Redlock.Lock lock = redlock.lock(LOCK_KEY, LOCK_EXPIRE_TIME);
            if (lock != null) {
                // 获取锁成功,执行业务逻辑
                System.out.println("Lock acquired. Executing business logic...");
                Thread.sleep(5000); // 模拟业务逻辑执行
            } else {
                System.out.println("Failed to acquire lock.");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            redlock.unlock(LOCK_KEY);
            System.out.println("Lock released.");
            jedis1.close();
            jedis2.close();
            jedis3.close();
        }
    }
}

这个示例中,我们使用 Jedis 客户端创建了三个 Redis 节点,并使用 Redlock 来获取和释放分布式锁。请注意,Redlock 是一个相对复杂的算法,实际使用中需要更多的容错和错误处理机制。此外,确保你的 Redis 节点是高可用的,以减少故障的影响。

深入解析NVIDIA GPU Operator:实现Kubernetes环境下的GPU资源优化管理 NVIDIA GPU Operator凭借其对Kubernetes原生机制的深度整合,极大地简化了GPU资源在大规模集群环境中的管理工作。通过自动化部署、管理和监控GPU相关组件,不仅提高了集群的运营效率,也保障了GPU资源的充分利用,为深度学习、高性能计算等应用场景在云原生环境下的落地实践提供了坚实的基础支撑。:通过DCGMExporter,GPU Operator可以实时收集GPU的各种运行状态和性能数据,帮助运维人员及时发现并解决问题,确保GPU资源的高效利用和集群稳定性。 阅读详情

相关推荐

NVIDIA GPU Operator介绍

NVIDIA GPU Operator 摘要 NVIDIA GPU Operator 简化了 Kubernetes 集群中 GPU 资源的管理,通过容器化方式自动化部署和维护 GPU 驱动程序及相关组件。相比传统节点直装方式,其核心优势在于: 架构特点: 采用特权容器将驱动挂载到宿主机内核 通过 DaemonSet 实现批量部署和版本管理 严格匹配宿主机内核版本确保兼容性 功能亮点: 支持 vGPU/MIG 实现资源隔离共享 提供 GPUDirect RDMA/Storage 加速数据传输 集成 GDRCo

qq_18452715的博客 1270

nvidia gpu-operator

用于给集群环境调度 gpu ,由 n 个子组件组成。分别如下描述: GPU Operator 是一个 Kubernetes Operator,用于自动化 NVIDIA GPU 的配置和管理。它可以部署、管理和监控 GPU 驱动、容器工具包、设备插件等组件。作用: 负责协调和管理整个 GPU Operator 的运行,确保 GPU 相关的组件都正确部署和配置。描述: 这个组件通常与 Node Feature Discovery (NFD) 相关,可能用于清理或管理节点特征信息。

weixin_46546444的博客 2297

如何在K8s集群中管理与使用GPU

随着人工智能的兴起,GPU作为重要的智算算力类型愈发受到重视,而Kubernetes(k8s)作为业界主流的集群管理系统,如何方便管理、使用GPU也是其需要解决的一大问题,故此收集整理了K8s管理与使用GPU的相关资料以学习。

slipegg的博客 3839

NVIDIA GPU Operator install in kubernetes

Kubernetes通过设备插件框架提供对特殊硬件资源的访问,如NVIDIA GPU、⽹卡、Infiniband适配器和其他设备。但是,配置和管理带有这些硬件资源的节点需要配置多个软件组件,例如驱动程序、容器运⾏时或其他库,这些组件组合起来⽐较困难且容易出错。GPU Operator相关架构如下:可以从架构上看到,NVIDIA GPU Operator使⽤Kubernetes中的Operator框架⾃动管理提供GPU所需的所有NVIDIA软件组件。

爱死亡机器人 2999

K8s GPU调度实战:从驱动安装到Device Plugin部署全指南

在云原生与AI融合的背景下,Kubernetes作为容器编排事实标准,需要通过扩展资源机制来纳管GPU等异构计算设备。Device Plugin是连接kubelet与NVIDIA驱动的关键组件,负责设备发现与资源上报,而Extended Resource则为调度器提供可分配的资源视图。理解这套机制,不仅能解决GPU资源无法被Pod识别的问题,还能为AI训练、模型推理等场景提供弹性调度能力。从驱动安装、容器运行时配置到Device Plugin部署,再到故障排查与性能监控,以工程实践视角系统梳理K8s接入GP

weixin_34232744的博客 308

Kubernetes GPU调度实战:显存隔离、MIG切分与AI工作负载编排

GPU资源管理是AI工程化落地的核心瓶颈,其本质是将有状态、强依赖、拓扑敏感的硬件抽象为可调度、可隔离、可监控的计算单元。传统Kubernetes仅支持粗粒度GPU设备分配,导致显存碎片高、多租户干扰、通信性能劣化等问题。通过NVIDIA Device Plugin定制、Topology Manager策略对齐、GPU Operator自动化交付及MIG(Multi-Instance GPU)细粒度切分,可实现显存级隔离、NUMA/NVLink感知调度与安全多实例共享。该方案显著提升A100等高端GPU利用

dianyin7770的博客 384

【NVIDIA】NVIDIA GPU Operator 完整文档

NVIDIA GPU Operator 是一个 Kubernetes Operator,用于自动化管理 Kubernetes 集群中的 NVIDIA GPU 资源

zhonglinzhang 1217

KUKA机器人 - 从开机到自动运行

注1:本文仅代表本人对机器人使用的一些建议,在使用机器人前,还请详细阅读库卡机器人官方资料,道路千万条,安全第一条!!! 注2:技术有限,欢迎各位大大在阅读过程中发现各类问题,并且批评指正!!! 目录 一、准备工作 1. 机器人上电完成 2. 电脑安装Workvisual 二、学习手动移动机器人 三、项目配置 1. 设置机器人IP地址 2.电脑和机器人通过网线连接 3.查找并打开项目 4. 通讯配置 5. 项目上传 6. 检验IO配置 四、编程 1.新建程序 2. 程序...

yilunyao的博客 1万+

Kubernetes接入NVIDIA GPU完整指南:从驱动到Device Plugin

GPU(图形处理器)已成为AI训练与推理场景中的核心算力资源,如何在容器化环境中高效调度GPU,成为云原生技术栈中备受关注的工程问题。Kubernetes作为业界标准的容器编排平台,通过扩展资源机制与设备插件(Device Plugin)框架,能够将底层GPU硬件抽象为可调度的集群资源。这一机制依赖于三层基础设施的协同工作:宿主机NVIDIA驱动提供设备访问能力,容器运行时负责将GPU设备与库文件注入容器,Device Plugin则向kubelet上报资源并为Pod分配显卡。理解这一分层架构,有助于快速定

weixin_34088583的博客 226

Infinite-Canvas:一站式AI绘画工作流平台部署与实战指南

在 AI 绘画和内容创作领域,你是否经常遇到这样的困扰:灵感来了,却要在多个工具间来回切换——找素材、写提示词、调整参数、批量生成,整个过程繁琐且低效。创作一个系列作品时,管理不同版本的图片和提示词更是让人头疼。如果你渴望一个能整合所有流程,实现从素材管理、提示词工程到批量出图一站式完成的工作台,那么今天介绍的 Infinite-Canvas 正是为你量身打造的解决方案。 Infinite-Canvas 是一个开源的本地网页应用,它将 AI 绘画的完整工作流集成在一个界面中。无论你是想快速生成单张图片,还是

weixin_28707535的博客 338

MIMO技术入门

MIMO:多天线技术,发射端和接收端有多个天线(注意:并不是指多个天线板,而是多套振子,每一套是一个独立的天线。) 4G:2、8天线 5G:4、64天线(64T64R) 手机也是多天线 MIMO实现效果的分类: 1)空间分集 。2)空间复用。3)波束赋形。 空间分集(space diversity) 作用:提升接收质量 利用多个天线发射或者接收一个数据流,避免单个信道衰落对整个链路的影响。(比如你的耳机坏了一只并不影响另一只) 空间复用(space multiplexing) 作用:提升速率 利

About1129的博客 2876

Kubernetes 如何管理和调度 GPU:从架构、核心组件到第一个 GPU Pod

Kubernetes 本身不直接管理 GPU,需通过 NVIDIA Device Plugin 将 GPU 注册为扩展资源(如 nvidia.com/gpu)。GPU 资源由 Driver、Container Toolkit、Device Plugin 等组件协同实现:Driver 提供硬件支持,Container Toolkit 暴露 GPU 给容器,Device Plugin 向 Kubelet 注册资源,Scheduler 根据资源调度 Pod,Kubelet 在节点上分配具体 GPU。NVIDIA

feixuanwo的博客 324

TI电量计BQ40Z50R2循环学习实战:从量产文件生成到关键标志位解析

本文详细解析了TI电量计BQ40Z50R2的循环学习实战流程,从量产文件生成到关键标志位解析。通过实战案例和易错分析,帮助工程师避开常见陷阱,提升电量计配置效率。重点介绍了循环学习前的准备工作、量产文件生成步骤及关键标志位的深度解读,适用于电池管理系统开发人员。

weixin_30505225的博客 439

GPU Operator 是什么?和 NVIDIA Device Plugin 是什么关系?

本文系统梳理了Kubernetes支持NVIDIA GPU的技术架构,重点分析了各层级组件的作用与协作关系: 基础支撑层 NVIDIA Driver:使宿主机识别GPU硬件 Container Toolkit:让容器运行时支持GPU访问 Kubernetes集成层 Device Plugin:核心组件,将GPU注册为可调度资源(nvidia.com/gpu) 通过DaemonSet部署,使kubelet感知GPU资源 支持Pod通过resources.li

weixin_44349426的博客 865

浅析ArcGis中的软件——ArcMap、ArcScene、 ArcGlobe、ArcCatalog

ArcMap:是集空间数据显示、矢量数据编辑、冲突数据检查(拓扑检查)、查询检索(地理编码)、统计(字段属性表)、报表生成、空间分析(ArcGIS Spatial Analyst)和高级制图(制图表达)等众多功能干一体的桌面应用平台软件。而且提供所见即所得的符号编辑器,令用户可以随心所欲地生成任意复杂的点、线、面符号。所支持的空间数据格式包括Arclnfo coverages、ESRI shapefiles、ArcSDE lavers、DXF、DWG、DGN、常见的图像格式、GRIDs、TINs等。

lxlmycsdnfree的博客 6564

UCIe相关开源项目记录

目前找到的和UCIe协议有关的5个开源项目,如果也有正在做的朋友,欢迎私信交流

m0_64102565的博客 823

K8S GPU 调度——Operator 自动管理GPU

NFD(Node Feature Discovery)扫描节点基础信息,添加如 CPU 型号、操作系统版本、内核版本等标签,前缀为,用于节点特征描述。GFD(GPU Feature Discovery)专门识别 GPU 节点,添加核心标签,并补充 GPU 型号、驱动版本、显存容量等信息(如作用:这两个组件为后续组件提供 “准入条件”,只有携带标签的节点才会部署驱动和工具包。gpu0-only:# 0 号卡:切成 4g.40gb×1 + 2g.20gb×1 + 1g.20gb×1。

qq_33816243的博客 609

[A-21]ARMv8/v9-SMMU系统架构和功能概述

本文简述了SMMU的系统架构和核心功能

基层架构师的分享 1724

Folia 上手指南:5 分钟播通第一首本地歌曲,再打开全屏歌词动画

Folia 是一款主打全屏歌词动画的本地音乐播放器,也支持 Navidrome 和网易云、QQ 音乐、酷狗等在线平台。这篇教程写给第一次用它的人,跟着做能装好软件、导入自己的歌、播通第一首,并按下 `H` 看到铺满屏幕的歌词。 ## 安装 Folia 并打开窗口 两条路,挑省事的走。 **路线一:桌面版(推荐)。** 去项目的 Releases 页面,下载 Windows、macOS、Lin

gitblog_00891的博客 168

五步通关!宝塔Linux部署ASP.NET Core的魔法秘籍大公开!

摘要: 本文提供ASP.NET Core应用五步部署攻略,涵盖从环境配置到线上运行的完整流程: 1️⃣ 环境准备:安装宝塔面板、ASP.NET Core运行时及开放端口; 2️⃣ 应用发布:通过dotnet publish生成独立部署包并上传服务器; 3️⃣ Nginx配置:设置反向代理将域名请求转发至应用端口; 4️⃣ 进程守护:使用Supervisor确保应用持续运行; 5️⃣ HTTPS加密:通过宝塔快速申请SSL证书并解决验证路径冲突。 关键点: 强调权限设置(755)、端口开放及反向代理细节; 提

java专栏 969

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【NVIDIA】NVIDIA Container Toolkit v1.19.1 源码架构总览之一

NVIDIA Container Toolkit(以下简称 NVCTK)是 NVIDIA 官方开源的容器 GPU 支持工具集,其核心使命是让 GPU 加速容器变得透明且易于使用。在没有 NVCTK 之前,要在容器中使用 GPU,用户需要手动挂载设备节点、拷贝用户态驱动库、配置环境变量——这是一件极其繁琐且容易出错的工作。NVCTK 将这一切自动化了。NVCTK 的前身是 项目(2016 年发布),后来演化为 和 两个层级的工具。到 v1.19.1 时,项目已经经历了多次重大架构演进,从最初的简单 ho

zhonglinzhang 413

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

10万字形全覆盖:文津宋体如何显示扩展A-J区罕见汉字,大字符集字体深度解析

**文津宋体(WenJinMincho)** 是一款以 **SIL OFL 1.1 协议**发布的 **可免费商用大字符集宋体字体**,完整覆盖 Unicode 扩展 A-J 区的罕见汉字与 IVD 异体字,共 **11 万+ 字形**,是解决生僻字"豆腐块"缺字问题的大字符集字体方案。如果你经常遇到扩展区汉字显示不出来的困扰,这篇指南将从原理到安装,帮你彻底吃透它的覆盖逻辑。 ## 一、为什么

gitblog_00374的博客 529

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Kubernetes AI 集群实战:GPU Operator

随着大模型、AI 训练业务上 K8s,很多运维踩坑:逐台服务器手动装 NVIDIA 驱动、containerd 配置出错、集群无法识别 GPU、缺少 GPU 监控、混合集群 CPU 节点也部署大量 GPU 组件产生大量告警。很多人误以为 GPU Operator 只是一个批量安装显卡驱动的工具(如果只为了解决这个问题我觉得有一个ansible就足够了),其实它是一套。本文从痛点、组件原理、混合集群避坑、云主机部署、和 Volcano 配合使用几个维度完整讲解。

2301_76481311的博客 266

Kubernetes AI 集群实战:CPU Operator 生产问题思考

本次介绍两个在交付中常见的GPU问题,各位小伙伴也可以留言提出你在生产环境遇到的GPU问题,可针对问题进行讨论1、误区:GPU Operator 可以调度 AI 任务✅纠正:只负责暴露 GPU 资源,调度交给 Volcano。2、误区:云主机直接全套默认安装✅纠正:云环境关闭 driver、toolkit,避免冲突。3、误区:混合集群直接默认部署✅纠正:必须配置 nodeSelector,限制组件仅在 GPU 节点运行。4、误区:装完驱动容器就能使用 GPU。

2301_76481311的博客 302

从零搭建一个 AI Infra 实验室⑮:GPU Operator——AI 集群为什么不能靠手工装驱动

本文介绍 NVIDIA GPU Operator 如何将 Driver、Container Toolkit、Device Plugin、GFD 与 DCGM 纳入 Kubernetes 统一管理,并通过 Helm 实验观察 GPU 资源、节点标签与监控指标,理解 AI 集群为何不能长期依赖手工维护。

mosespaul的博客 633

NVIDIA GPU 驱动与 DevicePlugin 安装 Hook 实战指南(kOps 篇)

在 AWS 上使用 kOps 搭建 Kubernetes 集群时,GPU 节点(如 p2、p3、g3 系列实例)并不会自动获得可用的 NVIDIA 驱动与容器运行时——裸的节点上既没有显卡驱动,也没有能让容器访问 GPU 的 nvidia-docker。本指南基于 kOps 仓库中 [hooks/nvidia-device-plugin/README.md](https://link.gitcod

gitblog_00658的博客 1038
上一篇: 使用Java解压和压缩文件
下一篇: 一篇文章教你学会SpringBatch使用分区读取数据库
境里婆娑
境里婆娑 新星创作者: Java技术领域 新星创作者: Java技术领域 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄10年 1万+粉丝 300原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

境里婆娑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值