Вопрос проверяет понимание проектирования потокобезопасных структур данных в Go с использованием мьютексов для синхронизации доступа к кэшу.
Потокобезопасность в Go достигается с помощью мьютексов из пакета sync. Для кэша, где чтение происходит чаще записи, оптимально использовать sync.RWMutex. Это позволяет множеству горутин одновременно читать данные, но блокирует всех при записи.
Создаем структуру Cache, которая хранит мьютекс и данные. Методы Get и Set используют соответствующие блокировки:
type Cache struct {
mu sync.RWMutex
data map[string]string
}
func NewCache() *Cache {
return &Cache{data: make(map[string]string)}
}
func (c *Cache) Get(key string) (string, bool) {
c.mu.RLock()
defer c.mu.RUnlock()
val, ok := c.data[key]
return val, ok
}
func (c *Cache) Set(key, value string) {
c.mu.Lock()
defer c.mu.Unlock()
c.data[key] = value
}Такой кэш используется в веб-серверах, базах данных и любых многопоточных приложениях для временного хранения часто запрашиваемых данных. RWMutex повышает производительность при интенсивном чтении.
Вывод: Используйте sync.RWMutex для кэша с частыми чтениями и редкими записями. Это обеспечивает безопасность и эффективность в конкурентной среде Go.