Centos7.9 离线安装docker
实验环境:
[root@192 ~]# cat /etc/system-release
CentOS Linux release 7.9.2009 (Core)
下载二进制压缩包
a. 官网下载地址:
https://download.docker.com/linux/static/stable/x86_64/
b. 阿里云下载地址
https://mirrors.aliyun.com/docker-ce/linux/static/stable/x86_64/
选择目前最新的安装包下载
下载后上传到服务器上
https://mirrors.aliyun.com/docker-ce/linux/static/stable/x86_64/docker-27.4.0.tgz
所有二进制包功能介绍
将压缩包解压
[root@192 ~]# ll
total 74000
-rw-r--r--. 1 root root 75773499 Dec 18 07:29 docker-27.4.0.tgz
[root@192 ~]# tar -zxvf docker-27.4.0.tgz
docker/
docker/runc
docker/containerd
docker/docker-init
docker/dockerd
docker/containerd-shim-runc-v2
docker/docker-proxy
docker/docker
docker/ctr
[root@192 ~]# ls -1 docker
containerd
containerd-shim-runc-v2
ctr
docker
dockerd
docker-init
docker-proxy
runc
containerd:containerd 是一个开源的容器运行时,它作为 Docker 的守护进程被广泛使用。它是行业标准的容器运行时,负责管理容器的整个生命周期,包括创建容器、运行容器、存储和网络等。containerd-shim-runc-v2:containerd-shim 是 containerd 的一部分,它作为容器运行时的父进程存在,负责与容器的标准输入输出进行交互。containerd-shim-runc-v2 特别指的是与 runC 集成的版本,runC 是一个轻量级的容器运行时,符合 OCI (Open Container Initiative) 标准。ctr:ctr 是 containerd 的低级命令行界面,它提供了一组命令来直接与 containerd 进行交互,如创建容器、运行容器、管理镜像等。ctr 是一个更接近底层的工具,通常用于调试或高级用例。docker:docker 是 Docker 命令行界面的二进制文件,用户通过它与 Docker 引擎交互,执行如构建镜像、运行容器、管理网络和卷等操作。dockerd:dockerd 是 Docker 守护进程的二进制文件,它是 Docker 架构的核心,负责管理 Docker 对象,包括镜像、容器、网络和卷。dockerd 接收来自 Docker CLI 的请求并处理这些请求。docker-init:docker-init 是 Docker 在早期版本中使用的初始化系统,用于在容器启动时设置环境变量和执行初始化操作。在 Docker 的较新版本中,docker-init 的功能被集成到了 dockerd 中。docker-proxy:docker-proxy 是 Docker 启动的临时代理进程,它负责将容器内部的网络请求转发到宿主机的特定端口,从而允许容器访问外部网络服务。runc:runc 是一个轻量级的命令行工具,用于根据 OCI 标准创建和运行容器。它是许多容器运行时和容器管理平台的底层组件,包括 containerd 和 Docker。
安装部署docker
[root@192 docker]# ls
containerd containerd-shim-runc-v2 ctr docker dockerd docker-init docker-proxy runc
[root@192 docker]# cp * /usr/bin/
1. containerd 配置启动文件
containerd.service 文件直接拿github上containerd项目中的文件拿过来用
github地址: https://github.com/containerd/containerd/blob/main/containerd.service
gitee地址: https://gitee.com/hackerwjz/containerd/blob/main/containerd.service
*note:
以下 containerd.service我改动了一下二进制启动文件路径,因为我把二进制文件都放到了 /usr/bin/ 下面,而下载的
containerd.service文件默认启动位置在ExecStart=/usr/local/bin/containerd
只需要将启动位置修改为 ExecStart=/usr/bin/containerd即可
cat > /usr/lib/systemd/system/containerd.service << EOF
# Copyright The containerd Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target dbus.service[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/bin/containerdType=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999[Install]
WantedBy=multi-user.targetEOF
重新加载systemd配置,并启动containerd
[root@192 docker]# systemctl daemon-reload
[root@192 docker]# systemctl enable containerd --now
Created symlink from /etc/systemd/system/multi-user.target.wants/containerd.service to /usr/lib/systemd/system/containerd.service.
[root@192 docker]# systemctl status containerd
● containerd.service - containerd container runtimeLoaded: loaded (/usr/lib/systemd/system/containerd.service; enabled; vendor preset: disabled)Active: active (running) since Thu 2024-12-19 04:37:06 CST; 11min agoDocs: https://containerd.ioMain PID: 4671 (containerd)CGroup: /system.slice/containerd.service└─4671 /usr/bin/containerdDec 19 04:37:06 192.168.25.142 containerd[4671]: time="2024-12-19T04:37:06.195745383+08:00" level=info msg=serving... address=/run/containerd/containerd.sock.ttrpc
Dec 19 04:37:06 192.168.25.142 containerd[4671]: time="2024-12-19T04:37:06.195808476+08:00" level=info msg=serving... address=/run/containerd/containerd.sock
Dec 19 04:37:06 192.168.25.142 systemd[1]: Started containerd container runtime.
Dec 19 04:37:06 192.168.25.142 containerd[4671]: time="2024-12-19T04:37:06.196645507+08:00" level=info msg="Start subscribing containerd event"
Dec 19 04:37:06 192.168.25.142 containerd[4671]: time="2024-12-19T04:37:06.196798483+08:00" level=info msg="Start recovering state"
Dec 19 04:37:06 192.168.25.142 containerd[4671]: time="2024-12-19T04:37:06.196969326+08:00" level=info msg="Start event monitor"
Dec 19 04:37:06 192.168.25.142 containerd[4671]: time="2024-12-19T04:37:06.197012345+08:00" level=info msg="Start snapshots syncer"
Dec 19 04:37:06 192.168.25.142 containerd[4671]: time="2024-12-19T04:37:06.197039963+08:00" level=info msg="Start cni network conf syncer for default"
Dec 19 04:37:06 192.168.25.142 containerd[4671]: time="2024-12-19T04:37:06.197045185+08:00" level=info msg="Start streaming server"
Dec 19 04:37:06 192.168.25.142 containerd[4671]: time="2024-12-19T04:37:06.197953750+08:00" level=info msg="containerd successfully booted in 0.101189s"
2. dockerd配置启动文件
docker.service文件可以直接拿github上docker项目中的文件来用
github地址:https://github.com/moby/moby/blob/master/contrib/init/systemd/docker.service
gitee地址: https://gitee.com/Yao_weijie/moby/blob/master/contrib/init/systemd/docker.service
Tips:
在dockerd启动时会将/var/run/docker.sock
套接字文件加入到docker组,所以在docker启动时最好创建一下。不创建也不影响启动;创建docker组的主要目的是可以将非root用户加入到docker组,以便普通用户可以有权限使用docker命令,而非调用sudo
[root@192 ~]# groupadd -g 995 docker
[root@192 ~]# getent group docker
docker:x:995:
cat > /usr/lib/systemd/system/docker.service << EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target docker.socket firewalld.service containerd.service time-set.target
Wants=network-online.target containerd.service
Requires=docker.socket[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutStartSec=0
RestartSec=2
Restart=always# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity# Comment TasksMax if your systemd version does not support it.
# Only systemd 226 and above support this option.
TasksMax=infinity# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes# kill only the docker process, not all processes in the cgroup
KillMode=process
OOMScoreAdjust=-500[Install]
WantedBy=multi-user.targetEOF
*note:
由于docker.service里面有Requires=docker.socket 强依赖,所以在启动docker服务前一定要激活 systemd 套接字单元 docker.socket,如果是使用rpm包安装的docker,会自动创建/lib/systemd/system/docker.socket文件,由于我们这里是使用二进制安装的所有需要而外配置一下。
docker.socket 定义了 unix套接字文件路径,权限,启动用户和所属组; 其实如果不想配置 /lib/systemd/system/docker.socket 文件只需要将 Requires=docker.socket 注释掉,但是 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 需要修改为 ExecStart=/usr/bin/dockerd -H unix:// --containerd=/run/containerd/containerd.sock 及将 fd:// 修改为 unix:// ,及从本地systemd 套接字单元启动修改为从unix套接字路径启动。没有设置unix套接字路径是因为默认会去连接 /run/docker.sock
cat > /lib/systemd/system/docker.socket << EOF
[Unit]
Description=Docker Socket for the API[Socket]
# If /var/run is not implemented as a symlink to /run, you may need to
# specify ListenStream=/var/run/docker.sock instead.
ListenStream=/run/docker.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker[Install]
WantedBy=sockets.targetEOF
重新加载systemd配置,并启动dockerd
[root@192 ~]# systemctl daemon-reload
[root@192 ~]# systemctl enable docker --now
[root@192 ~]# systemctl status docker
● docker.service - Docker Application Container EngineLoaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)Active: active (running) since Thu 2024-12-19 07:15:53 CST; 18min agoDocs: https://docs.docker.comMain PID: 884 (dockerd)Tasks: 8Memory: 78.3MCGroup: /system.slice/docker.service└─884 /usr/bin/dockerd -H unix:// --containerd=/run/containerd/containerd.sockDec 19 07:15:52 192.168.25.142 dockerd[884]: time="2024-12-19T07:15:52.922736046+08:00" level=info msg="[graphdriver] using prior storage driver: overlay2"
Dec 19 07:15:52 192.168.25.142 dockerd[884]: time="2024-12-19T07:15:52.927258298+08:00" level=info msg="Loading containers: start."
Dec 19 07:15:53 192.168.25.142 dockerd[884]: time="2024-12-19T07:15:53.588393525+08:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Dae... IP address"
Dec 19 07:15:53 192.168.25.142 dockerd[884]: time="2024-12-19T07:15:53.729125254+08:00" level=info msg="Loading containers: done."
Dec 19 07:15:53 192.168.25.142 dockerd[884]: time="2024-12-19T07:15:53.767169596+08:00" level=warning msg="WARNING: bridge-nf-call-iptables is disabled"
Dec 19 07:15:53 192.168.25.142 dockerd[884]: time="2024-12-19T07:15:53.767501666+08:00" level=warning msg="WARNING: bridge-nf-call-ip6tables is disabled"
Dec 19 07:15:53 192.168.25.142 dockerd[884]: time="2024-12-19T07:15:53.767633374+08:00" level=info msg="Docker daemon" commit=92a8393 containerd-snapshotter=false storage-driver=...rsion=27.4.0
Dec 19 07:15:53 192.168.25.142 dockerd[884]: time="2024-12-19T07:15:53.768243618+08:00" level=info msg="Daemon has completed initialization"
Dec 19 07:15:53 192.168.25.142 dockerd[884]: time="2024-12-19T07:15:53.860678888+08:00" level=info msg="API listen on /var/run/docker.sock"
Dec 19 07:15:53 192.168.25.142 systemd[1]: Started Docker Application Container Engine.
Hint: Some lines were ellipsized, use -l to show in full.
3. 测试
获取镜像: 通过网盘分享的文件:hello-world.tar 链接:
https://pan.baidu.com/s/1jk9VNv60cCzmq8Pi0WHwhQ 提取码: 4ark
[root@192 ~]# docker load -i hello-world.tar
ac28800ec8bb: Loading layer [==================================================>] 14.85kB/14.85kB
Loaded image: hello-world:latest
[root@192 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d2c94e258dcb 19 months ago 13.3kB
[root@192 ~]# docker run hello-worldHello from Docker!
This message shows that your installation appears to be working correctly.To generate this message, Docker took the following steps:1. The Docker client contacted the Docker daemon.2. The Docker daemon pulled the "hello-world" image from the Docker Hub.(amd64)3. The Docker daemon created a new container from that image which runs theexecutable that produces the output you are currently reading.4. The Docker daemon streamed that output to the Docker client, which sent itto your terminal.To try something more ambitious, you can run an Ubuntu container with:$ docker run -it ubuntu bashShare images, automate workflows, and more with a free Docker ID:https://hub.docker.com/For more examples and ideas, visit:https://docs.docker.com/get-started/
相关文章:
Centos7.9 离线安装docker
实验环境: [root192 ~]# cat /etc/system-release CentOS Linux release 7.9.2009 (Core)下载二进制压缩包 a. 官网下载地址: https://download.docker.com/linux/static/stable/x86_64/b. 阿里云下载地址 https://mirrors.aliyun.com/docker-ce/lin…...
C语言函数在调用过程中具体是怎么和栈互动的?
从栈开始的一场C语言探险记 —— C语言函数是如何与栈"共舞"的。 栈的舞步解析 通过一个简单的例子来看看这支"舞蹈": int add(int a, int b) {int result a b;return result; }int main() {int x 10;int y 20;int sum add(x, y);retur…...
【Java中常见的异常及其处理方式】
🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:“没有罗马,那就自己创造罗马~” 文章目录 字符串修改的实现——StringBuilder和StringBuffer异常常见异常①算数异常②数组越界异常③空指针异…...
如何更新项目中的 npm 或 Yarn 依赖包至最新版本
要升级 package.json 文件中列出的包,你可以使用 npm(Node Package Manager)或 yarn。以下是两种工具的命令来更新你的依赖项: 使用 npm 更新所有包到最新版本 npm update如果你想将所有依赖项更新到其各自最新的大版本…...
SpringBoot3整合FastJSON2如何配置configureMessageConverters
在 Spring Boot 3 中整合 FastJSON 2 主要涉及到以下几个步骤,包括添加依赖、配置 FastJSON 作为 JSON 处理器等。下面是详细的步骤: 1. 添加依赖 首先,你需要在你的 pom.xml 文件中添加 FastJSON 2 的依赖。以下是 Maven 依赖的示例&#…...
《Vue3实战教程》2:Vue3快速上手
如果您有疑问,请观看视频教程《Vue3实战教程》 快速上手 线上尝试 Vue 想要快速体验 Vue,你可以直接试试我们的演练场。 如果你更喜欢不用任何构建的原始 HTML,可以使用 JSFiddle 入门。 如果你已经比较熟悉 Node.js 和构建工具等概念…...
ubuntu 24.04.1安装FTP流程
1、安装vsftpd: sudo apt update sudo apt install vsftpd 2、安装后重启查看vsftpd状态 sudo systemctl status vsftpd 输出如下所示,表明vsftpd服务处于活动状态并正在运行: * vsftpd.service - vsftpd FTP server Loaded: loaded (/…...
多功能护照阅读器港澳通行证阅读机RS232串口主动输出协议,支持和单片机/Linux对接使用
此护照阅读器支持护照、电子芯片护照、港澳通行证、台湾通行证,和串口的被动的方式不一样。此护照阅读器通电后,自动读卡,串口输出,软件只需要去串口监听数据即可,例如用串口助手就可以收到读卡信息。 非常适用于单片…...
5个用于构建Web应用程序的Go Web框架
探索高效Web开发的顶级Go框架 Go(或称为Golang)以其简洁性、高效性和出色的标准库而闻名。然而,有几个流行的Go Web框架和库为构建Web应用程序提供了额外的功能。以下是五个最值得注意的Go框架: 1. Gin: Gin是一个高…...
Qt中的异步相关类
Qt中的异步相关类 今天在学习别人的项目时,看到别人包含了QFuture类,我没有见过,于是记录一下。 直接在AI助手中搜索QFuture,得到的时Qt中异步相关的类。于是直接查询一下Qt异步中相关的类。 在Qt中,异步编程是一个重要的概念&…...
浅谈仓颉语言的优劣
仓颉语言,作为华为自研的新一代编程语言,以其高效、安全、现代化的特点,引起了广泛的关注。 仓颉语言的优势 高效并发 仓颉语言的一大亮点是其轻松并发的能力。它实现了轻量化用户态线程和并发对象库,使得高效并发变得轻松。仓颉…...
Linux 显示系统活动进程状态命令 ps 详细介绍
Linux 和类 Unix 操作系统中的 ps(Process Status)命令用于显示当前系统中活动进程状态的命令。它提供了关于系统中正在运行的进程的详细信息,如进程 ID(PID)、父进程 ID(PPID)、运行时间、使用…...
scala中正则表达式的使用
正则表达式: 基本概念 在 Scala 中,正则表达式是用于处理文本模式匹配的强大工具。它通过java.util.regex.Pattern和java.util.regex.Matcher这两个 Java 类来实现(因为 Scala 运行在 Java 虚拟机上,可以无缝使用 Java 类库&…...
数据分析和AI丨知识图谱,AI革命中数据集成和模型构建的关键推动者
人工智能(AI)已经吸引了数据科学家、技术领导者以及任何使用数据进行商业决策者的兴趣。绝大多数企业都希望利用人工智能技术来增强洞察力和生产力,而对于这些企业而言,数据集的质量差成为了最主要的障碍。 数据源需要进行清洗且明…...
cocos creator制作2dTop-down游戏(虚拟摇杆、地图加载)
《不被遗忘的时光》第一期 1、游戏的形式:横板;2d的顶视角(Top-down);射击;ARPG;益智解谜。 2、画风:类似手游《伊洛纳》。 3、故事背景:以中元节的爷孙阴阳交流作为故…...
SQL Server 批量插入数据的方式汇总及优缺点分析
在 SQL Server 中,批量插入数据是非常常见的操作,尤其是在需要导入大量数据时。以下是几种常用的批量插入数据的方式: 1. 使用 INSERT INTO ... VALUES • 特点:适用于少量数据插入。 • 优点:简单易用。 • 缺点:不适合大量数据插入,性能较差。 • 示例:…...
linux上抓包RoCEv2
1、检查tcpdump版本 tcpdump help(4.99.4以上) 如果版本较低需要重新下载编译: wget https://www.tcpdump.org/release/libpcap-1.10.5.tar.xz wget http://www.tcpdump.org/release/tcpdump-4.99.4.tar.gz tar -xJf libpcap-1.10.5.tar.xz…...
【机器学习与数据挖掘实战】案例04:基于K-Means算法的信用卡高风险客户识别
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈机器学习与数据挖掘实战 ⌋ ⌋ ⌋ 机器学习是人工智能的一个分支,专注于让计算机系统通过数据学习和改进。它利用统计和计算方法,使模型能够从数据中自动提取特征并做出预测或决策。数据挖掘则是从大型数…...
UDP网络编程套接
目录 本文核心 预备知识 1.端口号 认识TCP协议 认识UDP协议 网络字节序 socket编程接口 sockaddr结构 UDP套接字编程 服务端 客户端 TCP与UDP传输的区别 可靠性: 传输方式: 用途: 头部开销: 速度: li…...
期权VIX指数构建与择时应用
芝加哥期权交易 所CBOE的波动率指数VIX 是反映 S&P 500 指数未来 30 天预测期波动率的指标,由于预期波动率多用于表征市场情绪,因此 VIX 也被称为“ 恐慌指数”。 VIX指数计算 VIX 反映了市场情绪和投资者的风险偏好, 对于欧美市场而言…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
