「黑马点评」五、分布式锁优化
基于 SETNX 的分布式锁问题 不可重入:获得锁的线程可以再次进入到相同锁的代码块中,意义在于防止死锁,如在锁内调用另一个带锁的,产生死锁 不可重试:没有重试机制,才获取一次就返回 false 超时释放:锁然避免了死锁,但是如果是业务超时,锁自动释放,可能的额外风险 主从一致性:如果使用 Redis 的主从集群,因为异步同步,可能会出现主节点宕机,数据未同步 Redisson 入门 Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格(In-Memory Data Grid) 提...
「黑马点评」四、分布式锁
分布式锁 产生背景:各自单机看各自的锁监视器却无法共享锁 image.png|500|500 不用 JVM 内部的锁,使用一个,满足分布式系统或集群模式下多进程可见且互斥的锁,即分布式锁 image.png|500|500 分布式锁:多进程可见、互斥、高可用、高性能、安全性...... 常见实现方案 " 配置oh-my-zsh wget https://gitee.com/pocmon/ohmyzsh/raw/master/tools/install.s...
「笔记007」Go语言Context初识 下
摘要: 本文介绍了Go语言的context在高级应用场景中的用法,包括多个协程共享context,结合http.Request的上下文管理,以及使用context实现超时重试。 - 在多协程中,父context的取消会影响所有子协程,并用sync.WaitGroup确保协程在主程序退出前完成。 - 在Web开发中,每个请求可用context管理,方便设置超时和传递数据。 - 使用context的Done方法进行任务的重试和超时控制。 注意事项包括避免滥用WithValue,确保资源释放,避免context跨边界传递。 最佳实践强调确定context范围、使用自定义类型作为键、明确取消信号,并避免将context作为函数返回值。
5. 高级应用场景 5.1 多协程共享 context context 的父子关系可以很好地控制多个协程的生命周期,尤其是在复杂任务中。 示例:任务分发与统一取消 package main import ( "context" "fmt" "sync" "time" ) func worker(ctx context.Context, id int, wg *sync.WaitGroup) { defer wg.Done() for { select {...
「笔记006」Go语言Context初识 上
摘要: 在Go语言中,`context`模块主要用于解决协程管理中的难题,如优雅终止协程、复杂的超时控制和跨函数的数据传递问题。通过使用`context`可以传递取消信号、设定任务超时以及传递上下文数据,而不必修改函数签名。重要的函数包括`context.Background`(根context)用于初始化,`context.TODO`(占位context)用于开发阶段,`context.WithCancel`用于手动取消任务,`context.WithTimeout`和`context.WithDeadline`用于自动超时控制,`context.WithValue`用于传递元数据。但传递数据量要少,避免滥用。
1. 为什么需要 context? 1.1 背景问题 在 Go 中,协程(goroutine)是轻量级线程,可以轻松地启动数以千计的并发任务。然而,这种便利也带来了一些问题: 无法优雅地终止协程: 一旦一个协程启动,除非显式退出,否则它可能一直运行下去,导致资源泄露。 如果一个任务失败了,依赖它的其他任务也需要取消,而传统的手段难以统一管理。 任务的超时控制复杂: 某些操作(如 HTTP 请求、数据库查询)需要超时控制,如果任务超时没有终止,可能会拖垮整个系统。 **函数间依赖数据传递麻...
「笔记005」Go课程工程实践作业2
前言 这次实现主要有关作业 1 的三个扩展功能: 用户认证授权 点赞和回复功能 分页和排序功能 一、用户认证授权实现笔记 1. 数据库设计思路 首先扩展用户表,添加认证相关字段: -- 用户表扩展 ALTER TABLE user ADD COLUMN password VARCHAR(255) NOT NULL COMMENT '密码', ADD COLUMN email VARCHAR(100) NOT NULL COMMENT '邮箱', ADD COLUMN last_login DATETIME COMM...