日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

实验干货分享:用Go语言实现分布式缓存开发之map

發(fā)布時(shí)間:2024/4/14 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实验干货分享:用Go语言实现分布式缓存开发之map 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本實(shí)驗(yàn)是整個(gè)分布式緩存開發(fā)的基礎(chǔ)實(shí)驗(yàn),主要會(huì)使用 Go 語言的內(nèi)置庫完成一個(gè)單機(jī)版的緩存服務(wù),后面會(huì)基于這個(gè)單機(jī)版的緩存服務(wù)來升級(jí)改造,逐步迭代成為一個(gè)分布式的緩存服務(wù)。本實(shí)驗(yàn)會(huì)使用 Go 語言的 map 來開發(fā)一個(gè)緩存結(jié)構(gòu),并使用 sync 包來保證并發(fā)安全,最后使用 http 包來提供網(wǎng)絡(luò)服務(wù)。由于篇幅有限,這里僅展現(xiàn)map容器的使用,我會(huì)把后續(xù)和源代碼放在文章最后,大家自取哦~

知識(shí)點(diǎn)

  • Go map 容器的使用

緩存的介紹

緩存的第一印象
我們先來看這樣一個(gè)問題:一個(gè)程序有 1TB 的數(shù)據(jù)都存在硬盤上,但其中只有 1GB 的數(shù)據(jù)會(huì)被頻繁地讀取,假設(shè)硬盤的讀取速度是 100MB/s,那么每一次讀取都會(huì)消耗 10 秒,有沒有什么辦法可以提高讀取的速度?

很明顯,這個(gè)問題是由于硬盤的速度太慢了,導(dǎo)致讀取時(shí)間太久,而且只是其中 1GB 數(shù)據(jù)會(huì)被頻繁地讀取,那我們能不能把這 1GB 的數(shù)據(jù)存到一個(gè)速度更快的地方,比如存到內(nèi)存中,假設(shè)內(nèi)存速度是 10GB/s,那么每一次讀取這 1GB 的數(shù)據(jù)就只需要 0.1 秒??赡苡腥藭?huì)說,那為什么不把全部數(shù)據(jù)都存到內(nèi)存中呢?當(dāng)然可以,只要你有足夠大的內(nèi)存,但是內(nèi)存的價(jià)格要比硬盤高不少,整個(gè)程序的花費(fèi)就會(huì)非常大,而且其他數(shù)據(jù)存進(jìn)內(nèi)存的意義不大。

如果要給這里的“內(nèi)存”起一個(gè)名字,就可以叫它“緩存”了。我們不用去糾結(jié)緩存的概念是什么,更重要的是它解決了什么問題。

緩存的特點(diǎn)
還是從上面的問題入手,我們可以提取出兩個(gè)關(guān)鍵點(diǎn):頻繁,速度。

這兩個(gè)關(guān)鍵點(diǎn)意味著緩存中的數(shù)據(jù)往往是會(huì)被反復(fù)讀取的,因?yàn)榻?jīng)常要讀取,所以要提高讀取的速度。另外,由于數(shù)據(jù)本身是存在硬盤上的,所以不管緩存中有沒有這些數(shù)據(jù),程序都應(yīng)該是正常運(yùn)行的,當(dāng)緩存中沒有數(shù)據(jù)的時(shí)候,需要去硬盤中讀取。如果程序修改了硬盤上的數(shù)據(jù),緩存中的數(shù)據(jù)就沒有用了,屬于過時(shí)的數(shù)據(jù),所以還需要去更新緩存。

所以,我們可以總結(jié)出緩存的特點(diǎn):

  • 速度很快(這個(gè)快是相對(duì)于被緩存的設(shè)備來說的)
  • 數(shù)據(jù)可以丟失(甚至需要定期丟失)
  • 容量有限(因?yàn)閮r(jià)格比較高)

map 的常用操作

map 的介紹
Go 語言的 map 是一種鍵值對(duì)的結(jié)構(gòu),每一個(gè)鍵值對(duì)都分為 key 和 value 兩個(gè)部分。在使用 map 的時(shí)候需要指定 key 和 value 的類型,其中 key 在 map 中是唯一的。下面讓我們來學(xué)習(xí)幾個(gè) map 的常見操作:

在后面的示例內(nèi)容中,我們只會(huì)給到對(duì)應(yīng)功能的代碼,未給出完整程序,請(qǐng)自行補(bǔ)充 main 函數(shù)等內(nèi)容。

map 的創(chuàng)建

func create() {// map 的創(chuàng)建需要指定 key 和 value 的類型// 其中 [] 中的類型是 key 的類型,[] 后面的類型是 value 的// 1. 使用 make 創(chuàng)建 mapm1 := make(map[string]string)fmt.Println(m1) // map[]// 2. 直接創(chuàng)建 mapm2 := map[string]string{}fmt.Println(m2) // map[]// 3. 創(chuàng)建 map 的同時(shí)添加數(shù)據(jù)m3 := map[string]string{"key": "value",}fmt.Println(m3) // map[key:value] }

運(yùn)行截圖:

map 的增刪改查

func crud() {// 創(chuàng)建 mapm := make(map[string]string)fmt.Println(m) // map[]// 添加數(shù)據(jù)m["key"] = "value"fmt.Println(m) // map[key:value]// 修改數(shù)據(jù)m["key"] = "newValue"fmt.Println(m) // map[key:newValue]// 查詢數(shù)據(jù)// 第一個(gè)返回值是數(shù)據(jù),第二個(gè)返回值表示 key 是否存在value, ok := m["key"]fmt.Println(value, ok) // newValue truevalue, ok = m["not existed key"]fmt.Println(value, ok) // false,這里的 value 是空字符串// 刪除數(shù)據(jù)delete(m, "key") }

運(yùn)行截圖:

map 的其他操作

func other() {// 創(chuàng)建 mapm := map[string]int{"a": 1,"b": 3,"c": 4,"d": 2,"e": 0,}// 遍歷 map 可以使用 for range// 每一次遍歷 map 的順序可能都是不一樣的for key, value := range m {fmt.Println(key, value) // 亂序打印出 m 中的 key 和 value}// 查看 map 中的鍵值對(duì)個(gè)數(shù)count := len(m)fmt.Println(count) // 5 }

運(yùn)行截圖:

第一個(gè)熱身實(shí)驗(yàn)的第一部分就到這里啦。后續(xù)我們經(jīng)過開發(fā)可以完成單機(jī)版緩存,之后會(huì)進(jìn)行迭代,升級(jí)成分布式緩存。

怎么樣,是不是 so easy 啊,別急,后面我們會(huì)遇到各種各樣的難題,需要大家一起拿起“屠龍刀”去殺敵。

本章節(jié)代碼可以直接獲取:

wget https://labfile.oss.aliyuncs.com/courses/2943/code1.zip

參考資料

總結(jié)

以上是生活随笔為你收集整理的实验干货分享:用Go语言实现分布式缓存开发之map的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。