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 Store — thread-safe (parallel xavfsiz) bo'lishi SHART.
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.
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
$ go run main.go
Kodingizni ishga tushiring