併發控制-文件鎖
在以往的項目中,遇到高併發大流量需求做併發控制的時候一般都使用redis分佈式鎖或者mysql加鎖處理高併發情況。最近遇到一個php項目,沒有安裝redis,由於某種原因也不考慮使用mysql加鎖控制併發,所以採用文件鎖的方式控制併發,整理了下代碼 php版本 class FileLock { /** @var string 鎖名稱 唯一性 */ private string $k
Nickname tim_xiao
Contributes91
Followers0
在以往的項目中,遇到高併發大流量需求做併發控制的時候一般都使用redis分佈式鎖或者mysql加鎖處理高併發情況。最近遇到一個php項目,沒有安裝redis,由於某種原因也不考慮使用mysql加鎖控制併發,所以採用文件鎖的方式控制併發,整理了下代碼 php版本 class FileLock { /** @var string 鎖名稱 唯一性 */ private string $k
Nickname tim_xiao
在當今雲計算與微服務盛行的時代,分佈式任務系統已成為支撐大規模業務的核心基礎設施。今天就來為大家分享下如何基於 Go 語言從零設計和實現一個架構簡潔且擴展性強的分佈式任務系統。 前置概念 本文會設計並實現一個分佈式任務系統,這裏我們要先明確兩個概念。 分佈式:在我們將要實現的分佈式任務系統中,分佈式是指我們的服務可以部署多個副本,這樣才能確保服務更加穩定。 任務:這裏的任務是指異步任務,可能
Nickname 江湖十年
Golang 中主流程要控制某個協程的暫停與繼續,需要兩個通道分別接收來自主流程的通知,並在協程中始終監聽這兩個通知。例如: package main import ( "fmt" "time" ) func main() { // 創建一個通道 chPause := make(chan struct{}) chResume := make(chan s
Nickname vistart
思路 在基於 Gin 封裝出屬於自己的 Web 框架前,你需要先了解 Gin 的基本用法和設計理念。 然後,你可以通過以下步驟來封裝自己的 Web 框架: 封裝路由:Gin 的路由是通過 HTTP 方法和 URL 路徑進行匹配的,你可以根據自己的需求,封裝出符合應用的業務需求的路由。你可以考慮將路由進行分類,例如公共路由、私有路由等,以方便管理。 封裝中間件:Gin 提供了很多中間件,例如日
Nickname 程序員新亮
引言 在傳統的 Go 語言 Web 服務和微服務開發中,開發者常常面臨諸多痛點,這些問題不僅降低了開發效率,還增加了維護成本。為了解決這些問題,Go 開發框架 Sponge 應運而生。本文將詳細説明傳統開發的痛點,並闡述為何需要 Sponge 來應對這些挑戰。 傳統開發的痛點 1. 繁瑣的開發流程 Web 服務:例如使用 Gin 框架時,需要手動配置路由、處理 HTTP 請求、編寫中間件等,代
Nickname gvison
前言 Go 語言簡潔、高效、併發性能超神,簡直是後端開發的一股清流。喜歡它的純粹,愛它那 “less is more” 的哲學。但説實在的,這份“純粹”有時候也意味着咱得“白手起家”,從零開始搭輪子。 每天寫着相似的 “樣板代碼”(Boilerplate Code),一遍又一遍地處理着數據庫的增刪改查(CRUD),為 HTTP 和 gRPC 服務手寫着數據綁定和服務註冊...... 是不是感覺身體
Nickname gvison
Github:https://github.com/wujingquan/cvm 歡迎PR,各位巨佬使用。 CVM for Windows 消除了在Windows上的CLI中更改Composer 版本的麻煩。 這個包有一個比nvm更小眾的用例。當在Windows上開發並使用集成終端時,很難讓這些終端真正聽取PATH的變化。 這個實用程序改變了這一點。 安裝 到Github Releases
Nickname wujingquan
剛剛結束的關於「Go」語言的技術徵文活動,參與活動的創作者們,撰寫了很多優質技術內容,本期週刊做了彙總,歡迎大家一起閲讀~ 本篇文章較長,建議收藏後慢慢閲讀~ 文章推薦 【Go 微服務】開發 gRPC 總共分三步 // 王中陽 Go 通過這篇文章我們已經掌握了 gRPC 相關的知識點,可以獨立用 Go 實現客户端和服務端的編寫,並且通過服務註冊對外提供服務,實現可客户端和服務端的 gRPC
Nickname 鹹口鍋包肉
Go 是 Google 開發的一種靜態強類型、編譯型、併發型,並具有垃圾回收功能的編程語言。 本期技術週刊一起了解 Go,歡迎大家閲讀 ~ 文章推薦 Golang 如何優雅接入多個遠程配置中心? // 王中陽Go viper是適用於go應用程序的配置解決方案,這款配置管理神器,支持多種類型、開箱即用、極易上手。 本地配置文件的接入能很快速的完成,那麼對於遠程apollo配置中心的接入,是否也能很快
Nickname 鹹口鍋包肉
前言 閉包對於一個長期寫 Java 的開發者來説估計鮮有耳聞,我在寫 Python 和 Go 之前也是沒怎麼了解,光這名字感覺就有點"神秘莫測",這篇文章的主要目的就是從編譯器的角度來分析閉包,徹底搞懂閉包的實現原理。 函數一等公民 一門語言在實現閉包之前首先要具有的特性就是:First class function 函數是第一公民。 簡單來説就是函數可以像一個普通的值一樣在函數中傳遞,也能對變量
Nickname crossoverJie
以前寫 Java 的時候,聽到前端同學談論閉包,覺得甚是新奇,後面自己寫了一小段時間 JS,雖只學到皮毛,也大概瞭解到閉包的概念,現在工作常用語言是 Go,很多優雅的代碼中總是有閉包的身影,看來不瞭解個透是不可能的了,本文讓我來科普(按照自己水平隨便瞎扯)一下: 1、什麼是閉包? 在真正講述閉包之前,我們先鋪墊一點知識點: 函數式編程 函數作用域 作用域的繼承關係 ## 1.1
Nickname 秦懷雜貨店
用幾個例子説明golang的閉包函數,結合defer使用,配合對應代碼及文末總結。 函數 説明 輸出 e1 defer調用,相當於是拿到了當前err變量的快照,即註冊defer函數的時候,將當下err的值塞入到defer中 start err1 e2 defer 調用,但是一個閉包函數,且閉包函數有傳參,閉
Nickname 牙小木木
本文首發於公眾號:Hunter後端 原文鏈接:Golang基礎筆記八之函數 本篇筆記介紹 Golang 裏函數相關的內容,以下是本篇筆記目錄: 函數的定義語法 函數返回值 可變參數函數 匿名函數 閉包 1、函數的定義語法 函數的定義格式如下: func 函數名(參數列表) (返回值列表) { 函數體 } 比如下面是一個兩數相加返回其和的函數: func add(a, b in
Nickname Hunter
關於併發 Go 語言的創始人Rob Pike 曾説過:並行關乎執行,併發關乎結構。他認為: • 併發是一種程序設計方法:將一個程序分解成多個小片段,每個小片段獨立執行;併發程序的小片段之間可以通過通信相互協作。 • 並行是有關執行的,它表示同時進行一些計算任務。 程序小片段之間通訊不同語言實現不同,比如:傳統語言Java使用共享內存方式達到線程之間通訊,而Go語言channel來進行通
Nickname 編程碼農
首發地址:https://mp.weixin.qq.com/s/-FtDLcHW39vgvqSMUVM-yw 前段時間我在《Go 併發控制:errgroup 詳解》一文中講解了 errgroup 的用法和源碼,通過源碼我們知道 errgroup 內部是使用 sync.WaitGroup 實現的,那麼本文就更進一步,來探索下 sync.WaitGroup 源碼是如何實現的。 使用示例 sync.Wa
Nickname 江湖十年
我們知道,Go 中的 map 類型是非併發安全的,所以 Go 就在 sync 包中提供了 map 的併發原語 sync.Map,允許併發操作,本文就帶大家詳細解讀下 sync.Map 的原理。 使用示例 sync.Map 提供了基礎類型 map 的常用功能,使用示例如下: package main import ( "fmt" "sync" ) func main() {
Nickname 江湖十年
上週發佈的文章「Go 併發控制:sync.Map 詳解」有讀者反饋説我寫的太難了,上來就挑戰源碼,對新手不夠友好。所以這篇文章算作補充,從入門到進階的順序講解一下在 Go 中如何自己實現一個併發安全的 map。 內置 map 首先,我們來測試一下 Go 語言內置 map 併發安全性,示例如下: https://github.com/jianghushinian/blog-go-example/tr
Nickname 江湖十年
在分佈式系統中,協調多個服務實例之間的共享資源訪問是一個經典的挑戰。傳統的單機鎖(如 sync.Mutex)無法實現跨進程工作,此時就需要用到分佈式鎖了。本文將介紹 Go 語言生態中基於 Redis 實現的分佈式鎖庫 redsync,並探討其使用方法和實現原理。 分佈式鎖 首先我們來探討下為什麼需要分佈式鎖?當我們編寫的程序出現資源競爭的時候,就需要使用互斥鎖來保證併發安全。而我們的服務很有可能不
Nickname 江湖十年
你一定聽説過 Go 語言所倡導的這個核心併發原則:“不要通過共享內存來通信,而要通過通信來共享內存 (Don't communicate by sharing memory; instead, share memory by communicating)”。這一理念深刻影響了 Go 的併發設計。 本文將具體討論 Go 中的 併發控制機制 (concurrency control mechanism
Nickname user_zsXbv7Bi
Once 單例對象:在整個應用程序的生命週期中,只有一個實例存在,並提供一個全局統一的訪問點來獲取這個唯一的實例 應用場景:數據庫連接池,全局配置管理器,日誌記錄器 (Logger) Once 是在 Go 語言中實現線程安全的單例模式的完美且最地道的工具 使用 Once 可能出現的 2 種錯誤 第一種錯誤:死鎖 once.Do()中再次調用once.Do() 第二種錯誤
Nickname 粘豆煮包
公眾號首發地址:https://mp.weixin.qq.com/s/j5vKNxl2keMF7oPT5M0XnA 最近我寫了一篇講解 context 包源碼的文章《Go 併發控制:context 源碼解讀》,在閲讀源碼的過程中,我在 context 包測試代碼中發現了一個解決循環依賴的小技巧,在此分享給大家。 x_test.go 解決循環依賴 context 包源碼目錄結構如下: https:/
Nickname 江湖十年
Go 語言的 map 是內置的鍵值對(Key-Value)集合類型,是基於哈希表實現的高效數據結構,用於高效存儲和查找數據。其核心特性如下: 無序性:map 中的鍵值對存儲順序不固定,無法通過索引訪問(區別於切片)。 鍵唯一性:鍵(Key)必須唯一,重複插入同一鍵會覆蓋舊值。 動態大小:map 會根據存儲的數據量自動擴容,無需手動管理內存。 通過深入理解 map 的源碼和內存分配,開發者
Nickname soroqer
“不要通過共享內存來通信,而要通過通信來共享內存”。這句話精準概括了 Go 併發模型的核心哲學——而承載這一哲學的核心原語,正是 channel(通道)。 要深入理解 channel,我們需要從 runtime 包的源碼層面分析其核心結構、關鍵操作(創建、發送/接收、關閉)的實現邏輯,以及底層如何通過同步機制(鎖、等待隊列)實現協程(Goroutine)間的安全通信。 以下源碼基於 go1.24.
Nickname soroqer
Go 後台任務的“坑”,你踩過幾個? 在 Go 應用開發中,總有一些任務不適合現場完成,比如: 發郵件/發短信:用户點擊按鈕後,還要乾等?體驗太糟糕! 大計算量任務:生成報表、數據分析,CPU 一直被佔,其他請求全卡住? 定時任務:凌晨跑統計、每小時同步數據,難道要寫個死循環 time.Sleep? 所以,聰明的我們會把這些任務扔進異步任務隊列,讓後台“工人”(Worker)慢慢處理。
Nickname gvison