GoDasturchi
Storage Engine

Storage Engine

Saqlash mexanizmi

Kundalik daftar — har bir yangi yozuv OXIRIGA qo'shiladi, hech qachon o'rtadan o'chirilmaydi yoki qayta yozilmaydi. Log Aggregator'ning saqlash mexanizmi ham xuddi shunday ishlaydi — append-only (faqat qo'shish): yangi loglar doim OXIRIGA qo'shiladi, bu tartibni saqlab qolish ("qaysi voqea qachon sodir bo'lgan") uchun MUHIM.

example.go
package main

import (
	"fmt"
	"sync"
)

type LogEntry struct {
	Level   string
	Service string
	Message string
}

// LogStore — barcha log yozuvlarini, kelish tartibida, xavfsiz saqlaydi
type LogStore struct {
	mu      sync.RWMutex
	entries []LogEntry
}

func NewLogStore() *LogStore {
	return &LogStore{}
}

func (s *LogStore) Append(entry LogEntry) {
	s.mu.Lock()
	defer s.mu.Unlock()
	s.entries = append(s.entries, entry)
}

func (s *LogStore) All() []LogEntry {
	s.mu.RLock()
	defer s.mu.RUnlock()
	result := make([]LogEntry, len(s.entries))
	copy(result, s.entries)
	return result
}

func main() {
	store := NewLogStore()
	store.Append(LogEntry{Level: "INFO", Service: "payments", Message: "boshlandi"})
	store.Append(LogEntry{Level: "ERROR", Service: "payments", Message: "muvaffaqiyatsiz"})

	fmt.Println(len(store.All()))
}

All() metodi natijani QAYTARISHDAN oldin copy orqali YANGI slice yaratadi — bu "Slices Deep Dive" darsida ko'rgan MUHIM ehtiyot chorasi: agar biz to'g'ridan-to'g'ri s.entriesning O'ZINI qaytarsak, chaqiruvchi kod uni TASHQARIDA o'zgartirib, LogStorening ICHKI holatini BUZISHI mumkin edi (mutex bilan HIMOYALANMAGAN holda).

Bu — "URL Shortener"dagi Store va "In-Memory Cache"dagi Cache bilan bir xil naqsh: sync.RWMutex orqali ko'plab PARALLEL Append chaqiruvi (masalan turli servislardan bir vaqtda kelayotgan loglar) XAVFSIZ ishlaydi, All() esa istalgan vaqtda BARCHA loglarni xavfsiz o'qib olish imkonini beradi.

>_ Exercise

LogStore'ga oxirgi N ta yozuvni olish imkonini qo'shing.

  • Tail(n int) []LogEntry metodini yozing: agar n dan ko'p yozuv bo'lmasa, hammasini qaytaring; aks holda OXIRGI n tasini qaytaring
  • 5 ta yozuvni Append qiling
  • Tail(2) natijasining uzunligini VA oxirgi yozuvning Message'ini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Append-only saqlash — log yozuvlarini kelish tartibida, o'zgarmas holda saqlaydi; Tail kabi metodlar orqali eng so'nggi yozuvlarga tez kirish, log tizimlarida eng ko'p ishlatiladigan so'rov turlaridan biridir.

NEXT UP

Search Indexing

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Storage Engine

Saqlash mexanizmi

Kundalik daftar — har bir yangi yozuv OXIRIGA qo'shiladi, hech qachon o'rtadan o'chirilmaydi yoki qayta yozilmaydi. Log Aggregator'ning saqlash mexanizmi ham xuddi shunday ishlaydi — append-only (faqat qo'shish): yangi loglar doim OXIRIGA qo'shiladi, bu tartibni saqlab qolish ("qaysi voqea qachon sodir bo'lgan") uchun MUHIM.

example.go
package main

import (
	"fmt"
	"sync"
)

type LogEntry struct {
	Level   string
	Service string
	Message string
}

// LogStore — barcha log yozuvlarini, kelish tartibida, xavfsiz saqlaydi
type LogStore struct {
	mu      sync.RWMutex
	entries []LogEntry
}

func NewLogStore() *LogStore {
	return &LogStore{}
}

func (s *LogStore) Append(entry LogEntry) {
	s.mu.Lock()
	defer s.mu.Unlock()
	s.entries = append(s.entries, entry)
}

func (s *LogStore) All() []LogEntry {
	s.mu.RLock()
	defer s.mu.RUnlock()
	result := make([]LogEntry, len(s.entries))
	copy(result, s.entries)
	return result
}

func main() {
	store := NewLogStore()
	store.Append(LogEntry{Level: "INFO", Service: "payments", Message: "boshlandi"})
	store.Append(LogEntry{Level: "ERROR", Service: "payments", Message: "muvaffaqiyatsiz"})

	fmt.Println(len(store.All()))
}

All() metodi natijani QAYTARISHDAN oldin copy orqali YANGI slice yaratadi — bu "Slices Deep Dive" darsida ko'rgan MUHIM ehtiyot chorasi: agar biz to'g'ridan-to'g'ri s.entriesning O'ZINI qaytarsak, chaqiruvchi kod uni TASHQARIDA o'zgartirib, LogStorening ICHKI holatini BUZISHI mumkin edi (mutex bilan HIMOYALANMAGAN holda).

Bu — "URL Shortener"dagi Store va "In-Memory Cache"dagi Cache bilan bir xil naqsh: sync.RWMutex orqali ko'plab PARALLEL Append chaqiruvi (masalan turli servislardan bir vaqtda kelayotgan loglar) XAVFSIZ ishlaydi, All() esa istalgan vaqtda BARCHA loglarni xavfsiz o'qib olish imkonini beradi.

>_ Exercise

LogStore'ga oxirgi N ta yozuvni olish imkonini qo'shing.

  • Tail(n int) []LogEntry metodini yozing: agar n dan ko'p yozuv bo'lmasa, hammasini qaytaring; aks holda OXIRGI n tasini qaytaring
  • 5 ta yozuvni Append qiling
  • Tail(2) natijasining uzunligini VA oxirgi yozuvning Message'ini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Append-only saqlash — log yozuvlarini kelish tartibida, o'zgarmas holda saqlaydi; Tail kabi metodlar orqali eng so'nggi yozuvlarga tez kirish, log tizimlarida eng ko'p ishlatiladigan so'rov turlaridan biridir.

NEXT UP

Search Indexing