diff --git a/bird/redis_cache.go b/bird/redis_cache.go new file mode 100644 index 0000000..6335b8b --- /dev/null +++ b/bird/redis_cache.go @@ -0,0 +1,53 @@ +package bird + +import ( + "encoding/json" + "github.com/go-redis/redis" + "time" +) + +type RedisCache struct { + client *redis.Client +} + +func NewRedisCache(config CacheConfig) (*RedisCache, error) { + + client := redis.NewClient(&redis.Options{ + Addr: config.RedisServer, + Password: config.RedisPassword, + DB: config.RedisDb, + }) + + _, err := client.Ping().Result() + if err != nil { + return nil, err + } + + cache := &RedisCache{ + client: client, + } + + return cache, nil +} + +func (self *RedisCache) Get(key string) (Parsed, error) { + data, err := self.client.Get(key).Result() + if err != nil { + return NilParse, err + } + + parsed := Parsed{} + err = json.Unmarshal([]byte(data), &parsed) + + return parsed, err +} + +func (self *RedisCache) Set(key string, parsed Parsed) error { + payload, err := json.Marshal(parsed) + if err != nil { + return err + } + + _, err = self.client.Set(key, payload, time.Minute*5).Result() + return err +} diff --git a/bird/redis_cache_test.go b/bird/redis_cache_test.go new file mode 100644 index 0000000..e54c546 --- /dev/null +++ b/bird/redis_cache_test.go @@ -0,0 +1,58 @@ +package bird + +import ( + "testing" +) + +func Test_RedisCacheAccess(t *testing.T) { + + cache, err := NewRedisCache(CacheConfig{ + RedisServer: "localhost:6379", + }) + + if err != nil { + t.Log("Redis server not available:", err) + t.Log("Skipping redis tests.") + return + } + + parsed := Parsed{ + "foo": 23, + "bar": 42, + "baz": true, + } + + t.Log("Setting redis cache...") + err = cache.Set("testkey", parsed) + if err != nil { + t.Error(err) + } + + t.Log("Fetching from redis...") + parsed, err = cache.Get("testkey") + if err != nil { + t.Error(err) + } + + t.Log(parsed) +} + +func Test_RedisCacheAccessKeyMissing(t *testing.T) { + + cache, err := NewRedisCache(CacheConfig{ + RedisServer: "localhost:6379", + }) + + if err != nil { + t.Log("Redis server not available:", err) + t.Log("Skipping redis tests.") + return + } + + parsed, err := cache.Get("test_missing_key") + if err == nil { + t.Error(err) + } + t.Log("Cache error:", err) + t.Log(parsed) +}