Redisクラスタ構築:インストール方法と基本データ型

Redis概要:

一、概要Redisはオープンソースで、C言語で書かれた、ネットワーク通信をサポートし、メモリベースでも永続化も可能なキーバリューデータベースです。Redisのソースコードは比較的シンプルで、C言語の基礎知識があれば、ソースコードの50~60%は理解できるでしょう。現在、Redisの最大のクラスタ環境は新浪(Sina)が運用しているものと考えられています。Redisは現在VMwareによってサポートされており、多くのオープンソースソフトウェアは特定の組織からの支援が必要です。もしオープンソースソフトウェアが資金的な支援を受けられない場合、持続的な発展は困難になります。 二、RedisとMemcacheの比較永続化:ECサイトを例に挙げると、セッション管理にはMemcacheが、カート機能にはRedisが使われることがあります。ユーザーがログアウトしても、カート内のアイテムは保存され続けると表示されます。相対的に、Memcacheはより単純なデータ構造に特化しています!マスタースレーブレプリケーション:RedisのマスタースレーブレプリケーションはMySQLのそれに似ていますが、原理は異なります!仮想メモリ:要するに、メモリ内で使用されていないデータをハードディスクに移動する機能です。パフォーマンスが低下するため、使用は避けるべきです。現在ではメモリ価格が比較的安いため、この機能は必要ありません。 Redisのインストールと基本操作:

一、Redisのインストール

1. 環境設定の確認
gccがインストールされているか確認。インストールされていない場合は:yum -y install gcc

2. Redisのダウンロードとインストール
cd /opt/
wget http://download.redis.io/releases/redis-3.0.4.tar.gz
# 最新のRedisを確認する場合は公式サイトにアクセスしてください
tar -xvf redis-3.0.4.tar.gz
make
make install
cd /opt/redis-3.0.4/src/
make test


インストール中に発生する可能性のある問題:
zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory
zmalloc.h:55:2: error: #error "Newer version of jemalloc required"

メモリ割り当て子(アロケータ)
---------------------------------------------------------------------------------------------------------
Redisをビルドする際にデフォルトではないメモリ割り当て子を選択するには、`MALLOC`環境変数を設定します。Redisはデフォルトでlibc mallocでコンパイルされ、リンクされます。ただし、Linuxシステムではjemallocがデフォルトです。このデフォルトは、jemallocがlibc mallocよりもフラグメント化問題が少ないことが証明されているため選ばれました。
libc mallocでコンパイルを強制するには:
% make MALLOC=libc
Mac OS Xシステムでjemallocでコンパイルするには:
% make MALLOC=jemalloc

アロケータとは、MALLOCという環境変数がある場合、その環境変数を使ってRedisをビルドします。
また、libcはデフォルトのアロケータではなく、デフォルトはjemallocです!
なぜなら、jemallocがlibcよりも少ないフラグメンテーション問題を持つことが証明されているからです。

しかし、jemallocがなくてしかもlibcしかない場合、makeはエラーになります。そのため、このようなパラメータを追加します。
make MALLOC=libc
---------------------------------------------------------------------------------------------------------

3. Redisの設定
cp /opt/redis-3.0.4/utils/redis_init_script /etc/init.d/redis    # 管理スクリプトをコピー
chmod +x /etc/init.d/redis
mkdir /etc/redis
cp /opt/redis-3.0.4/redis.conf /etc/redis/6379.conf

4. Redisの起動モードの変更
デフォルトではRedisはフォアグラウンドで起動します。バックグラウンドで起動するように変更します
vim /etc/redis/6379.conf
daemonize no  を daemonize yes に変更

5. Redisをシステムサービスに追加し、起動時に自動実行を設定
まずRedis起動スクリプトを変更します:
vim /etc/init.d/redis
#chkconfig: 35 95 95  3行目にこれを追加

システムサービスを追加:chkconfig --add redis
自動起動を設定:chkconfig redis on
サービス状態を確認:chkconfig --list redis

6. ログ保存場所・PIDファイル・データベースファイル保存場所の指定(永続化については次回)
vim /etc/redis/6379.conf

logfile "/var/log/redis.log"  ログファイルを指定しないとコンソールに出力されます
pidfile /var/run/redis_6379.pid 
dir ./   これはデフォルトの永続化設定ファイルの保存場所です!変更を推奨します!

pidfileを変更しないとデフォルトだとエラーになります:
理由は/etc/init.d/redisで指定されているデフォルトのPIDは:PIDFILE=/var/run/redis_${REDISPORT}.pid  
ですが、デフォルトの設定ファイル:/opt/redis-3.0.4/redis.conf(解凍したものからコピーしたもの)のデフォルトは:pidfile /var/run/redis.pid 

