TTL & Expiration
TTL va muddati tugashi
Sut idishidagi "yaroqlilik muddati"ni tasavvur qiling: muddat o'tgan sutni ICHISH XAVFLI, garchi u hali idishda tursa ham. Kesh yozuvlari ham xuddi shunday — ba'zi ma'lumotlar (masalan valyuta kursi) faqat MA'LUM vaqt davomida TO'G'RI hisoblanadi, shundan keyin ESKIRGAN deb hisoblanishi kerak. Bu muddat — TTL (Time To Live) deb ataladi.
package main
import (
"fmt"
"time"
)
type entry struct {
value string
expiresAt time.Time
}
type Cache struct {
data map[string]entry
}
func NewCache() *Cache {
return &Cache{data: make(map[string]entry)}
}
func (c *Cache) Set(key, value string, ttl time.Duration) {
c.data[key] = entry{
value: value,
expiresAt: time.Now().Add(ttl),
}
}
func (c *Cache) Get(key string) (string, bool) {
e, ok := c.data[key]
if !ok {
return "", false
}
if time.Now().After(e.expiresAt) {
delete(c.data, key) // "dangasa" (lazy) o'chirish: faqat so'ralganda tekshiramiz
return "", false
}
return e.value, true
}
func main() {
cache := NewCache()
cache.Set("usd-rate", "12700", 100*time.Millisecond)
value, ok := cache.Get("usd-rate")
fmt.Println(value, ok)
time.Sleep(150 * time.Millisecond)
_, ok = cache.Get("usd-rate")
fmt.Println(ok)
}expiresAt time.Time — "muddat qachon tugaydi"ni ANIQ vaqt sifatida saqlaydi ("davomiylik" ttlning o'zi emas), chunki Set chaqirilganda time.Now().Add(ttl) orqali BIR MARTA hisoblab qo'yiladi. Get esa har safar time.Now().After(e.expiresAt) orqali "hozir bu vaqtdan O'TDIMI?" deb tekshiradi.
Bu yerda ishlatilgan usul — lazy expiration ("dangasa" muddati tugashi): yozuv FAQAT so'ralganda tekshiriladi va eskirgan bo'lsa o'sha yerda o'chiriladi, alohida "fon jarayoni" kerak emas. Bu — oddiy, lekin muhim CHEKLOVGA ega: agar hech kim eskirgan kalitni so'ramasa, u XOTIRADA abadiy qolib ketishi mumkin (production'da bu muammoni fon tozalash jarayoni hal qiladi).
>_ Exercise
Cache'ga hali muddati tugamagan yozuvlar sonini hisoblash imkonini qo'shing.
- •ActiveCount() int metodini yozing: c.data bo'ylab yurib, time.Now().Before(e.expiresAt) bo'lganlarni sanang
- •Bittasi 1 soat, ikkinchisi allaqachon o'tgan (-1 soat) TTL bilan ikkita yozuv qo'shing
- •ActiveCount() natijasini chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
TTL (Time To Live) — har bir yozuvga aniq tugash vaqtini biriktirib, uni so'ralganda tekshirish (lazy expiration) orqali, eskirgan ma'lumotning noto'g'ri ishlatilishining oldini oladi.
NEXT UP
LRU Eviction
$ go run main.go
Kodingizni ishga tushiring