キーバリューストアRedisの概要とPostgreSQLとの連携
2022年11月18日
db tech showcase 2022
SRA OSS LLC
佐藤 友章
sato@sraoss.co.jp© 2022 SRA OSS LLC

1

自己紹介
• 佐藤 友章 (さとう ともあき)• SRA OSSでデータベースおよび技術部門の責任者を務める• PostgreSQLのサポートやトレーニング、コンサルなど、今なおエンジニアとしても活動• 最近はPostgreSQL以外にNoSQLも手がける• 趣味はお酒と海外旅行© 2022 SRA OSS LLC

2

キーバリューストアRedisとはWhat's Key-Value Store, Redis© 2022 SRA OSS LLC

3

キーバリューストア (KVS) とは• キーと値のペアを格納する単純な形式のDBMS• KVSの人気ランキングでRedisは65種中1位

キー値

key1

val1

key2

val2

key3

val3

スコア (対数スケール)

100101
RedisDynamoDB
Cosmos DB
Memcached
Hazelcast

0.1

etcd
EhcacheAerospike
IgniteRiak KV

0.01
2013 2014 2015 2016 2017 2018 2019 2020 2021 2022
DB-Engines Ranking - Trend of Key-value Stores Popularity© 2022 SRA OSS LLC

4

Redis (Remote Dictionary Server) とは• レディス (red + kiss) と読む• KVSの一種• もとはSalvatore Sanfilippo氏が開発• 現在は米国Redis社 (元Redis Labs) が開発を継続• 最初のバージョンは2009年5月にリリース• リポジトリはGitHubで公開• 記述言語はC• ライセンスは修正BSD© 2022 SRA OSS LLC

5

Redisの特徴

インメモリ

高速

永続性

豊富なデータ型

可用性

スケーラビリティ© 2022 SRA OSS LLC6

Redisのアーキテクチャ• メモリ上で動作

ソケット
読み取り

プロトコル
解析

ソケット
読み取り

プロトコル
解析

…

ソケット
書き込み
メモリ
読み書き

ソケット
書き込み
ソケット
書き込み

io-threads n (デフォルト: 1)

プロトコル
解析

…

ソケット
読み取り

…

• 基本はシングルスレッド

io-threads-do-reads yes(デフォルト: no)© 2022 SRA OSS LLC

7

Redisの永続性
メモリ上のデータはサーバ停止時に消失
データを保持するにはディスク書き込みが必要

RDB (Redis Database)
スナップショット = ある時点の全データを保存
SET k1 v2

k1

SET k1 v3

AOF (Append Only File)
書き込み操作を追記で保存、サーバ起動時に再生

SET k1 v4

v1

k1

k1v3

SET k1 v2

SET k1 v3

SET k1 v4

SET k1 v2

SET k1 v2

SET k1 v2

SET k1 v3

SET k1 v3

v1

SET k1 v4© 2022 SRA OSS LLC

8

Redisのデータ型
文字列

ハッシュfld1
key1

val1

key1

fld3

val1
val3

fld2

リスト

val2

ソート済みセット
val1

val3

val1

key1

key1
val2

val1

セット

val3

3020
val2

10

その他
val1
key1

val3
val2

• ストリーム• 地理空間インデックス© 2022 SRA OSS LLC• ビットマップ• ビットフィールド• HyperLogLog
9Redisの可用性とスケーラビリティ
レプリケーション

センチネル

クラスタ

非同期にデータを複 死活監視、多数決で 複数ノードにデータ製、レプリカは読み 自動フェイルオーバ を分散 (シャーディ取り専用を行うング)
読み書き

k1

v1

k2v2

センチネル

マスタ

マスタ

k1

v1

k3v3

k5v5k2v2

k4v4

k6v6

マスタ

マスタ

マスタ

レプリカ

レプリカ

レプリカ

クライアント
読み取りk1

v1

k2v2

レプリカ

センチネル

センチネル
レプリカ

レプリカ

© 2022 SRA OSS LLC

10

Redisの基本的な使い方
Getting Started with Redis© 2022 SRA OSS LLC

11