二、Redisの基本操作

SET キーの設定GET キーの値の取得EXISTS キーの存在確認KEYS * すべてのキーの表示DEL 指定キーの削除TYPE キータイプの取得注:Redisは大文字と小文字を区別しません。コマンドは大文字を使用するとコマンドとパラメータを区別しやすくなります!

1. setの例:
192.168.0.201:6379> SET hello hehe
OK
192.168.0.201:6379> GET hello
"hehe"

2. 複数のキーと値を設定し、keys *で確認
192.168.0.201:6379> SET hello1 hehe1
OK
192.168.0.201:6379> SET hello2 hehe2
OK

192.168.0.201:6379> KEYS  *
1) "hello1"
2) "hello"
3) "hello2"

キーの照合方法:
?単一文字の照合
 *すべての照合

3. キーの存在確認
キーの存在確認には:EXISTS を使用します。戻り値は整数:0=存在しない、1=存在する
192.168.0.201:6379> EXISTS hello
(integer) 1
192.168.0.201:6379> EXISTS hehe
(integer) 0

4. キーの削除
192.168.0.201:6379> DEL hello
(integer) 1   # ここでの1は削除されたキーの数
複数削除のテスト:
192.168.0.201:6379> DEL hello1 hello2
(integer) 2

5. タイプの確認TYPE
setで設定したものはすべて文字列型です。タイプの確認にはTYPEコマンドを使用します
192.168.0.201:6379> TYPE hello
string

6. Keyspace
Redisは複数のインスタンスをサポートしており、デフォルトでは最大16個までです。設定ファイルを変更することでさらに増やすことができます!
INFOコマンドで確認!
# Keyspace
db0:keys=1,expires=0,avg_ttl=0

db0 :これは名前空間と考えることができます。最大16個までサポートされ、SELECTで切り替えます
192.168.0.201:6379> SELECT 1
OK
キーと値を追加してみる
SET db1 hehe
再度INFOで確認
# Keyspace
db0:keys=1,expires=0,avg_ttl=0
db1:keys=1,expires=0,avg_ttl=0

Redisデータ型:

Redisは、操作するデータ型を区別するために異なるコマンドを使用します 型はネストや混在ができません!しかし例外があります:setはすべての型を文字列型に変換できます!

  1. 文字列型:
SET
GET
DEL
APPEND  値の後ろに追加
setで再設定できますが、追加する場合はAPPENDが最適です。例:
192.168.0.201:6379> SET hehe hello
OK
192.168.0.201:6379> GET hehe
"hello"
192.168.0.201:6379> APPEND hehe ,world
(integer) 11
192.168.0.201:6379> GET hehe
"hello,world"

複数の値を同時に設定・取得するにはMSETとMGETを使用します
192.168.0.201:6379> MSET key1 v1 key2 v2 key3 v3
OK
192.168.0.201:6379> MGET key1 key2 key3
1) "v1"
2) "v2"
3) "v3"

文字列の長さを取得
192.168.0.201:6379> STRLEN hehe
(integer) 11
文字列が中国語の場合、UTF-8形式で1文字を3文字としてカウントします
192.168.0.201:6379> SET key "呵呵"
OK
192.168.0.201:6379> GET key
"\xe5\x91\xb5\xe5\x91\xb5"
  1. インクリメント型
例えば投票で+1する場合、setを使って毎回更新するのは現実的ではありません。そのため、Redisにはインクリメント型があります:INCR
192.168.0.201:6379> INCR num           # この値が存在しない場合、INCRは自動で値を作成しデフォルトで0に設定し、実行するたびに+1します
(integer) 1
192.168.0.201:6379> INCR num
(integer) 2
192.168.0.201:6379> INCR num
(integer) 3
192.168.0.201:6379> INCR num
(integer) 4


複数増やす場合は:INCRBY 
192.168.0.201:6379> INCRBY num 10
(integer) 57
192.168.0.201:6379> INCRBY num 10
(integer) 67
192.168.0.201:6379> INCRBY num 10
(integer) 77


減らす場合は? DECR 
192.168.0.201:6379> DECR num
(integer) 106
192.168.0.201:6379> DECR num
(integer) 105
192.168.0.201:6379> DECR num
(integer) 104

複数減らす場合は:DECRBY
192.168.0.201:6379> DECRBY num 5
(integer) 97
192.168.0.201:6379> DECRBY num 5
(integer) 92
192.168.0.201:6379> DECRBY num 5
(integer) 87

