В своём опыте я столкнулся с проблемой управления кешем MRU (most recently used). Для решения этой задачи я использовал следующую структуру и функции⁚
go
type MRUCache struct {
capacity int
cache map[string]string
queue []string
}
func NewMRUCache(capacity int) *MRUCache {
return nMRUCache{
capacity⁚ capacity,
cache⁚ make(map[string]string),
queue⁚ []string{},
}
}
func (c *MRUCache) Set(key, value string) {
// Проверяем, содержится ли ключ уже в кеше
if _, ok ⁚ c.cache[key]; ok {
// Если содержится, удаляем его из очереди
for i ⁚ 0; i < len(c.queue); i {
if c.queue[i] key {
c.queue append(c.queue[⁚i], c.queue[i 1⁚]...)
break
}
}
}
// Добавляем ключ и значение в кеш и в начало очереди
c.cache[key] value
c.queue append([]string{key}, c.queue...)
// Проверяем, превышено ли максимальное значение размера кеша
if len(c.queue) > c.capacity {
// Если превышено, удаляем из кеша последний использованный элемент
delete(c.cache, c.queue[len(c.queue)-1])
c.queue c.queue[⁚len(c.queue)-1]
}
}
func (c *MRUCache) Get(key string) (string, bool) {
// Проверяем, содержится ли ключ в кеше
if value, ok ⁚ c.cache[key]; ok {
// Если содержится, перемещаем его в начало очереди
for i ⁚ 0; i < len(c.queue); i {
if c.queue[i] key {
c.queue append([]string{key}, append(c.queue[⁚i], c.queue[i 1⁚]...)...)
break
}
}
return value, true
}
return ″″, false
}
Структура `MRUCache` содержит в себе емкость кеша (`capacity`), сам кеш (`cache`) в виде отображения ключ-значение, а также очередь элементов (`queue`). Функция `NewMRUCache` создаёт новый экземпляр кеша с указанной емкостью. Функция `Set` устанавливает значение `value` по указанному ключу `key` в кеше MRU. Функция `Get` возвращает значение и флаг его наличия по указанному ключу в кеше.
При вызове функции `Set` мы проверяем, содержится ли ключ уже в кеше. Если содержится, то удаляем его из очереди, чтобы поместить его в начало, так как это последний использованный элемент. Затем добавляем ключ и значение в кеш и в начало очереди. Если при этом превышено максимальное значение размера кеша, то удаляем из кеша последний элемент, находящийся в конце очереди.
Функция `Get` проверяет, содержится ли ключ в кеше. Если содержится, то перемещает его в начало очереди и возвращает соответствующее значение и флаг наличия. В противном случае возвращает пустую строку и `false`.
В моём опыте использования данного кеша, он показал себя эффективным при работе с часто используемыми данными. Он позволяет сохранять необходимое количество элементов в кеше и при этом автоматически удалять наименее используемые элементы. Это помогает снизить время доступа к данным и повысить общую производительность системы.