Persistence Layer
Saqlash qatlami (Persistence)
Agar uy yonib ketsa, faqat XOTIRADA saqlangan narsalar YO'QOLADI — lekin qog'ozga yozib qo'yilgan narsalar QOLADI. Bizning kesh ham xuddi shunday: u faqat DASTUR XOTIRASIDA yashaydi, va server QAYTA ishga tushirilsa (yoki qulasa), BARCHA ma'lumot YO'QOLADI. Persistence (saqlash) — keshning joriy holatini vaqti-vaqti bilan "suratga olib" (snapshot), tashqi manbaga (fayl, disk) yozib qo'yish orqali bu muammoni yumshatadi.
package main
import (
"bytes"
"encoding/json"
"fmt"
)
type Cache struct {
data map[string]string
}
func NewCache() *Cache {
return &Cache{data: make(map[string]string)}
}
func (c *Cache) Set(key, value string) {
c.data[key] = value
}
// Snapshot — cache holatini JSON formatida "surat" qilib oladi
func (c *Cache) Snapshot() ([]byte, error) {
return json.Marshal(c.data)
}
// LoadSnapshot — avval olingan suratdan cache holatini TIKLAYDI
func (c *Cache) LoadSnapshot(data []byte) error {
return json.Unmarshal(data, &c.data)
}
func main() {
original := NewCache()
original.Set("a", "1")
original.Set("b", "2")
snapshot, _ := original.Snapshot()
// server "qayta ishga tushdi" deb tasavvur qilaylik: yangi, BO'SH cache
restored := NewCache()
restored.LoadSnapshot(snapshot)
var buf bytes.Buffer
json.Indent(&buf, snapshot, "", "")
fmt.Println(len(restored.data))
}json.Marshal(c.data) — "JSON Encoding" darsida ko'rgan usul, bu yerda BUTUN xaritani BITTA JSON matni sifatida "muzlatib" oladi. Bu bayt qatorini ([]byte) haqiqiy loyihada faylga (os.WriteFile) yoki tarmoq orqali BOSHQA joyga yozish mumkin — bizning misolimizda esa uni to'g'ridan-to'g'ri xotirada (snapshot o'zgaruvchisida) ko'rsatamiz, chunki bu darsning MAQSADI — serializatsiya g'oyasining o'zi.
LoadSnapshot — bu jarayonning TESKARISI: JSON bayt qatoridan qaytadan Go xaritasiga "tiklaydi". Production tizimlarda bu jarayon odatda VAQTI-VAQTI bilan (masalan har 5 daqiqada) AVTOMATIK ishga tushadi, va server qayta ishga tushganda, ENG SO'NGGI snapshot'dan holat TIKLANADI — bu yo'qotiladigan ma'lumot miqdorini SEZILARLI kamaytiradi (garchi oxirgi snapshot'dan keyingi o'zgarishlar baribir yo'qolsa ham).
>_ Exercise
Snapshot'dan tiklashdan oldin, mavjud cache ma'lumotlarini tozalash imkonini qo'shing.
- •Clear() metodini yozing: c.data = make(map[string]string)
- •LoadSnapshot ichida, json.Unmarshal chaqirishdan OLDIN c.Clear() ni chaqiring
- •"old" kaliti bilan cache yaratib, boshqa cache'dan snapshot oling va LoadSnapshot qiling, so'ng "old" hali mavjudmi tekshirib chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Snapshot orqali cache holatini JSON'ga serializatsiya qilib, keyinchalik shu holatdan tiklash mumkin — bu server qayta ishga tushganda ma'lumot yo'qotilishini kamaytiradigan oddiy persistence strategiyasi.
NEXT UP
Command Protocol
$ go run main.go
Kodingizni ishga tushiring