Добавлена возможность получить список устаревших элементов

main
serr 2025-01-06 12:58:29 +03:00
parent 7ce16788c6
commit 237da6e002
1 changed files with 50 additions and 6 deletions

View File

@ -60,7 +60,7 @@ func (c *Cache) Cleanup() {
defer c.Unlock() defer c.Unlock()
for key, item := range c.storage { for key, item := range c.storage {
if item.destroyTimestamp <= time.Now().Unix() { if item.destroyTimestamp <= time.Now().UnixNano() {
delete(c.storage, key) delete(c.storage, key)
} }
} }
@ -91,6 +91,27 @@ func (c *Cache) Get(key string) (interface{}, bool) {
return item.data, true return item.data, true
} }
// Определяет является ли элемент устаревшим.
// Вторым аргументов возвращается есть элемент в кэше или нет.
// Первым - устаревший элемент или нет.
func (c *Cache) IsExpired(key string) (bool, bool) {
c.RLock()
defer c.RUnlock()
item, found := c.storage[key]
// Элемент не найден в кэше
if !found {
return false, false
}
if item.destroyTimestamp <= time.Now().UnixNano() {
return true, true
} else {
return false, true
}
}
// Удаление элемента по ключу. // Удаление элемента по ключу.
func (c *Cache) Delete(key string) error { func (c *Cache) Delete(key string) error {
c.Lock() c.Lock()
@ -114,7 +135,7 @@ func (c *Cache) Set(key string, data interface{}, ttl time.Duration) {
defer c.Unlock() defer c.Unlock()
c.storage[key] = Item{ c.storage[key] = Item{
destroyTimestamp: time.Now().Unix() + int64(ttl.Seconds()), destroyTimestamp: time.Now().UnixNano() + int64(ttl),
data: data, data: data,
} }
} }
@ -127,15 +148,13 @@ func (c *Cache) Count() int {
return len(c.storage) return len(c.storage)
} }
// Печать всех элементов кэша (ключ и время уничтожения). // Возвращает список всех элементов кэша.
func (c *Cache) List() []KeyItemPair { func (c *Cache) List() []KeyItemPair {
c.RLock() c.RLock()
defer c.RUnlock() defer c.RUnlock()
// Создаем срез для хранения пар ключ-значение items := []KeyItemPair{}
items := make([]KeyItemPair, 0, len(c.storage))
// Заполняем срез парами ключ-значение
for key, item := range c.storage { for key, item := range c.storage {
items = append(items, KeyItemPair{Key: key, Item: item}) items = append(items, KeyItemPair{Key: key, Item: item})
} }
@ -143,6 +162,22 @@ func (c *Cache) List() []KeyItemPair {
return items return items
} }
// Возвращает список всех устаревших элементов кэша.
func (c *Cache) ExpiredList() []KeyItemPair {
c.RLock()
defer c.RUnlock()
items := []KeyItemPair{}
for key, item := range c.storage {
if item.destroyTimestamp <= time.Now().UnixNano() {
items = append(items, KeyItemPair{Key: key, Item: item})
}
}
return items
}
// Вернет размер всего кэша в байтах. // Вернет размер всего кэша в байтах.
func (c *Cache) Size() int { func (c *Cache) Size() int {
c.RLock() c.RLock()
@ -217,3 +252,12 @@ func (i *Item) Data() interface{} {
func (i *Item) DestroyTimestamp() int64 { func (i *Item) DestroyTimestamp() int64 {
return i.destroyTimestamp return i.destroyTimestamp
} }
// Определяет является ли элемент устаревшим.
func (i *Item) IsExpired() bool {
if i.destroyTimestamp <= time.Now().UnixNano() {
return true
} else {
return false
}
}