あなたがマスターしているどのくらいのRedisの基礎?満たされたリークしますか?

Redisのは何ですか

Redisあるオープンメモリシステムに格納されたデータ構造、それはとして使用することができ、データベースキャッシュメッセージングミドルウェアそれは、次のようなデータ構造の複数の種類、サポートされていた文字列stringsハッシュ hashesリスト listsセット sets順序集合 sorted sets範囲クエリ、ビットマップ、hyperloglogsと地理空間(地理空間)半径指数クエリのを。

Redisまた、コピーが付属していますreplication()、LUAスクリプトLua scripting、LRU駆動イベント() LRU eviction()、(業務transactions )と永続ディスクの異なるレベルpersistence()、および(RedisのセンチネルによるSentinel)と自動パーティショニング(Cluster高可用性)high availability()。

ああ、はい、これはredis上記のプレゼンテーション、明確で簡潔な中国の公式サイト。

NoSQLのは何ですか

私たちは、それが知っているredis非リレーショナルデータベースですNoSQLそして、なぜそこにいますかNoSQLNoSQLそれは何ですか?

S単一のデータベース

小さなウェブサイトのトラフィックでは、トラフィック要求に対応するために十分なデータベースを使用します。

キャッシュ+スプリット

トラフィックの上昇に伴い、データベースは、私たちのニーズを満たすことができませんでした。高いパフォーマンスを得るために、我々は、バッファ層と作られたデータベースクラスタ、構造最適化及び個別の読み取りと書き込みとの中間にあります。

ここでのキャッシュがあるNoSQLもちろん、キャッシュを行う、唯一であるNoSQLように、一つの機能Redisのみの機能をキャッシュのこの種を持っていません。例えば、それは達成することができ、簡単なメッセージキューをセッション共有を解決するためカウンタリーダーボード友人関係に対処し、その機能上、我々が見ることができると、Redis私たちは今、それを学ぶことを可能にする非常に強力なツールです!

Redisの一般的なコマンド

まず、我々はの面でデータ型についての脇に置きRedis、共通のコマンド。

操作キーと値

Redisあるkey valueメモリキャッシュデータベースは、すべてのデータは、独自のキーを持っています。

ここでは、プレゼンテーションを容易にするために、私は、文字列関連の設定コマンドを使用しました

  • keys [pattern]要件すべてのキー出会いを取得します。時間の複雑さはされてO(n)いるため、一般的に、本番環境で使用されていないシングルスレッド実行時間のかかるタスクが他のタスクをブロックすることができます一般的に使用し、コマンドの代替(非ブロッキング)。Redisscan

  • dbsize 現在のデータの数を取得しますが格納されます。
  • exists key キーの存在かどうかを判断します
  • del key 指定されたデータを削除します
  • type key キーのデータ型を取得します。
  • rename key newkey 重命名

有効期限

Redis多くのデータがとして使用されているキャッシュデータ、およびに、キャッシュの有効期限を持っている必要がありRedis、非常に強力な提供する有効期限機能を設定します。

  • expire key seconds キーの有効期限を設定してください。
  • ttl key 、残り時間の正数を表すを返し、キーの残り時間を参照-1永久に、-2代表は期限切れまたは存在しません。

5つの基本的なデータ型のRedisの

上記では、私はたくさん言うRedisこれらに依存して達成するためによると、キャッシュとしては、カウンター、リーダーボード、友人、関係などの他の機能を達成するためRedisのデータ構造。全体でRedis5つの基本的なデータ構造の合計(一部の高度なデータ構造は、後に話すだろう)している、彼らは文字列stringsハッシュ hashesリスト listsコレクション sets順序集合 sorted sets

文字列の文字列

