Commit 523febbd by Mikhail Sharkov

WIP: revetring to expiration dates

parent 8d11a5e0
package vault
import (
"time"
)
// control - управление хранилищем
func (store *Store) control() {
tick := time.Tick(time.Second) // Каждую секунду
// ставим в очередь разделитель "вёдер" и убираем устаревшее
for {
select {
case <-tick:
store.addNode("", "", false)
for {
err := store.popNode()
if err != nil {
break
}
}
case request, ok := <-store.exchange:
if !ok {
break
......
......@@ -17,15 +17,15 @@ type node struct {
expire time.Time // Окончание срока жизни
Key string // Ключ
Value interface{} // Хранимое значение
Prev *node // Ближе к голове, извлекается раньше
Next *node // Ближе к хвосту, выйдёт позже
Prev *node // Предыдущий узел
Next *node // Следующий узел
}
// Store - корневая структура для хранения данных
type Store struct {
TTL uint64 // Публично доступный TTL по умолчанию для инициализации
TTL int // Публично доступный TTL по умолчанию для инициализации, сек
exchange chan Message // Небуферизованный канал для синхронизации доступа
ttl uint64 // Время жизни узла по умолчанию, сек
ttl int // Время жизни узла по умолчанию, сек
head *node // Голова, выходит первым
tail *node // Добавлен последним
flat map[string]*node // Карта для быстрого доступа к значениям
......
......@@ -18,13 +18,6 @@ func (store *Store) init() {
store.exchange = make(chan Message)
store.flat = make(map[string]*node)
// Создаём достаточное количество узлов-филлеров, чтобы механизм
// устаревания не начал уничтожать записи преждевременно.
var i uint64
for i = 0; i < store.ttl; i++ {
store.addNode("", "", false)
}
go store.control() // запускаем управление хранилищем
}
......@@ -49,12 +42,13 @@ func (store *Store) addNode(key string, value interface{}, expire time.Time) err
// Если ключа ещё нет - просто добавляем в хвост.
// Если ключ есть - переносим в хвост.
func (store *Store) setNode(key string, value interface{}) error {
now := time.Now()
if _, ok := store.flat[key]; ok == false {
store.addNode(key, value, true)
store.addNode(key, value, now.Add(time.Second*(time.Duration)(store.ttl)))
return nil
}
store.delNode(key) // Сильно нерационально, удаление/создание объекта
store.addNode(key, value, true) // Зато резко упрощает код
store.delNode(key) // Сильно нерационально, удаление/создание объекта
store.addNode(key, value, now.Add(time.Second*(time.Duration)(store.ttl))) // Зато резко упрощает код
return nil
}
......@@ -66,9 +60,6 @@ func (store *Store) popNode() error {
if store.head == nil {
return errors.New("No nodes")
}
if store.head.kind == false {
err = errors.New("Decay timeout")
}
if store.head.Key != "" {
delete(store.flat, store.head.Key)
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment