Redis Essentials読書ノート-第4章:Commands(Where the Wild Things Are)


Chapter 4. Commands (Where the Wild Things Are)
この章では、Redisを管理する一般的なコマンドとLua scriptingについて説明します.
Pub/Sub
Pub/subはPublish-Subscribe(発行/購読)、メッセージキューの一般的なモードを表します.
Pub/subの使用シーンには、*ニュースと天気掲示板*チャットアプリケーション*通知発表、例えば列車遅延*リモートコード実行、例えばSaltStack
PUBLISHはメッセージをchannelにリリースし、SUBSCRIBEはchannelのメッセージを購読し、UNSUBSCRIBEは購読をキャンセルします.サブスクリプション前にパブリッシュされた情報は受信できません.
サンプル・プログラムは、3つの端末を開く必要があります.前の2つのサブスクリプション・クライアントは待機をブロックし、後のパブリケーション・プログラムは非同期で、ブロックされません.
[redis@tt12c terminal1]$ node subscriber.js channel-1 
PONG
DATE 2016-05-05T06:06:53.299Z

[redis@tt12c terminal2]$  node subscriber.js channel-2
PONG
HOSTNAME tt12c

[redis@tt12c terminal3]$ node publisher.js global PING
[redis@tt12c terminal3]$ node publisher.js channel-1 DATE
[redis@tt12c terminal3]$ node publisher.js channel-2 HOSTNAME

監視プロセス全体は次のとおりです.
[redis@tt12c ~]$ redis-cli monitor
OK
1462428299.899393 [0 127.0.0.1:63664] "info"
1462428299.903415 [0 127.0.0.1:63664] "subscribe" "global" "channel-1" <- client1      
1462428336.424626 [0 127.0.0.1:63665] "info"
1462428336.428984 [0 127.0.0.1:63665] "subscribe" "global" "channel-2"
1462428397.280185 [0 127.0.0.1:63668] "info"
1462428397.285357 [0 127.0.0.1:63668] "publish" "global" "PING"
1462428413.295175 [0 127.0.0.1:63670] "info"
1462428413.299221 [0 127.0.0.1:63670] "publish" "channel-1" "DATE"
1462428424.192961 [0 127.0.0.1:63671] "info"
1462428424.196800 [0 127.0.0.1:63671] "publish" "channel-2" "HOSTNAME"
^C

PUBSUBはPub/subシステムの内部状態を表示できます.PUBSUBはCHANNELS、NUMSUB 127.0.0.1:6379>PUBSUB CHANNELS 1)「global」2)「channel-1」127.0.0.1:6379>PUBSUB CHANNELS glo*1)「global」などのサブコマンドを指定する必要があります.
127.0.0.1:6379> PUBSUB NUMSUB global 1) “global” 2) (integer) 2 127.0.0.1:6379> PUBSUB NUMSUB global channel-1 channel-2 1) “global” 2) (integer) 2 3) “channel-1” 4) (integer) 1 5) “channel-2” 6) (integer) 1
Pub/subを使用して実装されたチャットプログラムについては、以下を参照してください.https://gist.github.com/pietern/348262.
Transactions
Redisは単一スレッドであるため,トランザクションとは順序に従ってグループ化されて実行される命令のセットである.MULTIタグ取引の開始、EXECタグ取引の終了.その間、他のクライアントの要求は説明されません.
クライアントはEXECまですべてのコマンドをサーバに送信するので、EXECの代わりにDISCARDを使用して取引の実行をキャンセルできます.
従来のSQLデータベースとは異なり、Redisでのトランザクションはロールバックできません.もう1つの不足は、すべてのコマンドがキュー順に実行されるため、トランザクションでは制御できません.だから取引のコントロールは通常外に置いて、条件が満たされたらEXECを実行します
取引の実行はWATCHコマンドと組み合わせることができて、WATCH監視のkeyは変更されていない時だけEXECは取引を実行して、さもなくばNULLに戻って再試行する必要があることを示して、実はoptimistic lockの1種の実現です.
Optimistic Locking is a strategy where you read a record, take note of a version number (other methods to do this involve dates, timestamps or checksums/hashes) and check that the version hasn’t changed before you write the record back. Pessimistic Locking is when you lock the record for your exclusive use until you have finished with it. It has much better integrity than optimistic locking but requires you to be careful with your application design to avoid Deadlocks.
プログラム全体の実行手順は次のとおりです(unwatchコマンドは監視されていません).
$ node watch-transaction.js
The first president in the group is: George Washington

