From 237da6e00294051c1bf1697cccbad5cf1db2c1ec Mon Sep 17 00:00:00 2001 From: serr Date: Mon, 6 Jan 2025 12:58:29 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D1=8C=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20=D1=81=D0=BF=D0=B8=D1=81=D0=BE=D0=BA=20=D1=83=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D1=80=D0=B5=D0=B2=D1=88=D0=B8=D1=85=20=D1=8D=D0=BB?= =?UTF-8?q?=D0=B5=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- candycache.go | 56 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/candycache.go b/candycache.go index 5ffa7c2..bb9ca7a 100644 --- a/candycache.go +++ b/candycache.go @@ -60,7 +60,7 @@ func (c *Cache) Cleanup() { defer c.Unlock() for key, item := range c.storage { - if item.destroyTimestamp <= time.Now().Unix() { + if item.destroyTimestamp <= time.Now().UnixNano() { delete(c.storage, key) } } @@ -91,6 +91,27 @@ func (c *Cache) Get(key string) (interface{}, bool) { 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 { c.Lock() @@ -114,7 +135,7 @@ func (c *Cache) Set(key string, data interface{}, ttl time.Duration) { defer c.Unlock() c.storage[key] = Item{ - destroyTimestamp: time.Now().Unix() + int64(ttl.Seconds()), + destroyTimestamp: time.Now().UnixNano() + int64(ttl), data: data, } } @@ -127,15 +148,13 @@ func (c *Cache) Count() int { return len(c.storage) } -// Печать всех элементов кэша (ключ и время уничтожения). +// Возвращает список всех элементов кэша. func (c *Cache) List() []KeyItemPair { c.RLock() defer c.RUnlock() - // Создаем срез для хранения пар ключ-значение - items := make([]KeyItemPair, 0, len(c.storage)) + items := []KeyItemPair{} - // Заполняем срез парами ключ-значение for key, item := range c.storage { items = append(items, KeyItemPair{Key: key, Item: item}) } @@ -143,6 +162,22 @@ func (c *Cache) List() []KeyItemPair { 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 { c.RLock() @@ -217,3 +252,12 @@ func (i *Item) Data() interface{} { func (i *Item) DestroyTimestamp() int64 { return i.destroyTimestamp } + +// Определяет является ли элемент устаревшим. +func (i *Item) IsExpired() bool { + if i.destroyTimestamp <= time.Now().UnixNano() { + return true + } else { + return false + } +}