小数点をサポートするには:
INCRBYFLOAT key 0.1
192.168.0.201:6379> INCRBYFLOAT key 0.1
"0.1"
192.168.0.201:6379> INCRBYFLOAT key 0.1
"0.2"
192.168.0.201:6379> INCRBYFLOAT key 0.1
"0.3"
192.168.0.201:6379> INCRBYFLOAT key 0.1
"0.4"
  1. ハッシュ型
データベースのテーブルのようなもので、テーブルにはフィールドがあります。各フィールドに値を設定できます
HSET キー フィールド 値
HGET キー フィールド
HMSET キー フィールド 値 [フィールド 値....]
HMGET キー フィールド [フィールド ...]
HGETALL キー
HDEL 

192.168.0.201:6379> HSET shouji name iphone
(integer) 1
192.168.0.201:6379> HSET shouji co red
(integer) 1
192.168.0.201:6379> HSET shouji price 8888
(integer) 1

192.168.0.201:6379> HGET shouji name
"iphone"
192.168.0.201:6379> HGET shouji co
"red"
192.168.0.201:6379> HGET shouji price
"8888"
192.168.0.201:6379> HGETALL shouji
1) "name"
2) "iphone"
3) "co"
4) "red"
5) "price"
6) "8888"

現在は見た目は良くありませんが、APIを通じてWebページで呼び出し、レイアウトを調整して値を取得すると見栄えが良くなります
192.168.0.201:6379> HMSET diannao name thinkpad co black price 30
OK
192.168.0.201:6379> HMGET diannao name co price
1) "thinkpad"
2) "black"
3) "30"
  1. リスト型
リスト型:順序付けられた文字列リストを保存します この「順序付け」はいつ追加されたのですか!


リストに左から追加しても右から追加しても、時間計算量は同じです!O1(時間計算量)
これは、この速度が数量の増加によって変化しないことを意味します。例えば、1000行と1万行では、時間コストは同じです!大学のデータ構造で学んだものです

時間計算量:
同じ問題でも異なるアルゴリズムで解決できますが、アルゴリズムの質の良し悪しがアルゴリズム乃至プログラムの効率に影響します。アルゴリズム分析の目的は、適切なアルゴリズムを選択し、アルゴリズムを改良することにあります。
コンピュータサイエンスにおいて、アルゴリズムの時間計算量は関数であり、そのアルゴリズムの実行時間を定量的に記述します。

しかし欠点があります。例えば、リストに1万個のキーがあり、98番目を探そうとすると大変です。1から98まで数える必要があります。
                利点として、先頭の100個を読む場合は、先頭から直接読むと非常に高速です


コマンド:
LPUSH キー 値 [値 ...]
RPUSH キー 値 [値 ...]
               LPOP キー
               RPOP キー
     LRANGE キー 開始 終了
     LREM キー 数値 値
4.1、
左からキーを追加
192.168.0.201:6379> LPUSH num 0
(integer) 1
192.168.0.201:6379> LPUSH num 1
(integer) 2
192.168.0.201:6379> LPUSH num 2
(integer) 3

現在は左から追加しています
2  1   0

右から追加
192.168.0.201:6379> RPUSH num 3
(integer) 4
2  1   0  3

192.168.0.201:6379> RPUSH num 5
(integer) 5

2  1  0  3  5  5


長さを取得したい場合はLLENを使用します!リスト型の長さを取得するには:LLEN
192.168.0.201:6379> LLEN num
(integer) 5

4.2、左からキーを取り出す
リスト型からこのキーを取り出します(取り出すとなくなります)。左から取り出すと左の最初のものが取り出されます
192.168.0.201:6379> LPOP num
"2"

左の最初が2なので、取り出した後このキーは
1  0  3  5  に変わります

右からキーを取り出す、右から取り出すと右の最初のものが取り出されます(この5は取り出されました)
192.168.0.201:6379> RPOP num
"5"

今このキーの長さを見てみましょう
192.168.0.201:6379> LLEN num
(integer) 3

4.3、
リストの特定の範囲を取得:
現在の値は
1  0  3 です

192.168.0.201:6379> LRANGE num 0 1              # 0 - 1 の値を取得
1) "1"
2) "0"

###このリストはPythonのリストと似ており、0 -1 はリストのインデックスに相当します。

192.168.0.201:6379> LPUSH num 2
(integer) 4
192.168.0.201:6379> RPUSH num 4
(integer) 5


192.168.0.201:6379> LRANGE num 0 -1     # ここでの(-1)は右端の最初の要素を意味します
1) "2"
2) "1"
3) "0"
4) "3"
5) "4"


4.4、指定された要素の値を取得

