展开全部 ↓

Docker的使用

Docker 是一种容器化技术,它可以把应用程序、运行环境、依赖库和配置文件一起打包成镜像,再通过容器运行起来。相比直接部署在服务器上,Docker 更容易做到环境一致、快速发布、快速回滚和服务隔离。 Docker 是什么 在没有 Docker 之前,我们部署一个服务通常需要在服务器上安装语言环境、依赖包、配置数据库连接、开放端口等。不同服务器的系统版本、依赖版本、环境变量只要有一点不同,就可能出现“本地能跑,线上不能跑”的问题。 Docker 解决的核心问题就是:把应用和运行环境一起打包,让应用在不同机器上尽量保持一致的运行结果。 Docker 中有几个重要概念: 镜像(Image):应用的只读模板,里面包含代码、依赖、运行环境等。 容器(Container):镜像运行起来之后的实例,可以理解成一个轻量级的独立运行环境。 Dockerfile:用于描述如何构建镜像的脚本文件。 仓库(Registry):存放镜像的地方,比如 Docker Hub、Harbor、阿里云镜像仓库。 数据卷(Volume):用于持久化容器数据,避免容器删除后数据丢失。 网络(Network):用于容器之间或容器与宿主机之间通信。 Docker 的基本命令 查看版本和运行状态 1 2 docker version docker info 拉取镜像 1 2 3 docker pull nginx docker pull mysql:8.0 docker pull redis:7 镜像名后面的 :8.0、:7 是标签(tag),通常用来区分版本。如果不写 tag,默认使用 latest,但生产环境不建议依赖 latest,最好固定明确版本。 查看本地镜像 1 docker images 运行容器 1 docker run -d --name my-nginx -p 8080:80 nginx 参数说明: -d:后台运行。 --name my-nginx:给容器起名。 -p 8080:80:把宿主机的 8080 端口映射到容器内的 80 端口。 nginx:使用的镜像名。 访问 http://localhost:8080 就能看到 nginx 页面。 ...

April 20, 2026 · 5 min

Gin的使用及优缺点

