GoDasturchi
Persistence Layer

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.

example.go
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.

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

example.go
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.

Hints (0/3)

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