[redis@tt12c ~]$ redis-cli monitor
OK
1462430261.133540 [0 127.0.0.1:63679] "info"
1462430261.137652 [0 127.0.0.1:63679] "zadd" "presidents" "1732" "George Washington"
1462430261.138245 [0 127.0.0.1:63679] "zadd" "presidents" "1809" "Abraham Lincoln"
1462430261.138411 [0 127.0.0.1:63679] "zadd" "presidents" "1858" "Theodore Roosevelt"
1462430261.138548 [0 127.0.0.1:63679] "watch" "presidents"
1462430261.139920 [0 127.0.0.1:63679] "zrange" "presidents" "0" "0"
1462430261.142635 [0 127.0.0.1:63679] "multi"
1462430261.142661 [0 127.0.0.1:63679] "zrem" "presidents" "George Washington"
1462430261.142678 [0 127.0.0.1:63679] "exec"

Pipelines
RedisのPipelineは、コマンドのセットを一度にサーバに送信し、結果を待つのではなく、すべての結果を一括して取り戻します.これは、通常のUNIX Shellのpipelineとは異なります.Pipelineの目的はRTTを減らし,ネットワーク遅延を回避することである.Pipelineのコマンドは、順序に従って実行されているにもかかわらず、取引によって実行されているわけではありません.
実はjsはPipelineモードで実行されますが、すべてのクライアントがそうであることは保証されません.
Scripting
Luaスクリプト言語は簡単で、コンパクトで、機能が強く、Civilization V、Angry Birds、World of Warcraftなどのゲーム開発に一般的に使用されています.Luaはスクリプト言語としてLuaを使用しています.
Redis 2.6以降、LuaはRedisを拡張するために使用することができ、以前はソースコードを変更するしかなかった.
Luaスクリプトが実行されるとRedisサーバがブロックされるため、デフォルトでは5秒のタイムアウトが設定されます.Luaの基本文法は原書を参照してください.RedisクライアントはLuaスクリプトを文字列としてサーバに実行し、keyをKEYSとARGVでスクリプトに渡すことができます.Luaスクリプトは、EVALとEVALSHAで実行されます.
このセクションでは、以前のWATCHバージョンよりも簡潔で、多くのユーザーがWATCH/MULTI/EXECの代わりにLuaスクリプトを使用してトランザクションを実行する例を示します.
Miscellaneous commands
INFO
バージョン、OS、メモリ使用量などを含むRedisサーバのステータス情報を返し、一部の情報を表示するように指定します.
127.0.0.1:6379> info clients
# Clients
connected_clients:3
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

127.0.0.1:6379> info
# Server
redis_version:3.0.7
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:ebdca053ec3876f6
redis_mode:standalone
os:Linux 3.8.13-44.1.1.el6uek.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.4.7
process_id:4649
run_id:5368932ddedc34777729830cf10fc24b44586dc7
tcp_port:6379
uptime_in_seconds:3411
uptime_in_days:0
hz:10
lru_clock:2815864
config_file:

# Clients
connected_clients:3
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

# Memory
used_memory:551416
used_memory_human:538.49K
used_memory_rss:2162688
used_memory_peak:551416
used_memory_peak_human:538.49K
used_memory_lua:36864
mem_fragmentation_ratio:3.92
mem_allocator:jemalloc-3.6.0

# Persistence
loading:0
rdb_changes_since_last_save:3
rdb_bgsave_in_progress:0
rdb_last_save_time:1462430245
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:-1
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok

# Stats
total_connections_received:5
total_commands_processed:13
instantaneous_ops_per_sec:0
total_net_input_bytes:467
total_net_output_bytes:9041
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:1
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:0
migrate_cached_sockets:0

# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

# CPU
used_cpu_sys:3.02
used_cpu_user:1.62
used_cpu_sys_children:0.00
used_cpu_user_children:0.00

# Cluster
cluster_enabled:0

# Keyspace
db0:keys=5,expires=3,avg_ttl=1757324836
127.0.0.1:6379> 

DBSIZE
現在のサーバにおけるkeyの数
127.0.0.1:6379> DBSIZE (integer) 5
DEBUG SEGFAULT
Redis Serverをクラッシュさせるコマンドは、主にシミュレーションエラーとデバッグに使用されます.
本番システムは慎重に使用してください.そうしないと、サーバはcore dumpします.
Segmentation fault (core dumped)

MONITOR
デバッグとモニタリングに役立ちます.前はもう何度も使っています.ただし、本番システムでは慎重に使用し、サーバのスループットを半分に減らすことができます.
CLIENT LIST and CLIENT SET NAME
デバッグとモニタリングにも使用されます.
127.0.0.1:6379> client list
id=4 addr=127.0.0.1:63693 fd=6 name= age=2 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
127.0.0.1:6379> client setname client-01
OK
127.0.0.1:6379> client list
id=4 addr=127.0.0.1:63693 fd=6 name=client-01 age=31 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
127.0.0.1:6379> 

