Добавлена возможность получить список устаревших элементов
parent
7ce16788c6
commit
237da6e002
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue