DNS Cache

DNS Cache

DNS keshi

LookupRecord slice bo'ylab bittalab yuradi: yozuvlar ko'payib borgan sari, har bir so'rov sekinlashadi. Haqiqiy resolverlar buni kutmaydi — ular natijalarni kesh (cache)da saqlaydi, shunda bir xil so'rov ikkinchi marta bir zumda javob oladi.

Composite Types kursidagi Phonebook va Library darslarini eslaysizmi? Xuddi shu andaza: nomlangan map turi ustiga metodlar qo'shiladi.

example.go
type DNSCache map[string]DNSRecord

func NewDNSCache() DNSCache {
	return make(DNSCache)
}

Kalit qanday bo'lishi kerak? Faqat Namening o'zi kifoya qilmaydi — Record Lookup darsida ko'rganingizdek, bitta nom bir nechta turdagi yozuvga ega bo'lishi mumkin. Shuning uchun kalit ikkalasini ham, nom va turni, birlashtiradi:

example.go
key := r.Name + ":" + r.Type
// "example.com:A" va "example.com:MX" — ikki xil kalit

Set yozuvni shu kalit ostida saqlaydi. Get esa Exists or Not darsidagi comma-ok andazasidan foydalanadi: kesh mavjud emasligini nol qiymatdan (bo'sh DNSRecord) ajratish uchun ikkinchi bool qiymati kerak.

example.go
func (c DNSCache) Set(r DNSRecord) {
	c[r.Name+":"+r.Type] = r
}

func (c DNSCache) Get(name, recordType string) (DNSRecord, bool) {
	r, ok := c[name+":"+recordType]
	return r, ok
}

Maplar ma'lumot turlari bo'lgani uchun, Set va Getga pointer receiver kerak emas — c[key] = r chaqiruvchining xuddi shu mapini to'g'ridan-to'g'ri o'zgartiradi.

>_ Exercise

DNSCacheni nomlangan map turi sifatida aniqlang: map[string]DNSRecord, kalit sifatida "name:type" satridan foydalaning.

Uchta funksiya/metod yozing:

  • NewDNSCache() DNSCache — ishga tushirilgan bo'sh keshni qaytaradi
  • (c DNSCache) Set(r DNSRecord) — yozuvni r.Name + ":" + r.Type kaliti ostida saqlaydi
  • (c DNSCache) Get(name, recordType string) (DNSRecord, bool) — yozuvni va u topilganmi-yo'qmi shuni qaytaradi

Misollar:

  • cache.Set(DNSRecord{Name: "example.com", Type: "A", Value: "93.184.216.34", TTL: 3600}) dan keyin, cache.Get("example.com", "A") (record, true) qaytaradi
  • cache.Get("example.com", "AAAA") — hech qachon saqlanmagan, (DNSRecord{}, false) qaytaradi

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Nomlangan map turi metodlarga ega bo'la oladi. Bir nechta maydon bo'yicha kalitlash kerak bo'lganda, ularni bitta satrga birlashtiring — masalan name + ":" + recordType.

NEXT UP

Cache Eviction

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

DNS Cache

DNS keshi

LookupRecord slice bo'ylab bittalab yuradi: yozuvlar ko'payib borgan sari, har bir so'rov sekinlashadi. Haqiqiy resolverlar buni kutmaydi — ular natijalarni kesh (cache)da saqlaydi, shunda bir xil so'rov ikkinchi marta bir zumda javob oladi.

Composite Types kursidagi Phonebook va Library darslarini eslaysizmi? Xuddi shu andaza: nomlangan map turi ustiga metodlar qo'shiladi.

example.go
type DNSCache map[string]DNSRecord

func NewDNSCache() DNSCache {
	return make(DNSCache)
}

Kalit qanday bo'lishi kerak? Faqat Namening o'zi kifoya qilmaydi — Record Lookup darsida ko'rganingizdek, bitta nom bir nechta turdagi yozuvga ega bo'lishi mumkin. Shuning uchun kalit ikkalasini ham, nom va turni, birlashtiradi:

example.go
key := r.Name + ":" + r.Type
// "example.com:A" va "example.com:MX" — ikki xil kalit

Set yozuvni shu kalit ostida saqlaydi. Get esa Exists or Not darsidagi comma-ok andazasidan foydalanadi: kesh mavjud emasligini nol qiymatdan (bo'sh DNSRecord) ajratish uchun ikkinchi bool qiymati kerak.

example.go
func (c DNSCache) Set(r DNSRecord) {
	c[r.Name+":"+r.Type] = r
}

func (c DNSCache) Get(name, recordType string) (DNSRecord, bool) {
	r, ok := c[name+":"+recordType]
	return r, ok
}

Maplar ma'lumot turlari bo'lgani uchun, Set va Getga pointer receiver kerak emas — c[key] = r chaqiruvchining xuddi shu mapini to'g'ridan-to'g'ri o'zgartiradi.

>_ Exercise

DNSCacheni nomlangan map turi sifatida aniqlang: map[string]DNSRecord, kalit sifatida "name:type" satridan foydalaning.

Uchta funksiya/metod yozing:

  • NewDNSCache() DNSCache — ishga tushirilgan bo'sh keshni qaytaradi
  • (c DNSCache) Set(r DNSRecord) — yozuvni r.Name + ":" + r.Type kaliti ostida saqlaydi
  • (c DNSCache) Get(name, recordType string) (DNSRecord, bool) — yozuvni va u topilganmi-yo'qmi shuni qaytaradi

Misollar:

  • cache.Set(DNSRecord{Name: "example.com", Type: "A", Value: "93.184.216.34", TTL: 3600}) dan keyin, cache.Get("example.com", "A") (record, true) qaytaradi
  • cache.Get("example.com", "AAAA") — hech qachon saqlanmagan, (DNSRecord{}, false) qaytaradi

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Nomlangan map turi metodlarga ega bo'la oladi. Bir nechta maydon bo'yicha kalitlash kerak bo'lganda, ularni bitta satrga birlashtiring — masalan name + ":" + recordType.

NEXT UP

Cache Eviction