CLIENT KILL
クライアントの接続を切断するには、IPアドレス、IDなどによって行うことができます.
FLUSHALL
すべてのキーを削除
127.0.0.1:6379> dbsize
(integer) 5
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> dbsize
(integer) 0

RANDOMKEY
ランダムリターンキー
127.0.0.1:6379> KEYS *
1) "concurrentplays:1min:60"
2) "presidents"
3) "concurrentplays:1hour:0"
4) "concurrentplays:1min:0"
5) "concurrentplays:1day:0"

127.0.0.1:6379> RANDOMKEY
"concurrentplays:1min:0"

EXPIRE and EXPIREAT
keyの有効期間を設定し、期限が切れると削除されます.単位は秒、負数であればすぐに削除し、DELに相当します.
TTL and PTTL
keyの有効期間を表示します.
PERSIST
有効期間を削除して、永遠に有効にすることができます
SETEX
keyと有効期間の同時設定
DEL
1つ以上のkeyを削除
EXISTS
キーが存在するか否かを判断する
127.0.0.1:6379> SET mykey myvalue OK 127.0.0.1:6379> EXISTS mykey (integer) 1
PING
サーバが接続可能かどうか
127.0.0.1:6379> PING PONG
MIGRATE
redisサーバ間でkeyを移行するには、COPYまたはMOVE
SELECT
redis serverは複数のデータベースをサポートしていますが、推奨されていません.CPUをよりよく利用できるため、Redis-serverは単一スレッドで実行されます.SELECTはSybaseのuse databaseに相当します.
AUTH
認証クライアント、サーバへのパスワードの提供
SCRIPT KILL
中断Lua Script
SHUTDOWN
すべてのクライアント接続を切断し、サーバを閉じます.永続化(SHUTDOWN SAVE)またはメモリ内のデータの破棄(SHUTDOWN NOSAVE)を選択できます.
OBJECT ENCODING
keyの内部データ構造実装を表示し、TYPEはデータ型であり、OBJECT ENCODINGは具体的な実装であることに注意する.例えばhashはhash tableでもziplistでも実現できる
127.0.0.1:6379> HSET math score 100
(integer) 1
127.0.0.1:6379> type math
hash
127.0.0.1:6379> OBJECT ENCODING math
"ziplist"

Data type optimizations
Redisでは、すべてのデータ型で異なるインプリメンテーション(ENCODING)を選択して、パフォーマンスを向上させ、メモリを節約できます.
これらのENCODINGに影響するオプションは、プロファイルredisで使用できます.confで設定するか、CLIで指定するか、CONFIGコマンド設定を実行します.
[redis@tt12c ~]$ find . -name redis.conf
./redis-3.0.7/redis.conf
[redis@tt12c ~]$ cd redis-3.0.7/
[redis@tt12c redis-3.0.7]$ wc -l redis.conf 
943 redis.conf

String
StringのENCODINGにはいくつかあります.
127.0.0.1:6379> SET str1 12345
OK
127.0.0.1:6379> OBJECT ENCODING str1
"int"
127.0.0.1:6379> SET str2 "An embstr is small"
OK
127.0.0.1:6379> OBJECT ENCODING str2
"embstr"
127.0.0.1:6379> SET str3 "A raw encoded String is anything greater than 39 bytes"
OK
127.0.0.1:6379> OBJECT ENCODING str3
"raw"

List
Listにはziplist(list-max-ziplist-entriesとlist-max-ziplist-valueパラメータの影響)とlinkedlistの2種類のENCODINGがあり、前者はメモリを節約します.
Set
Setにはintset(すべて整数、set-max-intset-entriesの影響)とhashtableの2種類のENCODINGがあります.The following are the available encodings for Sets:
Hash
Hashにはziplist(hash-max-ziplist-entriesとhash-max-ziplist-valueパラメータの影響)とhashtableの2種類のENCODINGがあり、前者はメモリを節約します.The following are the available encodings for Hashes:
Sorted Set
ziplist、skiplistまたはhashtableの3種類のENCODING.
Measuring memory usage
実はinfo memoryはコードの前後に2回実行し、減算するとメモリが得られます.
メモリの節約は、ziplistではメンバーが多ければ多いほどパフォーマンスが低下するため、比較が必要です.例えば、InstagramがHashに1000人のメンバーが含まれていることを発見した場合、最も効果的です.http://instagram-engineering.tumblr.com/post/12202313862/storing-hundreds-of-millions-of-simple-key-value
Summary
この章は、開発者ではなくシステム管理者に偏っています.メッセージキューのパブリケーション/サブスクリプション,トランザクション,pipelineについて説明した.システム管理と監視のためのコマンド.ENCODINGによるデータ型最適化