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.
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:
key := r.Name + ":" + r.Type
// "example.com:A" va "example.com:MX" — ikki xil kalitSet 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.
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)— yozuvnir.Name + ":" + r.Typekaliti 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.
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
$ go run main.go
Kodingizni ishga tushiring