Redisのインストール• Linux、macOSに対応• Windowsは公式には非対応、WSL2上で開発用に利用可• RHEL8の場合$ sudo dnf -qy install redis# パッケージをインストール

Installed:
redis-5.0.3-5.module+el8.5.0+657+2674830e.x86_64$ sudo systemctl enable redis.service# サーバの自動起動を有効化
Created symlink /etc/systemd/system/multi-user.target.wants/redis.service → /usr/lib/systemd/system/redis.service.
$ sudo systemctl start redis.service# サーバを起動© 2022 SRA OSS LLC

12

redis-cliコマンド• Redisのコマンドラインインタフェース• コマンドは引数に指定するか、対話的に入力して実行
redis-cli [オプション] [コマンド [引数 [引数 …]]]
$ redis-cli SET key1 val1
OK
$ redis-cli> GET key1
"val1"> DEL key1
(integer) 1> QUIT# コマンドを引数に指定して実行# 対話モードで起動
おもなオプション• -h ホスト名
デフォルト: 127.0.0.1• -p ポート
デフォルト: 6379
• -a パスワード パスワード認証が有効な場合に指定• -d DB番号0～15、デフォルト: 0© 2022 SRA OSS LLC

13

Redisのおもなデータ操作コマンド (1/3)
共通文字列コマンドKEYS パターン

説明

コマンド

パターンに一致する全キーを取得

説明

SET キー 値

指定したキーの値を設定

SETNX キー 値

キーが存在しない場合に値を設定

EXISTS キー …

キーが存在するかを取得

DEL キー …

キーを削除

GET キー

指定したキーの値を取得

RENAME キー 新キー

キーを別名に変更

MGET キー …

指定した複数のキーの値を取得

TYPE キー値のデータ型を取得

GETSET キー 値

指定したキーの値を設定し、古い値を取得

INCR キー値が整数の場合に1増やす

INCRBY キー 数

値が整数の場合に指定した数増やす

SUBSTR キー 開
始 終了

値の部分文字列を取得

データ型に応じてコマンドの使い分けが必要© 2022 SRA OSS LLC

14

Redisのおもなデータ操作コマンド (2/3)
リストセット

コマンド

説明

コマンド

LPUSH キー 要素…

リストの先頭に要素を追加

SADD キー メン
バ …

セットにメンバを追加

LPOP キー

リストの先頭から要素を削除し、取得

SRANDMEMBER
キーセットからランダムにメンバを取得

LSET キー 位置
要素リストの指定した位置の要素を設定

SMEMBERS キー

セットから全メンバを取得

LINDEX キー 位
置

リストの指定した位置から要素を取得

SISMEMBER キー
メンバ

セットにメンバが含まれるかを取得

LRANGE キー 開
始 終了

リストから指定した範囲の要素を取得

SREM キー メン
バ …

セットからメンバを削除

LREM キー 数 要素

リストから要素を削除

SCARD キー

セットのメンバ数を取得

SINTER キー …

LLEN キー

リストの長さを取得

複数セットに共通するメンバを取得© 2022 SRA OSS LLC

説明

15

Redisのおもなデータ操作コマンド (3/3)
ハッシュコマンド

ソート済みセット
説明コマンド説明

ハッシュのフィールドに値
HSET キーフィールド 値 … を設定

ZADD キー スコ
ア メンバ …

ソート済みセットにメンバを追加

HGET キーフィールド

ハッシュからフィールドの値を取得

ZRANGE キー 開
始 終了

ソート済みセットから指定した範囲のメンバを取得

HKEYS キー

ハッシュから全フィールドを取得

ZREM キー メンバ …

ソート済みセットからメンバを削除

HEXISTS キー
フィールド

ハッシュにフィールドが存在するかを取得

ZCARD キー

ソート済みセットのメンバ数を取得

HDEL キーフィールド …

ハッシュからフィールドを削除

ZSCORE キー メ
ンバ

ソート済みセットのメンバのスコアを取得

HLEN キー

ハッシュのフィールド数を取得

ZINCRBY キー 数
メンバ

ソート済みセットのメンバのスコアを指定した数増やす© 2022 SRA OSS LLC

16

