Client Library
Klient kutubxonasi
Bank ilovasidan foydalanganingizda, siz bankning ICHKI ma'lumotlar bazasi bilan to'g'ridan-to'g'ri "gaplashmaysiz" — buning o'rniga sodda, qulay ilovadan foydalanasiz, u esa BARCHA murakkab ishni ORQADA bajaradi. Client Library — bizning cache uchun aynan shu "qulay ilova" vazifasini bajaradi: foydalanuvchi kodiga cache bilan ishlashning ODDIY, tushunarli usulini taqdim etadi.
package main
import (
"fmt"
"time"
)
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 }
func (c *Cache) Get(key string) (string, bool) { v, ok := c.data[key]; return v, ok }
// CacheClient — ichki Cache'ni O'RAB, qulayroq, yuqori darajali metodlar taqdim etadi
type CacheClient struct {
cache *Cache
}
func NewCacheClient(cache *Cache) *CacheClient {
return &CacheClient{cache: cache}
}
// GetOrDefault — kalit topilmasa, standart qiymat qaytaradi (xatolik bilan
// ishlashni SODDALASHTIRADI)
func (cl *CacheClient) GetOrDefault(key, defaultValue string) string {
value, ok := cl.cache.Get(key)
if !ok {
return defaultValue
}
return value
}
// GetOrCompute — kalit topilmasa, uni HISOBLAB, keshga SAQLAB, keyin qaytaradi
func (cl *CacheClient) GetOrCompute(key string, compute func() string) string {
if value, ok := cl.cache.Get(key); ok {
return value
}
value := compute()
cl.cache.Set(key, value)
return value
}
func main() {
cache := NewCache()
client := NewCacheClient(cache)
fmt.Println(client.GetOrDefault("missing", "N/A"))
computeCalls := 0
result := client.GetOrCompute("expensive", func() string {
computeCalls++
time.Sleep(time.Millisecond) // "og'ir hisoblash"ni simulyatsiya qilamiz
return "hisoblangan natija"
})
fmt.Println(result, computeCalls)
}GetOrCompute — production tizimlarda ENG KO'P ishlatiladigan cache naqshlaridan biri (cache-aside deb ataladi): avval keshdan tekshiriladi, TOPILMASA — qimmat operatsiya (masalan baza so'rovi) BAJARILADI, natija keshga SAQLANADI, va shu bilan KEYINGI so'rov uchun kesh allaqachon TAYYOR bo'ladi.
CacheClient — Cachening O'ZINI emas, balki UNGA MUROJAAT qilishning QULAYROQ usulini taqdim etadi ("Wrapper" naqshi). Bu — "Service Boundaries" darsida ko'rgan g'oyaning kutubxona darajasidagi ko'rinishi: foydalanuvchi kodi past darajadagi (Get, ok tekshiruvi) tafsilotlar bilan emas, balki YUQORI darajadagi maqsad ("bu qiymatni ol, yo'q bo'lsa hisobla") bilan ishlaydi.
>_ Exercise
CacheClient'ga bir nechta kalitni bir vaqtda olish metodini qo'shing.
- •GetMany(keys []string) map[string]string metodini yozing: har bir kalit uchun Get chaqirib, TOPILGANLARINI natija xaritaga qo'shing
- •cache'ga "a"->"1" va "b"->"2" ni Set qiling ("c"ni Set QILMANG)
- •GetMany([]string{"a", "b", "c"}) natijasining uzunligini chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Client Library — ichki Cache ustiga qulay, yuqori darajali metodlar (GetOrCompute, GetMany kabi) qo'shib, foydalanuvchi kodini past darajadagi tafsilotlardan xalos qiladi.
$ go run main.go
Kodingizni ishga tushiring