Redisの紹介

Redisとは

Redisはインメモリで動作するKey-Valueストア(KVS)ソフトウェアです。Redisのデータはすべてメモリ内に保存されるため、高速なデータの読み書きが可能です。また、単純なキーと値のペアだけでなく様々なデータ構造が利用でき、データの永続化、冗長化、クラスタといった機能を備えており、様々な用途に対応できます。RedisはBSDライセンスの元配布されているオープンソースソフトウェアです。

Redisの特長

豊富なデータ構造

Redisは単純なキーと値のペアだけでなく以下のような様々なデータ型に対応しています。

  • Strings: テキストまたはバイナリデータ (最大 512MB)
  • Lists: 追加された順に並べられた文字列の集合
  • Sets: 順序なしの文字列の集合
  • Sorted Sets: スコアで順序付けされた文字列の集合 (ランキングなどに使える)
  • Hashes: フィールドと値のリストを保存するデータ構造
  • Bitmaps: ビット演算を実行できるデータ型
  • HyperLogLogs: データセット内の一意の値の数を推定する確率的データ構造
  • Srtreams: (Redis 5以降) ストリーム処理のための追記専用の時系列データ構造

データの永続化

Redisはインメモリデータベースですが、データをディスクに保存しておき、次回起動時にデータを読み込むことで永続化させることができます。

冗長化

Redisはマスター・スレーブ型のレプリケーションに対応しています。マスターの死活監視を行い、自動フェイルオーバーを行うことも可能です。複数のマスターから成るCluster構成をとることもできます。

導入手順

前提

インストール対象の OS として RHEL 7.x / CentOS 7.x を使用します。

1台構成のインストール

Redis の最新バージョンのインストールは Remi リポジトリを利用するのが最も簡単です。今回は Remi リポジトリを用いたインストール方法を紹介します。

1. epel, remiリポジトリのインストール

# yum install epel-release
# yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm

2. Redisパッケージのインストール

# yum install --enablerepo=epel,remi redis

3. Redisの起動

# systemctl start redis
# systemctl status redis
● redis.service - Redis persistent key-value database
Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/redis.service.d
└─limit.conf
Active: active (running) since 火 2019-05-21 15:59:30 JST; 5s ago
Main PID: 2391 (redis-server)
CGroup: /system.slice/redis.service
└─2391 /usr/bin/redis-server 127.0.0.1:6379

5月 21 15:59:30 centos7 systemd[1]: Starting Redis persistent key-value database...
5月 21 15:59:30 centos7 systemd[1]: Started Redis persistent key-value database.

4. OSの設定

RHEL 7.x / CentOS 7.x のデフォルトの OS 設定の場合、 Redis 起動時に以下の警告が出る場合があります。

2391:M 21 May 2019 15:59:30.238 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sy
s/net/core/somaxconn is set to the lower value of 128.

TCPバックログ(待ち受け可能なTCPセッション数)のOSのデフォルト値は128ですが、Redisのデフォルトでは511が指定されているため、OSのバックログを拡張します。

# sysctl net.core.somaxconn
net.core.somaxconn = 128
# sysctl -w net.core.somaxconn=512
net.core.somaxconn = 512

OS起動時に有効にするには /etc/sysctl.conf に net.core.somaxconn = 512 を追加します。

2391:M 21 May 2019 15:59:30.238 # WARNING overcommit_memory is set to 0! Background save may fail under low m
emory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run
the command 'sysctl vm.overcommit_memory=1' for this to take effect.

空きメモリが少ない状態でのバックグラウンド保存が失敗するのを防ぐため、OSの overcommit_memory を有効にします。OS起動時に有効にするには同様に /etc/sysctl.conf に vm.overcommit_memory = 1 を追加します。

# sysctl vm.overcommit_memory
vm.overcommit_memory = 0
# sysctl -w vm.overcommit_memory=1
vm.overcommit_memory = 1
2391:M 21 May 2019 15:59:30.238 # WARNING you have Transparent Huge Pages (THP) support enabled in your kerne
l. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never
> /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain
the setting after a reboot. Redis must be restarted after THP is disabled.

応答時間やメモリ使用量の問題を防ぐため、OSのTransparent Huge Pages (THP)を無効にします。

# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
# echo never > /sys/kernel/mm/transparent_hugepage/enabled
# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]

OS起動時に有効にするには /etc/sysconfig/grub の GRUB_CMDLINE_LINUX オプションに transparent_hugepage=never を追加します。

# vi /etc/sysconfig/grub
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/swap vconsole.font=latarcyrheb-sun16 vconsole.keymap=jp106 rd.lvm.lv=centos/root crashkernel=auto  rhgb quiet transparent_hugepage=never"
# grub2-mkconfig -o /boot/grub2/grub.cfg

上記の修正を反映させるためRedisを再起動します。

