GoDasturchi
URL Model & Storage

URL Model & Storage

URL modeli va saqlash

Kutubxonachi bir vaqtning o'zida bir nechta tashrif buyuruvchiga xizmat ko'rsatadi — agar ikkitasi bir vaqtda bitta kartotekaga yozsa, tartibsizlik chiqishi mumkin, shuning uchun kutubxonachi navbat bilan ishlaydi. Bizning serverimiz ham bir vaqtning o'zida ko'plab so'rovlarga ("Concurrency" kursida ko'rgan goroutine'lar orqali) xizmat qiladi, shuning uchun havolalarni saqlaydigan Storethread-safe (parallel xavfsiz) bo'lishi SHART.

example.go
package main

import (
	"fmt"
	"sync"
)

// Store — barcha URLRecord'larni xotirada, xavfsiz saqlaydi
type Store struct {
	mu      sync.RWMutex
	records map[string]*URLRecord
}

func NewStore() *Store {
	return &Store{records: make(map[string]*URLRecord)}
}

func (s *Store) Save(record *URLRecord) {
	s.mu.Lock()
	defer s.mu.Unlock()
	s.records[record.Code] = record
}

func (s *Store) Get(code string) (*URLRecord, bool) {
	s.mu.RLock()
	defer s.mu.RUnlock()
	record, ok := s.records[code]
	return record, ok
}

type URLRecord struct {
	Code        string
	OriginalURL string
}

func main() {
	store := NewStore()
	store.Save(&URLRecord{Code: "aB3xZ", OriginalURL: "https://godasturchi.uz"})

	record, ok := store.Get("aB3xZ")
	fmt.Println(record.OriginalURL, ok)
}

sync.RWMutex — "Mutexes & RWMutex" darsida ko'rgan "o'qish-yozish qulfi": bir vaqtning o'zida KO'PLAB Get chaqiruvi (RLock) parallel ishlashi mumkin (chunki o'qish ma'lumotni o'zgartirmaydi), lekin Save (Lock) ishlayotganda BOSHQA hech qanday o'qish yoki yozish ishlamaydi. Bu — URL Shortener kabi "ko'p o'qiladi, kam yoziladi" xizmatlar uchun oddiy sync.Mutexga qaraganda samaraliroq.

Store struct'ining records maydoni kichik harf bilan boshlangani uchun tashqaridan ko'rinmaydi ("Service Boundaries Part 2" darsida ko'rgan "ma'lumot egaligi" tamoyili) — boshqa kod Storening ichki xaritasiga TO'G'RIDAN-TO'G'RI kira olmaydi, faqat Save/Get orqali murojaat qiladi.

>_ Exercise

Store'ga barcha havolalar sonini qaytaruvchi metod qo'shing.

  • Count() int metodini yozing: RLock bilan records xaritasining uzunligini qaytaring
  • Ikkita URLRecord'ni Save qiling, so'ng Count() natijasini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

sync.RWMutex bir nechta parallel o'qishga ruxsat berib, faqat yozish paytida to'liq qulflab, ko'p o'qiladigan-kam yoziladigan xizmatlar uchun oddiy Mutex'dan samaraliroq ishlaydi.

NEXT UP

Short Code Generation

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

URL Model & Storage

URL modeli va saqlash

Kutubxonachi bir vaqtning o'zida bir nechta tashrif buyuruvchiga xizmat ko'rsatadi — agar ikkitasi bir vaqtda bitta kartotekaga yozsa, tartibsizlik chiqishi mumkin, shuning uchun kutubxonachi navbat bilan ishlaydi. Bizning serverimiz ham bir vaqtning o'zida ko'plab so'rovlarga ("Concurrency" kursida ko'rgan goroutine'lar orqali) xizmat qiladi, shuning uchun havolalarni saqlaydigan Storethread-safe (parallel xavfsiz) bo'lishi SHART.

example.go
package main

import (
	"fmt"
	"sync"
)

// Store — barcha URLRecord'larni xotirada, xavfsiz saqlaydi
type Store struct {
	mu      sync.RWMutex
	records map[string]*URLRecord
}

func NewStore() *Store {
	return &Store{records: make(map[string]*URLRecord)}
}

func (s *Store) Save(record *URLRecord) {
	s.mu.Lock()
	defer s.mu.Unlock()
	s.records[record.Code] = record
}

func (s *Store) Get(code string) (*URLRecord, bool) {
	s.mu.RLock()
	defer s.mu.RUnlock()
	record, ok := s.records[code]
	return record, ok
}

type URLRecord struct {
	Code        string
	OriginalURL string
}

func main() {
	store := NewStore()
	store.Save(&URLRecord{Code: "aB3xZ", OriginalURL: "https://godasturchi.uz"})

	record, ok := store.Get("aB3xZ")
	fmt.Println(record.OriginalURL, ok)
}

sync.RWMutex — "Mutexes & RWMutex" darsida ko'rgan "o'qish-yozish qulfi": bir vaqtning o'zida KO'PLAB Get chaqiruvi (RLock) parallel ishlashi mumkin (chunki o'qish ma'lumotni o'zgartirmaydi), lekin Save (Lock) ishlayotganda BOSHQA hech qanday o'qish yoki yozish ishlamaydi. Bu — URL Shortener kabi "ko'p o'qiladi, kam yoziladi" xizmatlar uchun oddiy sync.Mutexga qaraganda samaraliroq.

Store struct'ining records maydoni kichik harf bilan boshlangani uchun tashqaridan ko'rinmaydi ("Service Boundaries Part 2" darsida ko'rgan "ma'lumot egaligi" tamoyili) — boshqa kod Storening ichki xaritasiga TO'G'RIDAN-TO'G'RI kira olmaydi, faqat Save/Get orqali murojaat qiladi.

>_ Exercise

Store'ga barcha havolalar sonini qaytaruvchi metod qo'shing.

  • Count() int metodini yozing: RLock bilan records xaritasining uzunligini qaytaring
  • Ikkita URLRecord'ni Save qiling, so'ng Count() natijasini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

sync.RWMutex bir nechta parallel o'qishga ruxsat berib, faqat yozish paytida to'liq qulflab, ko'p o'qiladigan-kam yoziladigan xizmatlar uchun oddiy Mutex'dan samaraliroq ishlaydi.

NEXT UP

Short Code Generation