GoDasturchi
TTL & Expiration

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.

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

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

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

Hints (0/3)

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