案例速成GO+redis 个人笔记
更多个人笔记:(仅供参考,非盈利)
gitee: https://gitee.com/harryhack/it_note
github: https://github.com/ZHLOVEYY/IT_note
(更多GO+redis等见内部,会及时更新~)
- 安装redis客户端:
go get github.com/redis/go-redis/v9
- 注意go mod tidy的时候不要import成了"github.com/go-redis/redis" 需要检查一下
数据持久化(RDB + AOF)
这个也是八股中很多的
Redis 的数据持久化通过 RDB(快照)和 AOF(追加日志)实现。Go 代码无需直接控制持久化(由 Redis 配置文件管理),但可以通过命令触发快照或检查持久化状态。
- RDB(Redis Database Backup) (案例)
- 原理:
- RDB 通过定期生成内存数据的快照(二进制文件,.rdb),保存到磁盘。
- 快照是某一时刻的完整数据副本,文件体积较小,恢复速度快。
- 触发方式:
- 自动触发:根据 save 配置(如 save 900 1 表示 900 秒内至少 1 次变更触发)。
- 手动触发:
- SAVE:阻塞主线程,生成快照(生产慎用)。
- BGSAVE:后台异步生成快照,常用。
- 优点:恢复速度比AOF快文件紧凑,适合备份和快速恢复
- 缺点:可能丢失数据(两次快照间隔内的变更会丢失!!!),BGSAVE 需要 fork 进程,内存占用较高
- 适用场景:
- 定期备份(如每天全量备份)。
- 对少量数据丢失可接受的场景(如缓存)。
RDB的配置文件 redis.config (示范)
- 原理:
save 900 1 # 900秒内至少1次变更触发快照
save 300 10 # 300秒内至少10次变更
save 60 10000 # 60秒内至少10000次变更 这几个同时生效保证不同场景
dir /var/redis # 快照文件存储路径
dbfilename dump.rdb # 快照文件名
触发快照的意思就是会进行一次更改更新(类似虚拟机的快照,但是这个直接覆盖)
- AOF(Append-Only File)
- 原理
- AOF 记录每次写操作(如 SET、DEL)到日志文件(.aof),每个写命令都会追加到 AOF 文件!!!类似数据库的 WAL(Write-Ahead Log)。
- 重启时,Redis 重放 AOF 文件重建数据
- 同步策略(appendfsync)
- always:每次写操作同步到磁盘,数据最安全但性能最低。
- everysec:每秒同步,折中方案(最多丢 1 秒数据)。
- no:依赖操作系统同步,性能最高但数据丢失风险大。
- AOF重写
- AOF 文件会随写操作不断增长,占用磁盘空间。
- BGREWRITEAOF 合并冗余命令(如多次 INCR 合并为一个 SET),生成更小的 AOF 文件。
- 优点:数据可靠性高,支持增量记录,适合高一致性场景
- 缺点:文件体积较大恢复速度慢(需重放所有命令)。写频繁的时候性能开销高
- 适用场景:
- 数据一致性要求高的场景(如订单、会话)。
- 与 RDB 结合使用,兼顾恢复速度和可靠性。
- 原理
AOF配置文件redis.config (示范)
appendonly yes # 启用 AOF
appendfsync everysec # 每秒同步
dir /var/redis # AOF 文件存储路径
appendfilename appendonly.aof # AOF 文件名
auto-aof-rewrite-percentage 100 # AOF 文件增长100%时触发重写
auto-aof-rewrite-min-size 64mb # AOF 文件至少64MB时触发重写
redis-cli中手动输入可以出发RDB和AOF:
BGSAVE # 手动触发快照
BGREWRITEAOF # 手动触发 AOF 重写
下面我们来实际操作一下
关于redis的启动(mac)
我的是mac,如果是homebrew启动的redis即通过指令 brew services start redis
那么即使执行 redis-cli shutdown
也无法关闭,homebrew启动的是类似全局的redis,需要使用 brew services start redis
进行关闭
# 查看当前运行的 Redis 可以用于检查问题
ps aux | grep redi
# 快速检查端口
lsof -i :6379 # 如果没有被占用就没有输出(显示为错误输出但实际没有输出的)
redis-cli config get dir
获取存储对应的目录,如果是homebrew启动的一眼就能看出来
redis-cli config get dbfilename
获取对应的dbfilename
redis.conf的demo:(结合了RDB和AOF)
save 900 1
save 300 10
dir ./redisstorage
dbfilename dump.rdb
appendonly yes
appendfsync everysec
appendfilename appendonly.aof
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
dir是目标存储文件夹,需要新建对应的文件夹
接着我们需要在当前文件夹的终端下执行 redis-server ./redis.conf
根据配置文件启动
运行GO
同样当前文件夹下,运行下面的go文件: (go run xxx.go)
package mainimport ("context""fmt""log""time""github.com/redis/go-redis/v9"
)func main() {// 连接 Redisclient := redis.NewClient(&redis.Options{Addr: "localhost:6379",})ctx := context.Background()// 测试连接_, err := client.Ping(ctx).Result()if err != nil {log.Fatal("连接失败:", err)}fmt.Println("连接成功")// 写入数据(触发 AOF 记录)err = client.Set(ctx, "persistent_key", "critical_data", 0).Err()if err != nil {log.Fatal("设置失败:", err)}fmt.Println("设置 persistent_key = critical_data")// 触发 RDB 快照err = client.BgSave(ctx).Err()if err != nil {log.Fatal("触发 RDB 快照失败:", err)}fmt.Println("触发 RDB 快照")// 触发 AOF 重写(优化 AOF 文件)err = client.BgRewriteAOF(ctx).Err()if err != nil {log.Fatal("触发 AOF 重写失败:", err)}fmt.Println("触发 AOF 重写")// 等待持久化完成time.Sleep(2 * time.Second)// 检查持久化状态info, err := client.Info(ctx, "persistence").Result()if err != nil {log.Fatal("获取持久化信息失败:", err)}fmt.Println("持久化状态:\n", info)// 验证数据value, err := client.Get(ctx, "persistent_key").Result()if err != nil {log.Fatal("读取失败:", err)}fmt.Printf("读取 persistent_key = %s\n", value)
}
- 运行后可以发现redisstorage中有添加存储数据
redis-cli
进入redis服务get persistent_key
发现可以看到键对应的值结果critical_data- 然后可以通过Ctrl-c退出运行redis的终端,或者
redis-cli shutdown
关闭服务 - 接着再次
redis-server ./redis.conf
启动服务,可以发现get persistent_key
还是可以得到对应的结果,说明成功(如果不配置持久化的话,就是不写配置文件,redis也会有默认配置文件存储在运行redis的文件夹下 )
进阶
package mainimport ("context""encoding/json""fmt""log""time""github.com/redis/go-redis/v9"
)// User 结构体,表示用户信息
type User struct {ID int `json:"id"`Name string `json:"name"`Age int `json:"age"`
}func main() {// 连接 Redisclient := redis.NewClient(&redis.Options{Addr: "localhost:6379",PoolSize: 10, // 连接池MinIdleConns: 2,})ctx := context.Background()// 测试连接_, err := client.Ping(ctx).Result()if err != nil {log.Fatal("连接失败:", err)}fmt.Println("连接成功")// 模拟用户数据users := []User{{ID: 1, Name: "Alice", Age: 25},{ID: 2, Name: "Bob", Age: 30},}// 使用 Pipeline 批量写入缓存pipe := client.Pipeline()for _, user := range users {key := fmt.Sprintf("user:%d", user.ID)data, err := json.Marshal(user)if err != nil {log.Printf("序列化用户 %d 失败: %v", user.ID, err)continue}// 设置缓存,TTL 1 小时pipe.Set(ctx, key, data, time.Hour)}_, err = pipe.Exec(ctx)if err != nil {log.Fatal("批量写入失败:", err)}fmt.Println("批量写入用户缓存")// 触发 RDB 快照err = client.BgSave(ctx).Err()if err != nil {log.Fatal("触发 RDB 快照失败:", err)}fmt.Println("触发 RDB 快照")// 检查 AOF 文件大小,决定是否重写info, err := client.Info(ctx, "persistence").Result()if err != nil {log.Fatal("获取持久化信息失败:", err)}var aofSize int64fmt.Sscanf(info, "aof_current_size:%d", &aofSize)if aofSize > 64*1024*1024 { // 超过 64MBerr = client.BgRewriteAOF(ctx).Err()if err != nil {log.Fatal("触发 AOF 重写失败:", err)}fmt.Println("触发 AOF 重写")} else {fmt.Printf("AOF 文件大小: %d 字节,无需重写\n", aofSize)}// 等待持久化完成time.Sleep(2 * time.Second)// 读取并验证缓存for _, user := range users {key := fmt.Sprintf("user:%d", user.ID)data, err := client.Get(ctx, key).Result()if err != nil {log.Printf("读取用户 %d 失败: %v", user.ID, err)continue}var cachedUser Usererr = json.Unmarshal([]byte(data), &cachedUser)if err != nil {log.Printf("反序列化用户 %d 失败: %v", user.ID, err)continue}fmt.Printf("读取用户: %+v\n", cachedUser)}// 模拟缓存失效后从数据库加载key := "user:1"//手动删除缓存client.Del(ctx, key)// 现在尝试获取,会触发缓存缺失_, err = client.Get(ctx, key).Result()if err == redis.Nil {fmt.Println("缓存缺失,模拟从数据库加载")user := User{ID: 1, Name: "Alice", Age: 26}data, _ := json.Marshal(user)err = client.Set(ctx, key, data, time.Hour).Err()if err != nil {log.Fatal("重新缓存失败:", err)}fmt.Println("重新缓存用户 1")}
}
大家可以新建一个自己拿这个尝试一下,多设置了AOF的自动更新,可以增加插入数据尝试
哨兵模式
哨兵模式(Sentinel)用于 Redis 高可用,监控主从节点,自动故障转移。Go 客户端通过 go-redis 的 FailoverClient 连接哨兵
新建sentinel.conf 文件:
port 26379
sentinel monitor mymaster 127.0.0.1 6379 1
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 15000
- 设置端口为26379
- 设置监控的主节点,以及只用一个哨兵就可以完成选举(多配置哨兵可以实现高可用)
- 主节点响应超过 5000 毫秒(5秒)就认为主观下线
- 障转移超时时间为 15000 毫秒(15秒),时间内没完成转移认为转移失败
准备好GO文件:
package mainimport ("context""fmt""log""github.com/redis/go-redis/v9"
)func main() {// 连接哨兵client := redis.NewFailoverClient(&redis.FailoverOptions{MasterName: "mymaster", // 哨兵监控的主节点名称SentinelAddrs: []string{"localhost:26379"}, // 哨兵地址})ctx := context.Background()// 测试连接_, err := client.Ping(ctx).Result()if err != nil {log.Fatal("连接失败:", err)}fmt.Println("哨兵模式连接成功")// 写入数据err = client.Set(ctx, "sentinel_key", "high_availability", 0).Err()if err != nil {log.Fatal("设置失败:", err)}fmt.Println("设置 sentinel_key = high_availability")// 读取数据value, err := client.Get(ctx, "sentinel_key").Result()if err != nil {log.Fatal("读取失败:", err)}fmt.Printf("读取 sentinel_key = %s\n", value)// 模拟主节点故障(手动停止主节点)fmt.Println("请手动停止主节点(6379),然后再次读取")// 等待用户操作// 假设主节点故障,哨兵自动切换到从节点time.Sleep(10 * time.Second)// 再次读取,验证故障转移value, err = client.Get(ctx, "sentinel_key").Result()if err != nil {log.Fatal("故障转移后读取失败:", err)}fmt.Printf("故障转移后读取 sentinel_key = %s\n", value)
}
需要开启多个终端:
配置主节点redis-server --port 6379
配置从节点:redis-server --port 6380 --replicaof 127.0.0.1 6379
启动哨兵:redis-sentinel ./sentinel.conf
运行GO文件:go run xxx.go
接着自己手动关闭主节点的redis服务,等待后可以发现故障转移后可以读取!
- 通过redis-cli验证
redis-cli -p 26379
SENTINEL get-master-addr-by-name mymaster # 查看当前主节点
# 输出:127.0.0.1 6379# 停止主节点(另一个终端)
redis-cli -p 6379 SHUTDOWN# 再次检查主节点(哨兵应切换到 6380)
SENTINEL get-master-addr-by-name mymaster
# 输出:127.0.0.1 6380
还有集群+多哨兵等,就需要启动多个终端,在此先不拓展
相关文章:
案例速成GO+redis 个人笔记
更多个人笔记:(仅供参考,非盈利) gitee: https://gitee.com/harryhack/it_note github: https://github.com/ZHLOVEYY/IT_note (更多GOredis等见内部,会及时更新~&#x…...
C/C++ 头文件包含机制:从语法到最佳实践
在C/C++编程中,头文件(.h 或 .hpp)扮演着至关重要的角色。它们不仅是代码模块化的基石,更是编译器理解程序结构的关键。然而,头文件的使用看似简单,实则暗含许多细节,稍有不慎便可能导致编译错误、代码冗余,甚至隐藏难以调试的问题。本文将从语法、编译器行为到工程实践…...
职业教育新形态数字教材的建设与应用:重构教育生态的数字化革命
教育部新时代职业学校名师(名匠)名校长培养计划、四川省第四批职业学校名师(名匠)培养计划专题 在某职业院校的智能制造课堂上,学生佩戴VR设备,通过数字教材中的虚拟工厂完成设备装配训练,系统实时生成操作评分与改进建议。这一场景折射出职业…...
跟着deepseek学golang--Go vs Java vs JavaScript三语言的差异
文章目录 一、类型系统与编译方式1. 类型检查时机2. 空值安全设计 二、并发模型对比1. 并发单元实现4. 锁机制差异 三、内存管理机制1. 垃圾回收对比2. 对象模型差异 四、工程实践差异1. 依赖管理工具4. 异常处理范式 五、跨平台能力对比1. 编译输出目标 综合对比表五角星说…...
梯度下降法
梯度下降法是一种常见的求最小值(或最值)的方法。它是通过沿着函数梯度的负方向进行迭代更新,直到找到局部最小值或最大值。梯度下降法应用于多元函数时,通过更新参数的方式找到最优解。 梯度下降法步骤: 初始化参数&…...
【Java 数据结构】List,ArrayList与顺序表
目录 一. List 1.1 什么是List 1.2 List 的常见方法 1.3 List 的使用 二. 顺序表 2.1 什么是顺序表 2.2 实现自己的顺序表 2.2.1 接口实现 2.2.2 实现顺序表 三. ArrayList 3.1 ArrayList简介 3.2 ArrayList的三个构造方法 3.2.1 无参构造方法 3.2.2 带一个参数的…...
用Python做有趣的AI项目1:用 TensorFlow 实现图像分类(识别猫、狗、汽车等)
项目目标 通过构建卷积神经网络(CNN),让模型学会识别图片中是什么物体。我们将使用 CIFAR-10 数据集,它包含 10 类:飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船和卡车。 🛠️ 开发环境与依赖 安装依赖&…...
正确应对监管部门的数据安全审查
首席数据官高鹏律师团队编著 在当今数字化时代,数据安全已成为企业及各类组织面临的重要议题,而监管部门的数据安全审查更是关乎其生存与发展的关键挑战。随着法律法规的不断完善与监管力度的加强,如何妥善应对这一审查,避免潜在…...
Springboot用IDEA打jar包 运行时 错误: 找不到或无法加载主类
Springboot用IDEA打jar包 运行时 错误: 找不到或无法加载主类 今天遇到个很神奇的问题。 就是我在打包我项目后。用java -jar命令的话 是无法启动这个项目的。 但是我在idea里面进行运行 就可以运行 先说结论 因为我这个是jdk17的项目 而我本机的jdk是1.8 所以说就会出现…...
【Linux网络】构建与优化HTTP请求处理 - HttpRequest从理解到实现
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
【高频考点精讲】实现垂直居中的多种CSS方法比较与最佳实践
前端工程师必看:7种CSS垂直居中方案大比拼(附真实代码) 今天咱们聊聊前端开发中最让人头疼的问题之一——垂直居中。不知道你们有没有遇到过这种情况:明明设置了margin: 0 auto水平居中了,垂直方向怎么折腾都不对劲。全栈老李当年刚入行时,为了一个div居中能折腾一晚上,…...
Java 字符串基础介绍
在 Java 编程中,字符串是不可或缺的一部分。无论是用户界面的消息显示、文件路径的处理,还是用户信息的存储,字符串都扮演着至关重要的角色。本文将带您深入了解 Java 字符串的特性、用法以及一些高级技巧,帮助您在编程实践中更加…...
SpringBoot中暗藏的设计模式
一、工厂模式 想象一下你去奶茶店点单——你只需要告诉店员要"珍珠奶茶",后厨就会自动完成煮茶、加料、封口整套流程。这就是工厂模式在SpringBoot中的体现。 典型应用场景: Bean的创建过程(ApplicationContext就是超级工厂&…...
使用 AFL++ 对 IoT 二进制文件进行模糊测试 - 第一部分
American fuzzy lop 是一款面向安全的模糊测试器,它采用一种新型的编译时插桩和遗传算法,可以自动发现干净、有趣的测试用例,从而触发目标二进制文件中新的内部状态。这显著提高了模糊测试代码的功能覆盖率。 AFL 的地址是https://lcamt uf.coredump.cx/afl/ 。它已经有一段…...
Java 线程的六种状态与完整生命周期详解
🚀 Java 线程的几种状态详解 在 Java 中,线程状态(Thread State)是由 Thread.State 枚举定义的,总共有六种: 状态含义典型场景示例NEW新建状态,线程对象刚创建,还未调用 start() 方…...
常见的机器视觉通用软件
国际常用软件 OpenCV : 特点 :开源免费,社区支持强大,拥有丰富的图像处理和计算机视觉算法库,支持多种编程语言,如 C、Python、Java 等,可实现对象检测、图像分割、特征提取等功能,具…...
使用 Frida 绕过 iOS 应用程序中的越狱检测
在这篇博文中,我们将介绍**Frida**,它是用于移动应用程序安全分析的真正有趣的工具之一。 我们在高级 Android 和 iOS 漏洞利用培训中也深入讲解了这一点,您可以在这里注册 -培训链接 即使您从未使用过 Frida,本文也将作为指南,帮助您进入 Frida 的世界,进行移动应用程…...
创建可执行 JAR 文件
📦 创建可执行 JAR 文件 🔹 概述 在完成示例的最后环节,我们将创建一个完全自包含的可执行 jar 文件,该文件可直接在生产环境运行。可执行 jar(又称 uber jar 或 fat jar)是一种包含编译后类文件及全部运行…...
LIDC-IDRI数据集切割代码教程【pylidc库】
数据集: 通过网盘分享的文件:LIDC 链接: 百度网盘 请输入提取码 提取码: ywb8 代码: 通过网盘分享的文件:LIDC-IDRI-Preprocessing.rar 链接: 百度网盘 请输入提取码 提取码: b1za 【代码里的部分数据就不删了,方…...
Java数据结构——Stack
Stack 栈的概念和使用栈的概念栈的使用 栈的应用出栈元素序列有效的括号栈的压入、弹出序列逆波兰表达式最小栈 栈的概念和使用 栈的概念 栈(Stack):一种特殊的线性表,只允许再栈的一端进行插入和删除元素,这一端点被称为栈顶,另…...
SMT贴片加工费控制与优化实践指南
内容概要 SMT贴片加工费的控制与优化需建立在对成本结构的系统性认知基础上。本节从物料采购、设备运行、工艺参数三大维度切入,结合BOM清单管理、钢网使用规范等实操环节,构建覆盖全流程的降本增效框架。以下表格列举了SMT加工成本的典型构成要素及其占…...
Eclipse 插件开发 4 工具栏
Eclipse 插件开发 4 工具栏 1 增加工具(push)2 增加工具(toggle)3 增加工具(radio) 位置locationURI备注菜单栏menu:org.eclipse.ui.main.menu添加到传统菜单工具栏toolbar:org.eclipse.ui.main.toolbar添加到工具栏 style 值含义显示效果push普通按钮(默认&#x…...
Dify中的文本分词处理技术详解
Dify中的文本分词处理技术详解 引言核心架构概览索引处理器工厂 文本分词技术详解基础分词器增强型递归字符分词器固定分隔符文本分词器递归分割算法 索引处理器中的分词应用特殊索引处理器的分词特点问答索引处理器父子索引处理器 分词技术的应用场景技术亮点与优势总结 引言 …...
Linux之netlink(2)libnl使用介绍(1)
Linux之netlink(2)Libnl3使用介绍(1) Author:Onceday Date:2025年4月26日 漫漫长路,才刚刚开始… 全系列文章可查看专栏: Linux内核知识_Once-Day的博客-CSDN博客 本文翻译自libnl3官方文档:Netlink Library (libnl) 参考文档…...
【2025 最新前沿 MCP 教程 04】通信渠道:理解 MCP 传输机制
文章目录 1. 开始啦!2. 本地集成与标准输入输出(stdio)3. 通过 HTTP 实现 SSE(服务器发送事件)的远程通信4. 展望未来:向可流式 HTTP 的过渡 1. 开始啦! 在第三章中,我们解析了模型…...
Qt Charts 绘制曲线图示例
Qt Charts 绘制曲线图示例 Qt Charts 是 Qt 的图表模块,可用于绘制折线图、曲线图等。以下是实现步骤: 1. 配置项目文件 在 .pro 文件中添加 Charts 模块: QT charts2. 创建基础图表 #include <QtCharts>// 创建图表视图和图表对…...
统计学_一元线性回归知识点梳理
1 变量间关系的度量 1.1 变量间的关系 (1)相关关系:变量之间是不确定的数量关系,比如农作物产量和施肥量的关系。(2)函数关系:变量之间是一一确定的对应的关系,y 完全依赖于 x。 …...
【计算机视觉】CV项目实战- 深度解析TorchVision_Maskrcnn:基于PyTorch的实例分割实战指南
深度解析TorchVision_Maskrcnn:基于PyTorch的实例分割实战指南 技术背景与核心原理Mask R-CNN架构解析项目特点 完整实战流程环境准备硬件要求软件依赖 数据准备与标注1. 图像采集2. 数据标注3. 数据格式转换 模型构建与训练1. 模型初始化2. 数据加载器配置3. 训练优…...
数据分析岗位-相关知识
数据分析岗位 1.大数据2.业务(朴素理念) 1.大数据 数据流向 :MySQL等传统业务数据(结构、半结构、非结构) → ETL → 数据仓库 / 数据计算 → BI(BI也提供计算能力) sequenceDiagramMySQL->…...
使用 Truffle 和 Ganache 搭建本地以太坊开发环境并部署一个简单智能合约
使用 Truffle 和 Ganache 搭建本地以太坊开发环境并部署一个简单智能合约的详细步骤: 一、环境搭建 安装 Node.js 和 npm Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,npm 是 Node.js 的包管理器。可以从 Node.js 官方网站下载安装程序…...
Set的学习
1. Set是继承自Collection的一个接口类 2. Set中只存储了key,并且要求key一定要唯一 3. TreeSet的底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中的 4. Set最大的功能就是对集合中的元素进行去重 5. 实现Set接口的常用…...
Python爬虫实战:获取高考资源网各学科精品复习资料
一、引言 高考资源网拥有丰富的高考复习资料,对于我们而言,获取这些资源并整理分享能为考生提供有价值的帮助。然而,手动从网站查找和下载资源效率低且易出错。利用 Python 爬虫技术可实现自动化资源获取,提高工作效率。但在爬取过程中,需考虑网站反爬机制,采取相应措施…...
Linux下编译并打包MNN项目迁移至其他设备
1. 构建项目结构 该项目是利用MNN框架对MTCNN网络进行推理,实现对目标的实时检测 运行环境:Linux 相关库:opencv,MNN 先给出项目的总体结构,如下: mtcnn_mnn/ ├── include/ │ ├── opencv2/ …...
WPF框架中异步、多线程、高性能、零拷贝技术的应用示例
WPF框架中异步、多线程、高性能与零拷贝技术应用示例 一、异步编程在WPF中的应用 1. 异步数据加载(避免UI冻结) // ViewModel中的异步数据加载示例 public class MainViewModel : INotifyPropertyChanged {private ObservableCollection<string> _items;public Obse…...
SpringBoot实现的后端开发
目录 一、设计阶段 1.设计ER图 2.创建数据库表 二、项目环境搭建 1.创建项目 2.在pom.xml中添加依赖 3.配置数据库连接 4.状态码的封装 5.开发自定义异常 6.密码加密 7.规范时间格式展示 8.添加Guava本地缓存 9.JWT 三、构建项目开发 1.创建项目结构 2.开发实…...
IntelliJ IDEA修改实体类成员变量的名称(引入了该实体类的全部文件也会自动更新变量的名称)
文章目录 1. 问题引入2. 修改实体类成员变量的名称2.1 鼠标双击要修改的变量2.2 按下SHIFT F6快捷键 更多 IntelliJ IDEA 的使用技巧可以查看 IntelliJ IDEA 专栏: IntelliJ IDEA 1. 问题引入 在使用IntelliJ IDEA开发项目时,你是否遇到过以下难题 需…...
Weaviate使用入门:从零搭建向量数据库的完整指南
一、Weaviate简介与核心优势 Weaviate是一款开源向量搜索引擎,专为存储和检索高维向量数据设计,支持文本、图像等多种媒体类型。其核心功能包括语义搜索、问答提取、分类等,具备以下独特优势: 低延迟:毫秒级响应时间…...
element ui el-col的高度不一致导致换行
问题:ell-col的高度不一致导致换行,刷新后审查el-col的高度一致 我这边是el-col写的span超过了24,自行换行,测试发现初次进入里面的高度渲染的不一致,有的是51px有的是51.5px 问题原因分析 Flex布局换行机制 Elemen…...
Windows 安装 MongoDB 教程
Windows 安装 MongoDB 教程 MongoDB 是一个开源的 NoSQL 数据库,它使用文档存储模型而不是传统的关系表格。它非常适合需要处理大量数据并且需要高性能、可扩展性的应用场景。下面是如何在 Windows 系统上安装 MongoDB 的详细步骤。 一、准备工作 确保你的 Windo…...
23种设计模式-行为型模式之观察者模式(Java版本)
Java 观察者模式(Observer Pattern)详解 🧠 什么是观察者模式? 观察者模式是一种行为型设计模式,定义对象之间的一种一对多的依赖关系,使得每当一个对象状态发生变化时,所有依赖它的对象都会得…...
从“拼凑”到“构建”:大语言模型系统设计指南!
你有没有试过在没有说明书的情况下组装宜家家具?那种手忙脚乱却又充满期待的感觉,和设计大语言模型(LLM)系统时如出一辙。如果没有一个清晰的计划,很容易陷入混乱。我曾经也一头扎进去,满心期待却又手足无措,被网上那些复杂的架构图搞得晕头转向。于是,我坐下来,把它们…...
云原生--核心组件-容器篇-3-Docker三大核心之--镜像
1、定义与作用 定义: Docker镜像是一个只读的模板,包含运行应用程序所需的所有内容,包括代码、依赖库、环境变量、配置文件等。简单来说,Docker镜像是一个轻量级、独立、可执行的软件包,它包含了运行某个软件所需的所有…...
在QML中获取当前时间、IP和位置(基于网络请求)
目录 引言相关阅读最终效果代码详解1. 基础框架与窗口设置2. IP定位功能实现3. IP获取功能4. 时间更新与应用初始化5. 用户界面布局 总结工程下载 引言 在本文中,我们将探讨如何使用Qt Quick构建一个简单的系统信息显示应用。该应用能够获取当前系统时间、IP地址以…...
Nuxt3中使用UnoCSS指南
Nuxt3中使用UnoCSS指南 UnoCSS是一个高度可定制的、原子化CSS引擎,可以轻松集成到Nuxt3项目中。下面介绍如何在Nuxt3中安装和配置UnoCSS。 安装步骤 安装UnoCSS的Nuxt模块: # 使用pnpm pnpm add -D unocss unocss/nuxt# 使用yarn yarn add -D unocss…...
【计算机网络】TCP的四种拥塞控制算法
TCP(传输控制协议)是互联网协议套件中用于在网络中两个主机之间提供可靠、有序和错误检测数据传输的协议。TCP使用拥塞控制机制来避免网络拥塞,确保网络资源的有效利用。以下是TCP中常见的四种拥塞控制算法: 慢启动(S…...
WebAssembly全栈革命:在Rust与JavaScript之间构建高性能桥梁
一、WASM的全栈渗透图谱 1. 性能临界点的突破 // Rust实现的斐波那契计算 #[wasm_bindgen] pub fn wasm_fib(n: i32) -> i32 {match n {0 > 0,1 > 1,_ > wasm_fib(n-1) wasm_fib(n-2)} }// JavaScript等效实现对比 console.time(js); jsFib(40); // 1024ms cons…...
深度理解linux系统—— 了解操作系统
一、冯诺依曼体系结构 现在我们常见的计算机(笔记本电脑等)和不常见的计算机(服务器)它们都满足冯诺依曼体系。 我们可以把计算机理解成一个个硬件组成的 输入设备:键盘、鼠标、摄像头、网卡、磁盘等输出设备…...
【fork初体验】
文章目录 Linux 实验:深入理解 fork 系统调用一、实验目的二、实验环境三、实验内容与步骤(一)打印进程的进程 ID 和父进程 ID1. 编写程序2. 编译与运行3. 运行结果 (二)使用 fork 系统调用创建进程并加入循环语句1. 编…...
区块链VS传统数据库:金融数据存储的“信任”与“效率”博弈
在金融行业数字化转型的浪潮中,数据存储技术选型已成为核心议题。区块链技术凭借其去中心化、不可篡改等特性强势崛起,而传统数据库(如关系型数据库MySQL、分布式数据库)凭借成熟生态和高效性能仍占据主导地位。如何在两者之间做出…...
Linux渗透测试
Linux渗透测试 比赛题库-Linux渗透测试 文章目录 Linux渗透测试比赛题库-Linux渗透测试 前言一、解题过程1.通过本地PC中渗透测试平台Kali对靶机场景进行系统服务及版本扫描渗透测试,并将该操作显示结果中Apache服务对应的版本信息字符串作为Flag值提交;…...