ほとんどのプログラミング言語で持っているStringデータベースがために、文字列型をRedis必要不可欠です。

  • set key value [設定]
  • get key キーの値を取得します。
  • mset key1 value1 key2 value2バッチとで配置された原子は、ネットワークの時間消費を削減するために使用することができます
  • mget key1 key2バッチ取得する原子は、ネットワークの時間消費を削減するために使用することができます
  • incr key 指定されたキーの値をインクリメント
  • decr key 指定されたキーの値をデクリメント
  • incrby key value インクリメント値を指定します。
  • decrby key value 指定された値をデクリメント
  • incrbyfloat key floatvalue増加指定浮動小数点演算は、最初のいくつかの実装のために使用することができるカウンター機能。
  • setnx key valueキーが存在しない場合、あなたは、正常に設定することができ、それ以外の場合は失敗します、プラス有効期限の制限、それは、分散Redisのロックを実装する方法である(後述します)
  • set key value xx フロントとは対照的に成功がある場合、設定され、そうでない場合(更新に相当する)フェイル
  • getset key newvalue 新しい値を設定して、以前の値を返します
  • append key value 追加コンテンツは、オリジナルコンテンツです
  • strlen key 文字列の長さを取得します。
  • getrange key start end コンテンツの指定した範囲を取得します。
  • setrange key index value コンテンツの設定指定した範囲
  • setex key seconds value 設定と有効期限を設定します
  • set key value ex seconds nxキーは設定値のために存在し、有効期限を設定し、しない分散ロック・実装

ハッシュ

実際には、我々は理解することができるhashように小さなRedisのRedisフードの下、そのJava中のHashMapほとんど全ての利用+リストアレイ達成するために、二次元構造。

違いはで、ということであるRedis辞書の値は文字列だけすることができますが、それらはrehash、同じではありませんRedisの使用プログレッシブ焼き直し

すべてのクエリがデータの移行前に完了するよう、2つのハッシュ辞書を照会しながら、古いものと新しいハッシュ辞書、データ移行の焼き直しが辞書の内容は、新しい辞書に移行少し古いとなります時にも保持されます新しい辞書は、辞書上の場所になります。

ここでは、上を見てhash基本的な操作。

  • hset key field value 辞書にキーの値を設定します。
  • hsetnx key field value 辞書にキーの値を設定します(存在しません)
  • hmset key field1 value1 field2 value2 ... バッチセット
  • hget key field 辞書にキーの値を取得します。
  • hmget key field1 field2 一括取得
  • hgetall key すべてを見ます
  • hdel key field キーを削除するには
  • hexists key field 決定するかどうかが
  • hlen key 辞書で指定されたキーに対応するストレージの数を取得します。
  • hvals key すべての値を返します。
  • hkeys key すべてのキーを返します。
  • hincrby key field increValue 値の値を増加させる(負を高めることができます)
  • hincrbyfloat key field floatValue 一定値(フロート)の値を増加させます

リスト

Redisリストに対応介して底部である(双方向リンクリスト)、リストそうするために、達成するためにすぐに挿入および削除操作が、インデックス位置決めが非常に遅いですJavaLinkedListlist

Redis数を提供するlistよう、事業示し他の操作は、完全な達成するためにそれらを使用することができ、スタックキューを

ここでは、上を見てlist基本的な操作。

  • lpush key item1 item2 item3... 左から描画
  • rpush key item1 item2 item3... 引出権
  • lpop key スタックから取り残さ
  • rpop key スタックの右アウト
  • lindex key index 注意して素子O(N)のインデックスを取得
  • lrange key start end 慎重にはO(n)の要素の指定された範囲を取得します
  • linsert key before|after item newitem 指定された要素の前にあるかの後ろに新しい要素を追加します。
  • lrem key count value 指定された値を削除する要素の数であります
    • カウント= 0:値の値のすべての要素を削除します
    • 数> 0:値の要素を削除カウント値に左から右へ
    • <0カウント:右からやる削除|数|値の値の要素と
  • ltrim key start end 指定された範囲内の要素の保持
  • lset key index newValue インデックスの値を更新
  • blpop key timeout 次いで、ブロッキング(タイムアウトは0手段永久の時間ブロッキングが指定されていません)
  • brpop key timeout次いで、ブロッキングは(タイムアウトが永久0手段の時間をブロック指定)の両方を実装するために使用することができない消費者の生産を

結論として、私たちが使用することができます左または右右スタックうちに達成するために、キューの左または右のうちに左とアウトを、左

  • lpush + LPOP =スタック
  • rpush + RPOP =スタック **
  • lpush + RPOP =キュー
  • rpush + LPOP =キュー
  • lpush / rpush + LTRIM =キャップされたリスト(固定長のリスト)
  • lpush + brpop =メッセージキュー(メッセージキュー)
  • rpush + blpop =メッセージキュー(メッセージキュー)

セットする

