PostgreSQL9.5にredis_fdwを導入し、Redis上の外部テーブルに対して簡単な操作を試してみます。
今回の手順では、PostgreSQL9.5とRedisがインストール済の環境を前提にしています。
Hiredisのインストール
redis_fdwを導入するには、RedisのCクライアントライブラリであるHiredisをインストールする必要があります。
$ git clone https://github.com/redis/hiredis.git
$ cd hiredis/
$ make
$ su
# make install
# echo "/usr/local/lib" > /etc/ld.so.conf.d/hiredis.conf
# ldconfig
# ldconfig -p | grep hiredis
# exit
redis_fdwのインストール
PostgreSQLのバージョンが9.5の場合は、9.5用のブランチ(REL9_5_STABLE)のredis_fdwを導入する必要があります。
$ git clone https://github.com/pg-redis-fdw/redis_fdw.git
$ cd redis_fdw
$ git checkout -b REL9_5_STABLE origin/REL9_5_STABLE
$ make USE_PGXS=1 PG_CONFIG=~/pgsql/9.5/pgsql-9.5.2/bin/pg_config
$ make USE_PGXS=1 PG_CONFIG=~/pgsql/9.5/pgsql-9.5.2/bin/pg_config install
- PostgreSQLのbinディレクトリにPATHが通っている場合は、PG_CONFIGの指定は不要です。
- PG_CONFIGを指定する場合、
~/pgsql/9.5/pgsql-9.5.2
の部分はPostgreSQLインストール先のパスで置き換えます。
redis_fdwの登録と外部テーブルの作成
PostgreSQLとRedisを起動してから、psqlでPostgreSQLにログインし、キーとバリューを保持する簡単な外部テーブルを作成します。
-- redis_fdwをPostgreSQLに登録
CREATE EXTENSION redis_fdw;
-- Redisの外部サーバを定義 (Redisのアドレスとポート番号をオプションで指定)
CREATE SERVER redis_server
FOREIGN DATA WRAPPER redis_fdw
OPTIONS (address '127.0.0.1', port '6379');
-- Redis上の外部テーブルを作成
CREATE FOREIGN TABLE redis_db0 (key text, val text)
SERVER redis_server
OPTIONS (database '0');
-- Redisの外部サーバのユーザマップを定義
CREATE USER MAPPING FOR PUBLIC
SERVER redis_server
OPTIONS (password 'secret');
Redis上の外部テーブルの操作
Redis上の外部テーブルに対して、簡単なSQLが想定どおりに動作することを確認します。
-- PostgreSQL9.3以降では、外部テーブルに対してINSERTなどの更新系SQLが実行可能
-- 10件のデータを挿入
INSERT INTO redis_db0
SELECT 'key' || num::TEXT, 'val' || num::TEXT
FROM generate_series(1, 10) num;
-- 検索条件どおりに1件検索できることを確認
SELECT * FROM redis_db0 WHERE key = 'key3';
key | val
------+------
key3 | val3
(1 row)
-- 1件のデータを更新
UPDATE redis_db0 SET val = 'val99' WHERE key = 'key9';
SELECT * FROM redis_db0 WHERE key = 'key9';
key | val
------+-------
key9 | val99
(1 row)
-- 9件のデータを削除
DELETE FROM redis_db0 WHERE key <> 'key7';
DELETE 9
SELECT * FROM redis_db0 WHERE key = 'key9';
key | val
-----+-----
(0 rows)
また、Redisに直接接続して、上記操作で残った外部テーブルのデータ1件が見えることを確認します。
$ redis-cli KEYS "key*"
1) "key7"