右端の最初の値を取得:
192.168.0.201:6379> LINDEX num -1
"4"
左端の2番目の値を取得:
192.168.0.201:6379> LINDEX num -2
"3"

では-3はどうでしょうか?
192.168.0.201:6379> LINDEX num -3
"0"
これは右から数えて3番目の値です!!!!!

左から値を取得
192.168.0.201:6379> LINDEX num 0
"2"
192.168.0.201:6379> LINDEX num 1
"1"

両端からの操作で少し混乱します!両端から操作できる点に注意してください!!!

4.5、指定されたデータのみを保持

0から2のデータのみを保持
192.168.0.201:6379> LTRIM num 0 2
OK
結果を確認:
192.168.0.201:6379> LRANGE num 0 -1
1) "2"
2) "1"
3) "0"

これには何の使い道があるか:
ログを書く場合、このバッファは最近の100件のログのみを保持します!
例:
192.168.0.201:6379> LPUSH logs newloghehe
(integer) 1

192.168.0.201:6379> LTRIM num 0 99
OK

こうすることで、リストは常に100件しか持たず、最近の100件のログのみを見ることができます!!
  1. セット型
セットは高校で学びます。最初の学期で学んだ集合論ですね
交差点∩、和集合∪、差集合など 0 0 !

セットの要素には型がありません!
セット型が使われるアプリケーション:(新浪微博は多くのRedisアプリケーションを共有しています)
例えば、微博をフォローする場合、例えば私たちが共通して誰かをフォローしているかどうかなど。

5.1、
セットを追加
192.168.0.201:6379> SADD jihe1 a b c
(integer) 3

5.2、
セットの内容を確認
192.168.0.201:6379> SMEMBERS jihe1
1) "c"
2) "a"
3) "b"
5.3、セット内の要素の存在確認
192.168.0.201:6379> SISMEMBER jihe1 d
(integer) 0
192.168.0.201:6379> SISMEMBER jihe1 a
(integer) 1
0が返ると存在しない、1が返ると存在することを示します

5.4、セット間の演算
交差点、差集合、和集合をサポートします

差集合演算:
192.168.0.201:6379> SDIFF jihe1 jihe2
1) "a"
jihe1abcjihe2b cd

jihe1 から jihe2 を引く、同じb cを引くと、jihe1 にはaが残ります

同様に:
jihe2 から jihe1 を引く
192.168.0.201:6379> SDIFF jihe2 jihe1
1) "d"

差集合演算は複数設定できます

交差点演算:
 192.168.0.201:6379> SINTER jihe1 jihe2
1) "c"
2) "b"

交差点は複数設定できます:
jihe3を追加
192.168.0.201:6379> SADD jihe3 d e f
(integer) 3

192.168.0.201:6379> SINTER jihe1 jihe2 jihe3
(empty list or set)
# これはjihe1とjihe2の交差点演算を行い、その結果をjihe3と交差点演算するためです

和集合演算
192.168.0.201:6379> SUNION jihe1 jihe2
1) "a"
2) "c"
3) "b"
4) "d"
同様に複数設定できます


5.4、上記のセットは順序付けられていませんが、Redisは順序付けられたセットをサポートしており、その名前は以下の通りです
ZADD キー スコア メンバ 要素を追加
ZSCORE キー メンバ 要素のスコアを取得
ZRANGE キー 開始 終了 [WITHSCORES]
ZRANGEBYSCORE キー 最小値 最大値

順序付けられたセットを追加
192.168.0.201:6379> ZSCORE youxu 80 a
(nil)
192.168.0.201:6379> ZADD youxu 81 b
(integer) 1
複数追加できます
192.168.0.201:6379> ZADD youxu 82 c 83 d
(integer) 2

スコアを取得
192.168.0.201:6379> ZSCORE youxu a
"80"
192.168.0.201:6379> ZSCORE youxu b
"81"
192.168.0.201:6379> ZSCORE youxu c
"82"
192.168.0.201:6379> ZSCORE youxu d
"83"

順序付けられたセットの範囲を取得
192.168.0.201:6379> ZRANGE youxu 0 3   # リストセットの0 3を参照、0から3までの要素
1) "a"
2) "b"
3) "c"
4) "d"

別の例:
192.168.0.201:6379> ZADD youxu 79 e
(integer) 1

192.168.0.201:6379> ZRANGE youxu 0 4
1) "e"
2) "a"
3) "b"
4) "c"
5) "d
######eが先頭に来ています。そのスコアが小さいからです!
人気記事ランキングなど、この機能でソートできます。スコアを設定することができます!!!!!!

タグ: redis クラスタ データベース キーバリュー データ型

8月8日 12:46 投稿