Redisのトランザクション• 複数コマンドを後でまとめて実行• 実行中に他コマンドをはさまず、すべて成功か、すべて失敗かのいずれかが保証される> MULTIOK> SET key2 val2
QUEUED> SET key3 val3QUEUED> EXEC
1) OK
2) OK

コマンド

説明

MULTI

トランザクションを開始

EXEC

トランザクション内の全コマンドを実行

DISCARD

トランザクション内の全コマンドを破棄

WATCH キー …

指定したキーを監視し、変更されたらEXECを失敗にす
る

UNWATCH

キーの監視を解除© 2022 SRA OSS LLC

17

リモートホストからRedisへの接続設定• デフォルトではローカルホストからのみ接続可• リモートホストからの接続には設定が必要/etc/redis.conf# 接続受付IPアドレス# パスワード

bind 127.0.0.1 192.168.56.28
requirepass P@$5w0rd
bind 127.0.0.1

bind 127.0.0.1 192.168.56.28
サーバ
192.168.56.28

サーバ
127.0.0.1

クライアント192.168.56.28

127.0.0.1

クライアント© 2022 SRA OSS LLC

18

RedisとPostgreSQLの連携
Accessing from PostgreSQL to Redis© 2022 SRA OSS LLC

19

RedisとPostgreSQLの連携
Redis (KVS)

PostgreSQL (RDB)

高速

低速

互いの弱点を補い合う

単純なコマンド

複雑な問い合わせ© 2022 SRA OSS LLC

20

外部データラッパ (Foreign Data Wrapper, FDW) とは• データベースから外部データにアクセスする機能• SQL標準のSQL/MEDに基づく

oracle_fdw
file_fdw

クライアント外部テーブル

OracleCSVファイル

redis_fdw

PostgreSQL© 2022 SRA OSS LLC

Redis21

redis_fdwとは• Redis用FDW• もとはDave Page氏が開発• 現在はAndrew Dunstan氏が開発を継続• リポジトリはGitHubで公開• 記述言語はC• ライセンスはPostgreSQLライセンス© 2022 SRA OSS LLC

22PostgreSQLのインストール• PostgreSQLがまだならインストール• RHEL8の場合$ sudo dnf -qy install https://download.postgresql.org/pub/repos/yum/reporpms/E
L-$(rpm -E %rhel-%_arch)/pgdg-redhat-repo-latest.noarch.rpm# PGDGリポジトリをインストール$ sudo dnf –qy module disable postgresql# モジュールを無効化$ sudo dnf –qy install postgresql15-server# パッケージをインストール$ PGSETUP_INITDB_OPTIONS="-E UTF8 --no-locale" ¥# データベースクラスタを作成
sudo -E /usr/pgsql-15/bin/postgresql-15-setup initdb
Initializing database ... OK$ sudo systemctl enable postgresql-15.service# サーバの自動起動を有効化
Created symlink /etc/systemd/system/multi-user.target.wants/postgresql-15.servi
ce → /usr/lib/systemd/system/postgresql-15.service.
$ sudo systemctl start postgresql-15.service# サーバを起動© 2022 SRA OSS LLC

23

redis_fdwのインストール• バイナリ提供はない• ソースコードからビルドが必要$ sudo dnf -qy install epel-release # EPELリポジトリをインストール$ sudo dnf -qy install make redhat-rpm-config postgresql15-devel hiredis-devel# ビルドに必要なパッケージをインストール$ curl -LOs https://github.com/pg-redis-fdw/redis_fdw/archive/refs/heads/REL_15_STABLE.tar.gz# ソースコードをダウンロード$ tar -xzf REL_15_STABLE.tar.gz# ソースコードを展開$ cd redis_fdw-REL_15_STABLE# ソースコードの展開先に移動$ make PG_CONFIG=/usr/pgsql-15/bin/pg_config# ソースコードをビルド$ sudo make install PG_CONFIG=/usr/pgsql-15/bin/pg_config# プログラムをインストール© 2022 SRA OSS LLC

24