Gin 是一个轻量级 HTTP Web 框架,封装了路由、参数绑定、中间件等功能,性能较高,适合开发 RESTful API。 优点 性能高 基于 httprouter 零内存分配路由(zero allocation) 比较接近原生 net/http 中间件机制完善 支持全局 / 路由级 / 分组中间件 支持参数绑定和验证 JSON / form / query 自动解析 缺点 不适合复杂大型项目 没有Java Spring 那样的规范 Context过于强劲 不利于分层 基础用法 最小demo示例:引入库+启动一个监听接口 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import ( "net/http" "github.com/gin-gonic/gin" ) func main() { // 用默认中间件创建路由 r := gin.Default() // 定义一个简单的get请求接口 r.GET("/ping", func(c *gin.Context) { // 返回JSON响应 c.JSON(http.StatusOK, gin.H{ "message": "pong", }) }) // 默认启动在8080端口 r.Run() } 最基本用法 ...

April 15, 2026 · 2 min

Go语言的GC机制

什么是 GC GC(Garbage Collection,垃圾回收)是一种自动内存管理机制,用于自动识别并回收程序中不再使用的内存(即“垃圾”)。程序员无需手动 free 或 delete,GC 会在运行时找到这些不可达的对象并释放其占用的内存,避免内存泄漏和悬空指针。 Go 的 GC 机制 Go 的 GC 经历了多次演进,从最初的简单标记清除,到现在的 并发、三色标记、混合写屏障 的算法。当前版本(Go 1.20+)的核心特点如下: 1. 三色标记法(Tri-color Marking) 将内存中的对象分为三种颜色: 白色:尚未被扫描的对象,可能是垃圾。回收结束后,所有白色对象都会被清除。 灰色:已被标记但尚未扫描其引用的对象(即已经访问到,但它的子对象还没处理)。 黑色:已被扫描且其引用的所有子对象都已被标记(即该对象是存活且已完全处理)。 过程: 初始:所有对象都是白色。 根对象扫描:从根对象(栈、全局变量、寄存器等)出发,将其引用的对象标记为灰色,放入工作队列。 并发标记:不断从工作队列取出灰色对象,扫描其引用,将引用的白色对象标记为灰色,并将当前对象变为黑色。 重复直到没有灰色对象。 清除:所有白色对象即为不可达的垃圾,回收内存。 2. 并发执行(Concurrent GC) Go 的 GC 是并发的,即大部分标记工作与用户程序(mutator)同时运行,避免了长时间的 “Stop-The-World”(STW)停顿。 标记准备阶段(短暂 STW):开启写屏障,启动后台标记 worker。 并发标记阶段:标记工作与用户代码并发执行,通过后台 goroutine 和调度器协作。 标记终止阶段(短暂 STW):关闭写屏障,完成最终标记。 并发清除阶段:释放白色对象的内存,可以边分配边清除,不需要 STW。 3. 写屏障(Write Barrier) 为了保证并发标记的正确性(避免漏标),Go 使用 混合写屏障(hybrid write barrier,结合了 Dijkstra 插入屏障和 Yuasa 删除屏障)。其核心作用是:当用户程序修改指针时,在写操作前或后插入一个屏障,确保新的指针关系被正确处理,不会出现“白色对象被黑色对象引用”的漏标情况。 Go 的混合写屏障简化了屏障逻辑,仅在标记期间启用,且对性能影响较小。 4. 并发清除与内存分配 清除阶段是并发的,在分配内存时逐步回收。Go 采用 span 管理,内存分配器(mcache、mcentral、mheap)与 GC 紧密配合,使得清除工作与分配工作可以交错进行,进一步降低停顿。 ...

April 1, 2026 · 1 min

什么是Channel,怎么实现的?

“Channel 在 Go 运行时里是一个叫 hchan 的结构体,核心是一个环形队列 + 两个等待队列(发送方和接收方),再加上一把互斥锁保证并发安全。”

March 31, 2026 · 1 min

什么是GMP模型,它为什么快?

GMP 模型 是 Go 语言实现高并发的核心,也是它“快”的根本原因。下面将拆解模型本身,再说明为什么这种设计能让 Go 在处理大量并发任务时既高效又轻量。 一、GMP 模型是什么 GMP 是 Goroutine、Machine、Processor 三个组件的缩写: G (Goroutine) Go 的“协程”,可以理解为用户态的轻量级线程。 一个 Goroutine 只占 2KB 左右的栈空间(可动态伸缩),创建、销毁、切换的成本远低于操作系统线程(通常线程栈 1~8MB)。 M (Machine) 操作系统线程的抽象,由内核管理。 一个 M 对应一个真实的内核线程,负责执行 Goroutine 的代码。 P (Processor) 处理器,是 G 和 M 之间的“调度器”。 每个 P 维护一个本地的 Goroutine 队列,并持有执行 Go 代码所需的资源(如内存分配缓存等)。 P 的数量通常等于 CPU 核心数(由 GOMAXPROCS 控制)。 核心关系: 一个 M 必须绑定一个 P 才能执行 G。 一个 P 可以绑定多个 M,但同一时刻只能有一个 M 与其绑定并执行 G。 G 被调度到 P 的本地队列或全局队列,M 通过 P 获取 G 并执行。 二、调度流程(如何工作) 初始化 启动时,会创建与 GOMAXPROCS 数量相等的 P,并启动一个初始 M。 ...

March 31, 2026 · 2 min

Redis缓存穿透问题

Redis「缓存穿透」是一个很经典的问题,本质是:请求的数据在缓存和数据库里都不存在,导致每次请求都会直接打到数据库。 一、什么是缓存穿透 场景: 用户请求一个 不存在的 key(比如 id = -1 或乱造的 id) Redis 查不到 → 去数据库查 数据库也查不到 → 返回空 Redis 不缓存这个空结果 结果就是,每次请求都会重复打数据库 如果被恶意利用(比如刷不存在的 ID),数据库会被打爆。 二、常见解决方案 1.缓存空值(最简单有效) 做法: 数据库查不到 → 也写入 Redis 但存一个空值(比如 null 或特殊标记) 设置较短过期时间(如 60 秒) 1 2 3 if data == nil { redis.set(key, "NULL", 60s) } 优点: 立刻生效 实现简单 缺点: 会占用少量缓存空间 2.使用布隆过滤器(Bloom Filter)(推荐) 在请求进入 Redis 前,先判断「这个 key 是否可能存在」 流程: 把所有合法 key(比如用户 ID)加入布隆过滤器 请求来了先判断: 不存在 → 直接返回(拦截) 可能存在 → 再查 Redis 特点: ...

March 23, 2026 · 1 min

泰拉瑞亚服务器开服教程|Docker镜像打包部署实战

Terraria Server Docker 教程 教你学会如何把 Terraria Linux 服务端打成 Docker 镜像,并用 Docker Compose 在 x86_64 Linux 服务器运行。本教程从 Dockerfile、启动脚本到 docker-compose.yml,一步步解释原理与用法,并包含多实例部署方式。 首先在泰拉瑞亚服务端下载页面最下方点击PC Dedicated Server下载服务端 目录结构 Dockerfile:镜像构建文件(原生运行) entrypoint.sh:启动脚本,自动生成 serverconfig.txt docker-compose.yml:单实例编排 docker-compose.multi.yml:多实例编排(普通/专家/大师) data/ / data-normal / data-expert / data-master:持久化目录 一、Dockerfile:把服务端打进镜像 Dockerfile 的核心目标是: 选择基础Linux镜像(这里是 Debian) 安装必要运行库 把服务端文件复制进去 设置启动脚本 Dockerfile 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 # 基础镜像:Debian 稳定版(包含 glibc,兼容性好) FROM debian:bookworm-slim # 入口脚本需要的默认环境变量 ENV TERRARIA_HOME=/opt/terraria \ TERRARIA_DATA=/data # 安装运行原生服务端所需的运行库 # --no-install-recommends:减少镜像体积 # 清理 apt 缓存以减少镜像大小 RUN apt-get update \ && apt-get install -y --no-install-recommends \ ca-certificates \ libstdc++6 \ libgcc-s1 \ && rm -rf /var/lib/apt/lists/* # 设置容器内工作目录 WORKDIR ${TERRARIA_HOME} # 复制服务端文件到镜像内 COPY . ${TERRARIA_HOME} # 确保二进制可执行 RUN chmod +x /opt/terraria/TerrariaServer.bin.x86_64 # 拷贝启动脚本 COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh # 元信息:声明服务端监听端口 EXPOSE 7777/tcp # 声明数据卷:世界/配置放在 /data VOLUME ["/data"] # 容器启动时执行入口脚本 ENTRYPOINT ["/entrypoint.sh"] 关键点 libstdc++6 / libgcc-s1:Terraria 原生二进制依赖的运行库 VOLUME ["/data"]:让世界文件与配置落在数据卷(容器可删除,数据仍在) ENTRYPOINT:容器启动时执行脚本 二、entrypoint.sh:启动脚本与自动配置 目标: ...

February 9, 2026 · 5 min

《遗憾》

碎碎念 / 02 见过花开就好了 又何必在意花属于谁? 花开是有情,花落是无意。 你记得花,花就不会枯萎;你记得我,我就会一直在。 似水流年,太过匆匆。一些故事来不及开始,就被写成了昨天; 一些人还没有好好相爱,就成了过客。离开你的人,是缘分到了,才与你告别。 “也许每场相遇并非都会有结果,但是,每场相遇又都会有它的意义。” 人生没有无用的经历。你我都要相信,那些曾经的意难平终将和解,而往后的万事也终会如意。

January 18, 2026 · 1 min

Tmux和Screen的对比区别与使用教程

终端复用神器对决:Tmux vs. Screen 全方位指南 在 Linux 远程运维或开发中,我们经常会遇到这样的问题:正在运行一个耗时几小时的任务,结果网络波动导致 SSH 断开,任务被迫中断。终端复用器(Terminal Multiplexer) 正是为此而生。 本文将深度对比老牌劲旅 Screen 与现代标杆 Tmux,并提供详细的使用教程。 核心概念:什么是终端复用? 终端复用器的核心功能可以概括为: 会话保护:断开连接后,后台任务继续运行,重新登录后可“恢复(Attach)”现场。 分屏操作:在同一个窗口内切分成多个小窗口(Panes)。 多会话管理:同时开启多个独立的任务环境。 一、 Tmux vs. Screen 深度对比 特性 Screen Tmux 诞生时间 1987年 (历史悠久) 2007年 (现代主流) 默认前缀键 Ctrl + a Ctrl + b 配置灵活性 配置文件较复杂 极其灵活,支持复杂脚本 状态栏 基本没有,需繁琐配置 默认开启,信息极丰富 分屏能力 垂直/水平分屏支持较晚 原生支持极佳,支持无限嵌套 资源占用 极低 低 (略高于 Screen) 总结建议: 如果你经常需要分屏开发、自定义高度美化的状态栏,请首选 Tmux。 如果你在极其古老、资源极其受限的系统上工作,或者习惯了 Ctrl+a 的手感,Screen 依然是可靠的选择。 二、 Tmux 详细用法 Tmux 采用三层结构:Session(会话) > Window(窗口) > Pane(面板)。 ...

January 14, 2026 · 2 min

《反思》

碎碎念 / 01 我无法一直有趣 我常常反思自己,为什么以前说喜欢我的人,后来渐行渐远。 可能因为刚认识我的时侯,我有着有趣的灵魂,开朗阳光的性格。和我聊天,你说你很放松,很开心。 可是慢慢熟悉之后,你才发现,原来我敏感多疑,性格粘人,让你难过,让你受不了。 “不要向别人展示那么多,没人愿意了解我的内心深处。他们爱的是我最初表现的样子。” 如果有人因为我的有趣喜欢我,那我就知道他一定会走。因为我没办法一直有趣,我也会没话说。 我的生活已经烂掉了。作息、情绪、饮食、床和房间,在乱掉的东西里,一边痛苦,一边又觉得痛。每天刷着毫无意义的手机和视频,真的好没意思。 一边焦虑,一边想:我还会幸福吗? 我知道,这或许有些难。没有人愿意包容我的任何情绪。思绪拉回之前,我曾谈过一段片刻让我真正开心的恋爱,为了守护那短暂的幸福我坚持了很久很久,但是结局最终仍是遗憾。 他们道歉也仅仅只是说那几句对不起,但没有真正去改正错误。我讨厌试探,讨厌触碰底线。 好像从来都没有人知道真实的我, 也没有人爱过真实的我。

January 14, 2026 · 1 min
留言