# systemctl restart redis

5. 自動起動の有効化

# systemctl enable redis

基本的な使い方

データの保存・取得

Redisのコマンドラインツールredis-cliでRedisを直接操作することができます。

$ redis-cli
127.0.0.1:6379> set hoge 1 #キーに値1を設定
OK
127.0.0.1:6379> get hoge #キーの値を取得
"1"
127.0.0.1:6379> incr hoge #キーの値に1を加算(数値のみ)
(integer) 2
127.0.0.1:6379> get hoge #加算されている
"2"
127.0.0.1:6379> set fuga "aaa" #キーに文字列を設定
OK
127.0.0.1:6379> get fuga
"aaa"
127.0.0.1:6379> keys *      #キー一覧を取得
1) "fuga"
2) "mylist"
3) "myset:__rand_int__"
4) "key:__rand_int__"
5) "hoge"
6) "counter:__rand_int__"

Redisはキーの種類によって値を取得するコマンドが異なります。

127.0.0.1:6379> type "myset:__rand_int__"  #キーの種類を取得
hash
127.0.0.1:6379> hgetall "myset:__rand_int__"  #hashの値を取得
1) "element:__rand_int__"
2) "xxx"

サーバ情報の取得

infoコマンドでRedisサーバのリソース使用状況などの様々な情報を取得できます。Redisサーバの状態の監視に使用することができます。

127.0.0.1:6379> info
# Server
redis_version:5.0.5
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:619d60bfb0a92c36
redis_mode:standalone
...

# Clients
connected_clients:1
client_recent_max_input_buffer:2
client_recent_max_output_buffer:0
blocked_clients:0

# Memory
used_memory:854344
used_memory_human:834.32K
...

設定の操作

config getコマンドで設定情報を取得します。config setコマンドで一時的に設定を変更することもできます。

127.0.0.1:6379> config get *
1) "dbfilename"
2) "dump.rdb"
...
213) "bind"
214) "127.0.0.1"

セキュリティ

接続元の制限

デフォルトの設定ではローカルホストからのみ接続を受け付けます。他ホストからも接続を受け付けたい場合は、 /etc/redis.conf の以下の行に接続を受け付けたいIPアドレスを追加します。

bind 127.0.0.1
↓
bind 127.0.0.1 192.168.1.100

なお、bindの行をコメントアウトして無効化し、かつprotected-modeも無効にするとすべてのアドレスから接続を受け付けてしまうためご注意ください。

認証

クライアント接続時に認証を行いたい場合は /etc/redis.conf に以下を追加します。

requirepass <パスワード文字列>
127.0.0.1:6379> get hoge
(error) NOAUTH Authentication required.
127.0.0.1:6379> AUTH password
OK
127.0.0.1:6379> get hoge
"2"

ベンチマーク

RedisにはRedisの性能を測定するredis-benchmarkユーティリティが付属しており、簡単にRedisのベンチマークテストを行うことができます。デフォルトでは各種コマンドを10万回実行して実行時間を測定します。

$ redis-benchmark
====== PING_INLINE ======
  100000 requests completed in 1.50 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

99.09% <= 1 milliseconds
99.99% <= 2 milliseconds
100.00% <= 2 milliseconds
66711.14 requests per second
...

====== SET ======
  100000 requests completed in 1.45 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

99.79% <= 1 milliseconds
99.95% <= 2 milliseconds
99.95% <= 16 milliseconds
99.95% <= 18 milliseconds
100.00% <= 18 milliseconds
69156.30 requests per second
...

-q で結果のみ表示します。

$ redis-benchmark -q
PING_INLINE: 67024.13 requests per second
PING_BULK: 66357.00 requests per second
SET: 66050.20 requests per second
GET: 65876.16 requests per second
INCR: 69013.11 requests per second
LPUSH: 70028.02 requests per second
RPUSH: 69300.07 requests per second
LPOP: 68917.99 requests per second
RPOP: 68540.09 requests per second
SADD: 68965.52 requests per second
HSET: 70274.07 requests per second
SPOP: 67521.95 requests per second
LPUSH (needed to benchmark LRANGE): 67888.66 requests per second
LRANGE_100 (first 100 elements): 39808.91 requests per second
LRANGE_300 (first 300 elements): 18372.22 requests per second
LRANGE_500 (first 450 elements): 13553.81 requests per second
LRANGE_600 (first 600 elements): 10847.16 requests per second
MSET (10 keys): 66979.23 requests per second

おわりに

Redisは高機能なソフトウェアですが、上記で紹介したように簡単に導入して試すことができます。実際に利用する場合はアプリケーションからライブラリを通してRedisアクセスすることになります。また、業務で使用する場合は冗長化による信頼性の向上も必要となります。

次回はデータの永続化、バックアップとリストア、冗長化など、実際の運用で必要となる機能について解説します。