外部テーブルを通じたRedisへのアクセス (1/4)• データベースを作成し、拡張をインストール$ createdb redis_db$ psql redis_db=# CREATE EXTENSION redis_fdw;
CREATE EXTENSION• 外部サーバを作成=# CREATE SERVER redis_serverFOREIGN DATA WRAPPER redis_fdw OPTIONS (address '127.0.0.1', port '6379');
CREATE SERVER• 外部サーバのユーザマッピングを作成=# CREATE USER MAPPING FOR PUBLICSERVER redis_server OPTIONS (password 'P@s5w0rd');
CREATE USER MAPPING© 2022 SRA OSS LLC

25

外部テーブルを通じたRedisへのアクセス (2/4)• 外部テーブルを作成=# CREATE FOREIGN TABLE redis_table (key text, val text)
SERVER redis_server OPTIONS (database '0');
CREATE FOREIGN TABLE
keyval

key1

val1

key2

val2

key3

val3

外部テーブルredis_table

key1

val1

key2

val2

key3val3

データベース0© 2022 SRA OSS LLC

26

外部テーブルを通じたRedisへのアクセス (3/4)• 外部テーブルのデータを参照し、挿入
PostgreSQL

Redis=# SELECT * FROM redis_table;> SCAN 0 COUNT 1000
1) "0"
2) 1) "key1"2) "key2"3) "key3"> GET key1
"val1"> GET key2
"val2"> GET key3
"val3"> EXISTS key4
(integer) 0> SET key4 val4
OKkey | val------+-----key1 | val1
key2 | val2
key3 | val3
(3 行)=# INSERT INTO redis_table
VALUES ('key4', 'val4');
PostgreSQL
INSERT 0 1© 2022 SRA OSS LLC

27

外部テーブルを通じたRedisへのアクセス (4/4)• 外部テーブルのデータを更新し、削除
PostgreSQL

Redis=# UPDATE redis_table
SET val = 'val5'
WHERE key = 'key4';> GET key4
"val4"UPDATE 1> SET key4 val5
OK=# DELETE FROM redis_table
WHERE key = 'key4';> GET key4
"val5"

PostgreSQL> DEL key4(integer) 1

DELETE 1© 2022 SRA OSS LLC

28

redis_fdw外部テーブルのオプション
オプション
databasetabletype

tablekeyprefix
tablekeyset

singleton_key

説明tablekeyprefix 'p:'データベース番号。0～15を指定可。デフォルトは0データ型。list、set、hash、zset (ソート済みセット) を指定可。デフォルトは未指定で文字列指定した接頭辞をもつキーでデータを絞り込む
指定したキーのセットに含まれるキーでデータを絞り込む
指定したキーの値を展開し、データとする※tablekeyprefix、tablekeyset、singleton_keyはいずれか1つのみ指定可

key

val

p:k1

v1

p:k2

v2

tablekeyset 'kx'
key

val

k1

v1

k2

v2

p:k1

v1

p:k2

v2

k1

v1

k2

v2

k1

kx

k2

tabletype 'hash', singleton_key 'ky'
key

val

f1

v2

f2

v2

© 2022 SRA OSS LLC

ky

f1
f2

v1
v2

29

まとめ• Redisはインメモリで高速なKVS• データはRDBやAOFで永続化• 豊富なデータ型に対応• 自動フェイルオーバやシャーディング機能を備える• redis_fdwでPostgreSQLからRedisにアクセス可• KVSの高速さを活かしつつ、SQLで複雑な問い合わせも可SRA OSSでは、PostgreSQLはもちろん、Redisやredis_fdwのサポートを提供
Redisに関して何かありましたら、お気軽にお問い合わせください© 2022 SRA OSS LLC

30

参考URL• Redissraoss redis• https://redis.io/• redis_fdw• https://github.com/pg-redis-fdw/redis_fdw• SRA OSS
• Tech Blog - Redis: Redisを含むOSSの技術情報を公開• https://www.sraoss.co.jp/tech-blog/category/redis/• OSSサポート: Redisもサポート対象• https://www.sraoss.co.jp/prod_serv/support/oss-support/• PostgreSQLサポート&保守: redis_fdwもオプションでサポート可• https://www.sraoss.co.jp/prod_serv/support/pgsql-mainte/© 2022 SRA OSS LLC

31

https://www.sraoss.co.jp/

sales@sraoss.co.jp© 2022 SRA OSS LLC

03-5979-2701
32