Redisの紹介:
Redisは完全にオープンソースで無料であり、BSDプロトコルに準拠しており、高性能のキー値データベースです。
Redis
完全な名前は、リモート辞書サーバである、それは开源的
高性能NoSQL
、それはとして使用することができ、データベース数据库
、缓存
および消息队列
。
Redisおよびその他のキー値キャッシング製品には、次の3つの特性があります。
- Redisは、データの永続性をサポートしています。これにより、データをディスクのメモリに保存し、再起動時に使用できるように再度ロードできます。
- Redisは、単純なキー値タイプのデータをサポートするだけでなく、リスト、セット、zset、ハッシュ、およびその他のデータ構造のストレージも提供します。
- Redisは、データバックアップ、つまりマスタースレーブモードでのデータバックアップをサポートしています。
Redisの利点:
- 非常に高いパフォーマンス-Redisは110,000回/秒で読み取り、81,000回/秒で書き込みます。
- 豊富なデータタイプ-Redisは、バイナリケースの文字列、リスト、ハッシュ、セット、および順序付きセットのデータタイプ操作をサポートしています。
- アトミシティ-すべてのRedis操作はアトミックです。つまり、正常に実行されるか、失敗した場合はまったく実行されません。単一の操作はアトミックです。複数の操作は、トランザクション、つまり、MULTIおよびEXEC命令によってパッケージ化されたアトミック性もサポートします。
- その他の機能-Redisは、公開/サブスクライブ通知、キーの有効期限、およびその他の機能もサポートしています。
NoSQL
NoSQLの最も一般的な説明は、 non-relational
非リレーショナルデータベースです。これは、Not Only SQL
SQLだけではないということもあり ます。NoSQLは単なる概念です。非リレーショナルデータベースを指します。リレーショナルデータベースとは異なり、リレーショナルデータのACID特性を保証するものではありません。 。ACIDは
- (原子性)原子性
- C(一貫性)一貫性
- 私(孤立)の独立
- D(耐久性)
Redisは、キーと値のペアの複数のデータタイプを提供することにより、さまざまなシナリオのストレージ要件に適応します。
Redisデータタイプと主なアプリケーションシナリオ:
上記の表の解釈の一部について:
- 圧縮リストは、リストキーとハッシュキーの基本的な実装の1つです。
リストキーに含まれるリストアイテムの数が少なく、各リストアイテムが小さい整数または短い文字列の場合、Redisはリストキーの基礎となる実装として圧縮リストを使用します。 - 整数セットは、セットキーの基礎となる実装の1つです。セットに整数値要素のみが含まれ、このセットの要素数が少ない場合、Redisは整数セットをセットキーの基礎となる実装として使用します。
字符串 - strings
文字列は、Redisで最も単純なデータ型であり、 Memcached
同じ型です。キーは値に対応します。このキーと値の対応方法は、キーと値のペアと呼ばれます。文字列は、HTMLフラグメントやWebページのキャッシュなど、多くの例で役立ちます。
集合 - set
セットとは、数学のセットの概念に似たセットであり、セットの操作には、要素の追加と削除、複数のセットの交差や減算などの操作が含まれます。操作のキーは、コレクションの名前として理解されます。
散列 - hash
ハッシュは、キーと値(key => value)のペアのコレクションであり、フィールドと文字列タイプの値の間のマッピングテーブルです。ハッシュは、オブジェクトの格納に特に適しています。
列表 - list
Redisリストは、挿入順にソートされた文字列の単純なリストです。リストの先頭(左)または末尾(右)に要素を追加できます。リストタイプは、複数のプログラム間のメッセージ交換を完了するために、メッセージキューのサービスでよく使用されます。
有序集合 - zset
Redis zsetも、setと同様に、文字列タイプの要素のコレクションであり、重複するメンバーは許可されていません。セットの順序付けられた繰り返しのないリストが必要な場合は、ソートされたセットのデータ構造を選択できます。
アプリケーションシナリオ:
Redisのアプリケーションシナリオには、キャッシュシステム(「ホット」データ:高周波読み取り、低周波書き込み)、カウンター、メッセージキューシステム、リーダーボード、ソーシャルネットワーク、およびリアルタイムシステムが含まれます。
[画像のアップロードに失敗しました...(image-2d6283-1606379864088)]
Redisの一般的なコマンド
一般的な管理コマンド
1.Redisを起動します
> redis-server [--port 6379]
コマンドパラメータが多すぎる場合は、構成ファイルからRedisを起動することをお勧めします。
> redis-server [xx/xx/redis.conf]
6379はRedisのデフォルトのポート番号です。
2.Redisに接続します
> ./redis-cli [-h 127.0.0.1 -p 6379]
3.Redisを停止します
> redis-cli shutdown
> kill redis-pid
上記の2つのstopRedisコマンドは同じ効果があります。
4.コマンドを送信します
Redisにコマンドを送信する方法は2つあります。
1. Redis-cliは、次のようなパラメーターで実行されます。
> redis-cli shutdown
not connected>
デフォルトでは、ローカルポート6379に送信されます。
2. Redis-cliは、次のようなパラメーターなしで実行されます。
> ./redis-cli
127.0.0.1:6379> shutdown
not connected>
5.接続をテストします
127.0.0.1:6379> ping
PONG
キー操作コマンド
すべてのキーを取得
構文:キーパターン
127.0.0.1:6379> keys *
1) "javastack"
- *ワイルドカードを意味します。これは任意の文字を意味し、すべてのキーをトラバースしてすべてのキーリストを表示します。時間の複雑さはO(n)であり、実稼働環境での使用はお勧めしません。
キーの総数を取得します
構文:dbsize
127.0.0.1:6379> dbsize
(integer) 6
キーの総数を取得する場合、すべてのキーをトラバースするのではなく、内部変数を直接取得します。時間の複雑さはO(1)です。
キーが存在するかどうかを確認します
语法:存在する鍵[鍵…]
127.0.0.1:6379> exists javastack java
(integer) 2
複数のクエリをクエリし、既存のクエリの数を返します。
キーを削除
構文:del key [key…]
127.0.0.1:6379> del java javastack
(integer) 1
複数を削除して、成功した削除の数を返すことができます。
クエリキータイプ
構文:タイプキー
127.0.0.1:6379> type javastack
string
キーを移動
構文:move key db
javastackをデータベースNo.2に移動するなど。
127.0.0.1:6379> move javastack 2
(integer) 1
127.0.0.1:6379> select 2
OK
127.0.0.1:6379[2]> keys *
1) "javastack"
キーのライフサイクル(秒)を照会する
2番目の構文:ttl
キーミリ秒の構文:pttlキー
127.0.0.1:6379[2]> ttl javastack
(integer) -1
-1:期限切れになることはありません。
有効期限を設定する
秒構文:expireキー秒
ミリ秒構文:pexpireキーミリ秒
127.0.0.1:6379[2]> expire javastack 60
(integer) 1
127.0.0.1:6379[2]> ttl javastack
(integer) 55
設定が期限切れになることはありません
構文:永続キー
127.0.0.1:6379[2]> persist javastack
(integer) 1
キー名を変更する
構文:キーの名前を変更しますnewkey
127.0.0.1:6379[2]> rename javastack javastack123
OK
文字列操作コマンド
文字列はRedisの最も基本的なデータタイプです。1つのデータに保存できる最大スペースは512Mです。
キー値を保存する
構文:キー値の設定[EX秒] [PXミリ秒] [NX | XX]
nx:キーが存在しない場合は作成、xx:キーが存在する場合は値を変更するか、setnx / setexコマンドを直接使用します。
127.0.0.1:6379> set javastack 666
OK
キー値を取得する
構文:get key
127.0.0.1:6379[2]> get javastack
"666"
値の増分/減分
文字列の値が数値タイプの場合は、incrコマンドを使用して毎回インクリメントできます。数値でない場合は、エラーが報告されます。
構文:incr key
127.0.0.1:6379[2]> incr javastack
(integer) 667
一度にNをインクリメントする場合は、incrbyコマンドを使用します。浮動小数点データの場合は、incrbyfloatコマンドを使用してインクリメントできます。
同様に、decrとdecrbyコマンドを使用してデクリメントします。
キー値の一括保存
语法:msetキー値[キー値…]
127.0.0.1:6379[2]> mset java1 1 java2 2 java3 3
OK
キー値を取得する
構文:mget key [key…]
127.0.0.1:6379[2]> mget java1 java2
1) "1"
2) "2"
RedisはUTF-8エンコーディングを受け取ります。中国語の場合、中国語の文字は3桁を占めて戻ります。
値の長さを取得する
構文:strlen key
127.0.0.1:6379 [2]> strlen javastack
(integer)3
追加内容
構文:キー値を追加
127.0.0.1:6379[2]> append javastack hi
(integer) 5
上記のコマンドは666から666hiまで実行されるため、キー値の末尾に追加します
いくつかの文字を取得します
構文:getrange key start end
> 127.0.0.1:6379[2]> getrange javastack 0 4
"javas"
操作コマンドの設定
コレクションタイプはリストタイプと似ていますが、コレクションが順序付けられておらず、繰り返しできない点が異なります。
セットする
保存値
構文:悲しいキーメンバー[メンバー…]
// 这里有8个值(2个java),只存了7个
127.0.0.1:6379> sadd langs java php c++ go ruby python kotlin java
(integer) 7
要素を取得
すべての要素の構文を取得します:smembers key
127.0.0.1:6379> smembers langs
1) "php"
2) "kotlin"
3) "c++"
4) "go"
5) "ruby"
6) "python"
7) "java"
ランダムアクセス構文:srandmember langs count
127.0.0.1:6379> srandmember langs 3
1) "c++"
2) "java"
3) "php"
コレクションに要素があるかどうかを確認します
構文:sismemberキーメンバー
127.0.0.1:6379> sismember langs go
(integer) 1
コレクション要素の数を取得します
構文:スカーキー
127.0.0.1:6379> scard langs
(integer) 7
コレクション要素を削除する
構文:srem key member [member…]
127.0.0.1:6379> srem langs ruby kotlin
(integer) 2
ポップアップ要素
構文:spop key [count]
127.0.0.1:6379> spop langs 2
1) "go"
2) "java"
注文セット
リストとの違い:
1.リストは、リンクされたリストを使用して実装されます。リンクされたリストは、両端が高速で、中央が低速です。順序付けられたコレクションは、ハッシュテーブルとジャンプテーブルによって実現されます。中央の要素が読み取られても、より高速です。
2.リストは要素の位置を調整できませんが、順序付けられたコレクションは調整できます。
3.順序付けられたコレクションは、リストよりも多くのメモリを消費します。
保存値
構文:zaddキー[NX | XX] [CH] [INCR]スコアメンバー[スコアメンバー…]
127.0.0.1:6379> zadd footCounts 16011 tid 20082 huny 2893 nosy
(integer) 3
要素スコアを取得する
構文:zscoreキーメンバー
127.0.0.1:6379> zscore footCounts tid
"16011"
ランキング範囲ランキング構文を取得します:zrange key start stop [WITHSCORES]
// 获取所有,没有分数
127.0.0.1:6379> zrange footCounts 0 -1
1) "nosy"
2) "tid"
3) "huny"
// 获取所有及分数
127.0.0.1:6379> zrange footCounts 0 -1 Withscores
1) "nosy"
2) "2893"
3) "tid"
4) "16011"
5) "huny"
6) "20082"
指定されたスコア範囲のランキング構文を取得します。zrangebyscorekeyminmax [WITHSCORES] [LIMIT offset count]
127.0.0.1:6379> zrangebyscore footCounts 3000 30000 withscores limit 0 1
1) "tid"
2) "16011"
指定された要素のスコアを上げる
構文:zincrbyキー増分メンバー
127.0.0.1:6379> zincrby footCounts 2000 tid
"18011"
コレクション要素の数を取得します
構文:zcardキー
127.0.0.1:6379> zcard footCounts
(integer) 3
指定された範囲内のポイント数を取得します
構文:zcount key min max
127.0.0.1:6379> zcount footCounts 2000 20000
(integer) 2
指定した要素を削除します
構文:zrem key member [member…]
127.0.0.1:6379> zrem footCounts huny
(integer) 1
要素のランキングを取得する
構文:zrankキーメンバー
127.0.0.1:6379> zrank footCounts tid
(integer) 1
操作コマンドの一覧表示
リストタイプは、フィールド文字列の順序付きリストです。内部は、二重にリンクされたリストを使用して実装されます。すべての要素を両端で操作できます。両端でデータを取得する速度は速く、インデックスを使用して特定の行を見つけるのは遅くなります。
リストタイプの要素は順序付けられており、繰り返し可能です。
保存値
左側の保存された値の構文:lpush key value [value…]
127.0.0.1:6379> lpush list lily sandy
(integer) 2
右側に値を格納するための構文:rpush key value [value…]
127.0.0.1:6379> rpush list tom kitty
(integer) 4
インデックスストレージ値の構文:lsetキーインデックス値
127.0.0.1:6379> lset list 3 uto
OK
ポップアップ要素
左側のポップアップ構文:lpopキー
127.0.0.1:6379> lpop list
"sandy"
右側のポップアップ構文:rpopキー
127.0.0.1:6379> rpop list
"kitty"
要素の数を取得します
構文:llen key
127.0.0.1:6379> llen list
(integer) 2
リスト要素を取得する
両側の構文を取得します:lrange key start stop
127.0.0.1:6379> lpush users tom kitty land pony jack maddy
(integer) 6
127.0.0.1:6379> lrange users 0 3
1) "maddy"
2) "jack"
3) "pony"
4) "land"
// 获取所有
127.0.0.1:6379> lrange users 0 -1
1) "maddy"
2) "jack"
3) "pony"
4) "land"
5) "kitty"
6) "tom"
// 从右端索引
127.0.0.1:6379> lrange users -3 -1
1) "land"
2) "kitty"
3) "tom"
インデックス取得構文:lindexキーインデックス
127.0.0.1:6379> lindex list 2
"ketty"
// 从右端获取
127.0.0.1:6379> lindex list -5
"sady"
要素を削除
値による構文の削除:lrem key count value
127.0.0.1:6379> lpush userids 111 222 111 222 222 333 222 222
(integer) 8
// count=0 删除所有
127.0.0.1:6379> lrem userids 0 111
(integer) 2
// count > 0 从左端删除前count个
127.0.0.1:6379> lrem userids 3 222
(integer) 3
// count < 0 从右端删除前count个
127.0.0.1:6379> lrem userids -3 222
(integer) 2
範囲削除構文:ltrim key start stop
// 只保留2-4之间的元素
127.0.0.1:6379> ltrim list 2 4
OK
ハッシュ操作コマンド
redis文字列タイプのキーと値は辞書構造の形式であり、ここでのハッシュタイプの値は辞書構造にすることもできます。
キー値を保存する
単一の構文:hsetキーフィールド値
127.0.0.1:6379> hset user name javastack
(integer) 1
複数の構文:hmsetキーフィールド値[フィールド値…]
127.0.0.1:6379> hmset user name javastack age 20 address china
OK
存在しない場合の構文:hsetnxキーフィールド値
127.0.0.1:6379> hsetnx user tall 180
(integer) 0
フィールド値を取得する
単一の構文:hgetキーフィールド
127.0.0.1:6379> hget user age
"20"
複数の構文:hmgetキーフィールド[フィールド…]
127.0.0.1:6379> hmget user name age address
1) "javastack"
2) "20"
3) "china"
すべてのキーと値を取得する構文:hgetall key
127.0.0.1:6379> hgetall user
1) "name"
2) "javastack"
3) "age"
4) "20"
5) "address"
6) "china"
すべてのフィールド構文を取得します:hkeys key
127.0.0.1:6379> hkeys user
1) "name"
2) "address"
3) "tall"
4) "age"
すべての値を取得構文:hvalsキー
127.0.0.1:6379> hvals user
1) "javastack"
2) "china"
3) "170"
4) "20"
フィールドが存在するかどうかを確認します
语法:hexistsキーフィールド
127.0.0.1:6379> hexists user address
(integer) 1
フィールド数を取得する
構文:hlen key
127.0.0.1:6379> hlen user
(integer) 4
増減
语法:hincrbyキーフィールド増分
127.0.0.1:6379> hincrby user tall -10
(integer) 170
フィールドを削除
语法:hdelキーフィールド[フィールド…]
127.0.0.1:6379> hdel user age
(integer) 1
Redisのインストール
Redisは、Linux、OS X、BSDなどのPOSIXシステムへのインストールをサポートし、Windowsへのインストール、およびWindowsとLinuxへのインストールもサポートします。
事務
Redisトランザクションは一度に複数のコマンドを実行でき、サーバーはコマンドの実行中に他のクライアントコマンドを実行しません。
トランザクション内の複数のコマンドが1つずつではなく、一度にサーバーに送信されます。この方法はパイプライニングと呼ばれ、クライアントとサーバー間のネットワーク通信の数を減らしてパフォーマンスを向上させることができます。
Redisトランザクションを実装する最も簡単な方法は、MULTIコマンドとEXECコマンドを使用してトランザクション操作を囲むことです。
- バッチ操作は、EXECコマンドを送信する前にキューバッファーに入れられます。
- EXECコマンドを受信すると、トランザクション実行に入ります。トランザクション内のコマンドは実行に失敗し、残りのコマンドは引き続き実行されます。言い換えると、Redisトランザクションはアトミック性を保証しません。
- トランザクション実行プロセス中、他のクライアントから送信されたコマンド要求は、トランザクション実行コマンドシーケンスに挿入されません。
トランザクションは、開始から実行まで、次の3つの段階を経ます。
- ビジネスを開始します。
- チームに参加するように命令します。
- 事務を実行します。
インスタンス
トランザクションの例を次に示します。最初にMULTI でトランザクションを 開始し、次に複数のコマンドをトランザクションにエンキューし、最後に EXEC コマンドでトランザクションをトリガーし、トランザクション内のすべてのコマンドを一緒に実行します。
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED
redis 127.0.0.1:6379> GET book-name
QUEUED
redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED
redis 127.0.0.1:6379> SMEMBERS tag
QUEUED
redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
2) "C++"
3) "Programming"
単一のRedisコマンドの実行はアトミックですが、Redisはトランザクションのアトミック性を維持するメカニズムを追加しないため、Redisトランザクションの実行はアトミックではありません。
トランザクションはパッケージ化されたバッチ実行スクリプトとして理解できますが、バッチ命令はアトミック操作ではありません。途中で命令が失敗しても、前の命令がロールバックされたり、後続の命令が失敗したりすることはありません。
「トランザクションに関するredisドキュメントから:
コマンドが失敗した場合でも、キュー内の他のすべてのコマンドが処理されることに注意することが重要です。Redisはコマンドの処理を停止しません。
といった:
redis 127.0.0.1:7000> multi
OK
redis 127.0.0.1:7000> set a aaa
QUEUED
redis 127.0.0.1:7000> set b bbb
QUEUED
redis 127.0.0.1:7000> set c ccc
QUEUED
redis 127.0.0.1:7000> exec
1) OK
2) OK
3) OK
set b bbbで失敗した場合、set aはロールバックせずに成功し、setcは実行を継続します。
Redisトランザクションコマンド
次の表に、redisトランザクションに関連するコマンドを示します。
シーケンス番号コマンドと説明1DISCARD はトランザクションをキャンセルし、トランザクションブロック内のすべてのコマンドを破棄します。2 EXEC は、トランザクションブロック内のすべてのコマンドを実行します。3 MULTI は、トランザクションブロックの開始を示します。4 UNWATCH は、WATCHコマンドによるすべてのキーの監視をキャンセルします。5 WATCHキー[キー…] 1つ(または複数)のキーを監視します。トランザクションが実行される前にこの(またはこれらの)キーが他のコマンドによって変更された場合、トランザクションは中断されます。
持久化
Redisはメモリ内データベースです。電源障害後にデータが失われないようにするには、メモリ内のデータをハードディスクに保持する必要があります。
RDB 持久化
すべてのデータをハードディスクの特定の場所に保存します。
スナップショットを別のサーバーにコピーして、同じデータでサーバーコピーを作成できます。
システムに障害が発生すると、最後のスナップショットが作成された後のデータが失われます。
データ量が多いと、スナップショットの保存に時間がかかります。
AOFの永続性
AOFファイルの最後に書き込みコマンドを追加します(ファイルのみを追加します)。
AOF永続性を使用するに は、同期オプションを設定して、ディスクファイルにコマンドを書き込むタイミングを確保する必要があります。これは、ファイルへの書き込みがコンテンツをディスクにすぐに同期するのではなく、最初にコンテンツをバッファに保存し、次にオペレーティングシステムがディスクに同期するタイミングを決定するためです。
オプションの同期頻度は常にすべての書き込みコマンドを同期しますeyeysecは1秒に1回同期しますnoオペレーティングシステムに同期するタイミングを決定させません
- alwaysオプションを使用すると、サーバーのパフォーマンスが大幅に低下します
- everysecオプションの方が適切です。これにより、システムがクラッシュしたときに1秒のデータのみが失われ、Redisはサーバーにほとんど影響を与えることなく1秒に1回同期を実行します。
- noオプションを使用しても、サーバーのパフォーマンスはそれほど向上せず、システムがクラッシュしたときのデータ損失量が増加します。
サーバーの書き込み要求が増えると、AOFファイルはどんどん大きくなります。Redisは、AOFを書き換える機能を提供します。これにより、AOFファイル内の冗長な書き込みコマンドを削除できます。
コピー
slaveof host portコマンドを使用して、あるサーバーを別のサーバーのスレーブにします。
スレーブサーバーはマスターサーバーを1つだけ持つことができ、マスターマスターレプリケーションはサポートされていません。
接続プロセス
- マスターサーバーはスナップショットファイル、つまりRDBファイルを作成し、それをスレーブサーバーに送信し、送信中に実行された書き込みコマンドを記録するためにバッファーを使用します。スナップショットファイルが送信されると、サーバーからバッファーに格納されている書き込みコマンドの送信が開始されます。
- スレーブサーバーはすべての古いデータを破棄し、マスターサーバーから送信されたスナップショットファイルをロードします。その後、スレーブサーバーはマスターサーバーから送信された書き込みコマンドの受け入れを開始します。
- マスターサーバーは書き込みコマンドを実行するたびに、同じ書き込みコマンドをスレーブサーバーに送信します。
マスタースレーブチェーン
負荷が上昇し続けると、マスターサーバーがすべてのスレーブサーバーをすばやく更新できないか、スレーブサーバーを再接続して再同期すると、システムが過負荷になります。この問題を解決するために、プライマリサーバーのレプリケーション作業を共有する中間レイヤーを作成できます。中間層のサーバーは、最上位サーバーのスレーブサーバーであり、最下位サーバーのマスターサーバーです。
歩哨
Sentinelはクラスター内のサーバーを監視し、マスターサーバーがオフラインになると、スレーブサーバーから新しいマスターサーバーを自動的に選択できます。
断片化
シャーディングは、データを複数の部分に分割する方法であり、データを複数のマシンに保存できます。この方法では、特定の問題を解決するときに線形パフォーマンスを向上させることができます。
4つのRedisインスタンスR0、R1、R2、R3があり、ユーザーuser:1、user:2、…を表す多くのキーがあるとすると、指定したキーを格納するインスタンスを選択するさまざまな方法があります。
- 最も単純なのは範囲スライスです。たとえば、0〜1000のユーザーIDはインスタンスR0に格納され、1001〜2000のユーザーIDはインスタンスR1に格納されます。ただし、マッピング範囲テーブルの保守が必要であり、保守作業に費用がかかります。
- もう1つはハッシュの断片化です。CRC32ハッシュ関数を使用してキーを数値に変換してから、インスタンスの数をモジュロして、格納されているインスタンスを認識します。
フラグメンテーションが実行される場所に応じて、3つのフラグメンテーション方法に分けることができます。
- クライアントの断片化:クライアントは、一貫性のあるハッシュなどのアルゴリズムを使用して、分散するノードを決定します。
- エージェントの断片化:クライアントの要求がエージェントに送信され、エージェントはそれを正しいノードに転送します。
- サーバーの断片化:Redisクラスター。