数学 機械学習技術 人工知能技術 プログラミング技術 アルゴリズム データベース技術. デジタルトランスフォーメーション ICT技術
前回Redisを使った非同期処理について少し触れたが、今回のそのRedisそのものについてもう少し詳しく述べてみたい。
Redisは「Redis入門 インメモリKVSによるデータ管理」によると「Redisは、インメモリのリモートデータベースで、ハイパフォーマンス、レプリケーション、独特なデータモデルという特徴を持つ。5種類のデータ構造をサポートしており、Redisの機能に自然対応付けられる広範囲のさまざまな問題に適応できる。また、レプリケーション、永続化、クライアントサイドシャーディングなどの機能により、Reidsのスケーラビリティは非常に高く、プロトタイプを作る為の便利な手段として使うところから、数百GBのデータ、1秒あたりの数百万の要求を処理する本格的なデータベースシステムまで、さまざまな用途に対応できる」とある。
Redisに近い機能を提供するものとして、キーバリューキャッシュサーバーであるmemcachedがある。これと比較するとRedisはmemcached と同様に、キーから値へのマッピングを格納することができるが、2つの異なる方法(スナップショット(瞬間ダンプ)と追記専用書き込み)でディスクに自動的にデータを書き出す機能と、プレーンな文字列以外にも4種類のデータ構造を格納できることが大きく異なるポイントになる。
Redisは主データベースとして使うことも、他のストレージシステムの補助システムとして使うことも出来、Redisのパフォーマンスや機能が必要なときに限りRedisにデータを格納し、パフォーマンスが少し低くても許容できる場合や、データが大きすぎて経済的にメモリに収めるわけにはいかなくなったときには、他のデータベースを使うといった使い方ができる。
Reidsのデータ構造としては、STRING、LIST、SET、HASH、ZSETの5種類ある。それぞれのデータを扱うコマンドは5種類共通のものと、それぞれのデータにしか使えないものがある。STRING(文字列、整数、浮動点少数)、LIST(文字列の連結リスト)、HASH(一意な文字列の順序のないコレクション)に関しては様々なプログラミング言語で対応しているが、SET(順序のないキーと値のハッシュ)と特にZSET(ソート済みの集合)に関してはReedis特有のものとなっている。
<string>
set('en','Hello');
set('jp",'こんにちは');
get('en') -> 'Hello'
<hash>
hset('item01','name",'apple');
hset('item01','price','$5.0');
hset('item01','stock',1000);
hget('item01','name'); -> 'apple'
<list>
rPush('id01','aaa');
rPush('id01','bbb');
rPush('id01','ccc');
<set>
sAdd('food_a','meat');
sAdd('food_a','fish');
sAdd('food_b','bread');
sAdd('food_b','vegetable');
sUnion('food_a','food_b)
<zset>
zAdd('score',100,'Taro');
zAdd('score',300,'Jiro');
zAdd('score',200,'Hanako');
Redisに直接アクセスするには、redis-cli(Redis付属の対話型クライアント)がシンプルに使えるツールとしてある。
Redisの特徴の一つとしてpub/sub機能がある。これはDBをチャネルとして使いsubscribeすると通信が繋がれlisten状態となり、別の入力からデータをpublishするとそのタイミングでsubscribe側にデータが送付される。実際の動作例を以下に示す。
$ redis-server
<新しいターミナルで> (terminal1)
$redis-cli
>subscribe redis-test
Reading messages...(press Ctrl-C to quit)
1) "subscribe"
2) "redis-test"
3) (integer) 1
<別のターミナルで> (terminal2)
$redis-cli
>publish redis-test 'hello world'
(integer)1
<terminal1>
1)"message"
2)"redis-test"
3)"hello world"
これらを用いる事でClojureののcore.asyncで述べたチャネルを使ったキューが実現できる。
コメント
[…] Reidsについて NoSQL DBの一つであるK-V型DB(Redis)の概要と基本的な活用 […]