blog/core/jsondb/cache.go

87 lines
1.7 KiB
Go

package jsondb
import (
"encoding/json"
"errors"
"fmt"
"math/rand"
"time"
)
var errCacheDisabled = errors.New("cache disabled")
// SetCache sets a cache key.
func (db *DB) SetCache(key, value string, expires int) error {
if db.Cache == nil {
return errCacheDisabled
}
return db.Cache.Set(key, []byte(value), expires)
}
// SetJSONCache caches a JSON object.
func (db *DB) SetJSONCache(key string, v interface{}, expires int) error {
if db.Cache == nil {
return errCacheDisabled
}
bytes, err := json.Marshal(v)
if err != nil {
return err
}
return db.SetCache(key, string(bytes), expires)
}
// GetCache gets a cache key.
func (db *DB) GetCache(key string) (string, error) {
if db.Cache == nil {
return "", errCacheDisabled
}
v, err := db.Cache.Get(key)
return string(v), err
}
// DeleteCache deletes a cache key.
func (db *DB) DeleteCache(key string) error {
if db.Cache == nil {
return errCacheDisabled
}
db.Cache.Delete(key)
return nil
}
// LockCache implements 'file locking' in your cache.
func (db *DB) LockCache(key string) bool {
if db.Cache == nil {
return true
}
log.Info("LockCache(%s)", key)
var (
// In seconds
timeout = 5 * time.Second
expire = 20
)
identifier := fmt.Sprintf("%d", rand.Uint64())
log.Info("id: %s", identifier)
end := time.Now().Add(timeout)
for time.Now().Before(end) {
if ok := db.Cache.Lock("lock:"+key, identifier, expire); ok {
log.Info("JsonDB: Acquired lock for %s", key)
return true
}
time.Sleep(1 * time.Millisecond)
}
log.Error("JsonDB: lock timeout for %s", key)
return false
}
// UnlockCache releases the lock on a cache key.
func (db *DB) UnlockCache(key string) {
if db.Cache == nil {
return
}
db.Cache.Unlock("lock:" + key)
}