Redisset同等JavaHashSet要素を特徴とする(順不同のセット)、繰り返すことができないが、我々は重み関数のいくつかを達成するためにそれを使用することができます。我々はまた、いくつかのコレクションを持っている交差点で労働組合取るように異なるユーザ、共通の利益との間で、共通の友人を得ることができますし、他の操作を。

ここでは、上を見とるset基本的な操作のいくつかを。

  • sadd key value 要素を追加します
  • sdel key value 要素を削除するには
  • sismember key value コレクション内の要素かどうかを判断します
  • srandmember key count (構造セットに影響を与えない)の要素の指定された乱数を取得します。
  • spop key count ランダムポップアップ要素の集合から(破棄結合)
  • smembers key O中の全ての要素のコレクション(n)の複雑さを得ます
  • scard key コレクションの数を取得します
  • sinter set1 set2 ... 交差点のすべてのコレクションを取得します。
  • sdiff set1 set2 ... すべての違いセットコレクションを取得します。
  • sunion set1 set2 ... 労働組合のすべてのコレクションを取得します。

トークン

Redis順序集合は、ビデオ再生などのランキングは、そのような生徒の成績のランキングなど興味深い機能の多くを通してそれを達成することができます。zset

zsetそれは使用することですジャンプテーブルを我々が使用するために、連続した空間のことだけで、この配列を知って、達成するために、バイナリサーチの高速位置決めのために、しかし、リストではありません。(インデックス秩序のインサートを横断するジャンプ方法を使用して)多くの時間を保存するときに学生がジャンプテーブルがそれを詰め込むことができます理解していない場合は、リストを見つけるためにジャンプ台。

のは、上を見てみましょうzset基本的な操作のいくつかを。

  • zadd key score element 、並べ替えのためのスコアを追加し、値ジャンプテーブル以来、時間の複雑さはO(LOGN)で、ユニークが必要です。
  • zrem key element 素子O(1)時間の複雑さを削除します
  • zscore key element 要素のスコアを取得します。
  • zincrby key incrScore element 要素のスコアを増やします
  • zrange key start end [withscores]要素の指定された範囲に加えて、インデックスを取得withscoresスコアが返されたO(LOGN + m)の時間計算量
  • zrangebyscore key minScore maxScore [withscores]要素の指定された範囲を取得プラス画分はwithscores、スコアを返されたO(logN個+ m)の時間計算量
  • zcard key 長さの順序集合を取得します。

Redisのトランザクションとパイプ

パイプラインパイプライン

いくつかのシナリオでは米国操作の1つは、複数のコマンドを実行する必要があるかもしれませんが、我々はただ1回の転送コマンドをする場合には、時間がかかり、多くの無駄になるネットワークを指令するコマンドを実行した場合Redis、その後に実行行くと、それが減少しますオーバーヘッド多くの時間。しかし、そのノートpipeline命令がパイプラインに到達するためにそれを意味する、アトミックに実行されていないRedisサーバが他のコマンドに散在する可能性がある場合。

業務

リレーショナル・データベースは持っているACID機能をRedisA(原子)とI(アイソレーション)、D(持続性)が設定されているかどうかを確認することを保証するために、RDBまたはAOF 永続操作するので、しかし、保証一貫できないRedisトランザクションはロールバックをサポートしていません

我々は、単にとして理解することができるRedisだけ以上に取引Pipeline上記のように他のコマンドは、分割する、すなわち、よりアトミック操作ではありません。

  • multi トランザクションの開始をマーク

  • exec トランザクションの実行

  • discard クリアは、キュー内のすべてのコマンドの業務で、それは、トランザクション全体を持ち上げることです。

  • watch key あなたは、この要素の値は、トランザクションのコミット時に他のクライアントに変更された発見した場合、トランザクションの開始前に、要素の監視、トランザクションは失敗します。

  • unwatch key リフト監視

Redisの一般的なコマンドの概要

以下のためまあ、これは、この記事の内容全体でRedisあなたが忘れたり、実行する方法を学んだことがありませんか?

記事の助けあなたは、ああ私に賞賛をお願いした場合は(#^。^#)

Redis興味が(#^。^#)私に従うことができる場合は、次の記事で私は、書き込まれます。

おすすめ

転載: juejin.im/post/5dc4c5ef5188252af967afd7