Redis:30分入門から精通まで-1 P

5489 ワード

作者はすごいですね.私が知らない彼は全部知っています.
Redis: Zero to Master in 30 minutes - Part 1
もう一度言って、あなたが本当のプログラマーなら、30分でRedisに精通できると思います.これはRedisがどれだけ牛を追い詰めているかを十分に証明し,どれだけ明らかな簡単さであるかを示している.しかし、あなたのレベルでは、本当に30分以内にRedisに精通できると思いますか?へへへへへへへ~~
君には不服だ,やってみなさい.この章ではRedisとは何かを話します.次の章では簡単な例を示します.まぁ、残り時間は、遊びながら.
Redisの概要
Redisは通常1つの「キーストレージエンジン」、そうですね.そうですね.でも、分かりにくいですね.はい、データ構造エンジンとして見たほうが分かりやすいと思います.どう言えば、Redisは5つの異なる要素をサポートしています.この5つの異なる要素を収集すれば、何も起こりません.strings、hashes、lists、sets、ordered sets.それぞれデータ構造には、その特徴とサポートされている命令があります.どちらのタイプも、KeyでValueにアクセスします.Keyはbyte array形式で保存されているので複雑ですが、あなたのレベルではstringで保存されることが多いと思います.
それぞれのタイプを見てみましょう.
Strings:
Stringsは5つの要素の中で最も簡単で、同時に最も有名ではありません.ええ、例えばあなたが「String」と言ったら、人はあなたが何を言いたいのか分かりません.あるいは、「Single」あるいは「Simple」と言って、もっと理解しやすいです.Redisといえば、キーの値が合っているとき、String構造が考えられます(覚えておいてください.5分の1だけです).Keyのように、StringのValueは任意のバイト配列であってもよい.成長したIntegerカウンタ、または実際の文字列、またはシーケンス化されたオブジェクト(blob)を保存するために使用できます.これらはすべて一般的で、最も一般的な文字列操作はGETとSETです.
<!-- lang: js -->
SET pages:about "about us"
GET pages:about
about us

もちろん、他にも多くのコマンド(INCRやGETRANGEなど)があり、数字を文字列に保存するだけでなく、String構造でユーザーを保存することもできます.KeyはユーザーのEmailであり、Valueはシーケンス化されたユーザーオブジェクトです.
Hashes
Hash構造は、あなたが考えているように(hash/dictionary).処理するときは、Key(たとえばString構造)を直接操作するのではなく、Keyのフィールドです.したがって、get/setのハッシュ値だけでなく、get/setのハッシュフィールドです.
<!-- lang: js -->
HSET goku power 9001
HGET goku power
9001

Redisの他の部分と同様に,フィールドと値の最終形態はバイト配列であるため,任意のものであってもよい.キーなどのフィールドは、一般的に文字列です.私はあなたが今頭の中できっと考えていると思います.私は体操をして、文字列と何か違いがあります.よく考えた!例えば、次の2つの違いは何ですか?(jsonで複雑な値を表し、バイト配列にシーケンス化することができます.)
<!-- lang: js -->
SET users:goku {race: 'sayan', power: 9001}
HSET users:goku race sayan
HSET users:goku power 9001

うん、違いはこれからどうやって遊ぶつもりなのかということです.単一のフィールドを制御する必要があり、オブジェクト全体をアプリケーションに入れたくない場合は、ハッシュを使用します.そうしないと、文字列を使用してもいいです.
Lists
Listsは、値のセットをキーに関連付けるようにします.実際には、彼らを動的な配列と考えることができます.挿入(insert)、追加(append)、弾(pop)、プッシュ(push)、絞め(trim)、うん、などの手段で遊ぶことができます.Redisは二次インデックスをサポートしていません.配列のKeyにアクセスして空白を埋めることができます(もちろんこれも唯一の用途ではありません).
<!-- lang: js -->
length = redis.lpush('users:newest', 'user:goku')
if length > 100
  #trim is to we only keep 100 "newest" users
  redis.rpop('users:newest')
end

上のコードは、リストに最新の登録ユーザーの参照を維持します.ここではリストの長さをリアルタイムで維持し、バックグラウンドに残すことができます.どうすればいいですか.
<!-- lang: js -->
# get the 10 newest users
keys = redis.lrange('users:newest', 0, 10)
#multi get the actual 10 user objects
redis.mget(*keys)

従来、開発者はこのような複数回のクエリーを避けるべきである.しかしRedis、これはよくあります.超高速です(すべてのものがメモリにあるからです).
Sets
SetとListの差は多くありませんが、SetはSetです(重複値は許されません).2つのSetを比較したり、SDIFFを使ったり、組み合わせたりすることで、直接戻るのではなく別のSetに結果を保存したい場合は、SUNNIONSTOREを使ったりすることができます.Setは、モーメンツとラベルを追跡するためにも使用できます.
<!-- lang: js -->
SADD friends:leto ghanima
SADD friends:leto duncan
SADD friends:paul duncan
SADD friends:paul gurney
SINTER friends:leto friends:paul
1) "duncan"

Sorted Sets
通常、1つのデータ構造が他のデータ構造よりも強いとは言わない.もともと需要を独立して解決しているからだ.でもSoted Setは本当にすごいですね.Sorted SetとSetは似ていますが、その値はソートウェイトに関連付けられています.つまり、Sorted Setに値を追加すると、重みを指定してどこに挿入するかを決めることができます.たとえば、前の例では、データに重みを付けることができます.
<!-- lang: js -->
ZADD friends:leto 1000 ghanima
ZADD friends:leto 994 duncan
ZADD friends:leto 2 farad'n
ZRANGEBYSCORE friends:leto 500 1000
1) "duncan"
2) "ghanima"

上記の例では、500-1000の重みを持つ友人データを取得しました.
Sorted setはもちろんモーメンツだけでなく、重み属性は時間系列(例えば1970年から現在までのミリ秒で重みを作る)に使用することができます.あるいは、例えば私はプレイヤーのゲームスコアで彼らをソートします.
Redisクエリ
Redisでは、そのkeyでのみデータをクエリーできます.すぐにHashを使って、私たちも言えません:ねえ、そのraceフィールドをsayanのkeysに等しくしてください.リストを見てみましょう.私たちはどのように私たちの2級インデックスを作成しましたか.あなたの2級インデックスを管理するのは苦痛で、時には拡張しにくいこともあります.しかし、ここには2つのことを覚えなければならない.まず、簡単でも複雑なシーンでも、決める前に、まず遊びをしなければなりません.大したことはありません.数分もかかりません.第二に、don't get hung up with hitting Redis multiple times.
5つの構造に加えて、RedisにはすべてのKeyのコマンド(いわゆるkey-commands)が便利である.例えばDEL、EXISTS、RENAME.KEYSコマンドが一番よく使われるかもしれませんが、keysに戻ります.例えば、mogade.comは日常のランキングをkeysで保存しています.ranks:daily:GAME_ID:20110830.もし私が8月のデータを全部削除したいなら、私は:
<!-- lang: js -->
keys = redis.keys("ranks:daily:*:201108*")
redis.del(*keys)

注意:keysコマンドは、一致する値を検索するためにすべてのkeysを巡回します.これはとても遅いです.ドキュメントは、デバッグまたは開発時にのみ使用することをお勧めします.
補足
Redisはインストールとメンテナンスが非常に容易で、データはハードディスクに単一のファイル形式で保存され、バックアップするときにコピーすればいいです.簡単なプロファイルだけで駆動できます.
あなたのすべてのデータはメモリに格納するのに適しているはずです.仮想メモリをサポートしていますが、失敗したように見えます.それは時代遅れで、将来機能から削除されるかもしれません.
Redisはmaster-slave replicationをサポートします.しかし、自動失効バックアップはサポートされず、いかなる形式のスライスもしません.HAProxyなど、自分でやる必要があります.Redis Clusterはこれらを補充すると言われていますが、すぐに初期リリース版を見ることができるはずです.(興味があれば、ここから見つけることができます).
Redisには素晴らしい特性がたくさんあります.たとえば、トランザクションをサポートし、多くのコマンド、多くの管理機能、Keyが自動的に実現したり、APIを購読したりすることができます.私のこのような文句を言う目で、私もRedisドキュメントと参考ドキュメントに感心しました.
いつRedisを使いますか.
Redisは他の多くのストレージソリューションよりも専門的です.複雑なシステムでの正しい開き方は機能特性によって区分され,システム全体を考慮する必要はない.すべてのものをメモリに捨てるように要求されていますが、多少は気分が悪くなります.しかし、適切な機能に適切なモデルを与えると、絶対に爽やかになります.Redisは超高速でAPIは死ぬまで簡単です.私はすでに数百行のクエリーコードをいくつかのパラメータだけの方法に変えました.
最後に、もう一度言って、Redisは簡単に爆発して、あなたが1つの問題に直面する時、超簡単に判断して、Redisを使うのに適しているかどうか.適用される場合もあれば適用されない場合もあります.
結論
Redisを単純にキー値記憶と見なすのは間違っており,これよりずっと追い詰められている.つまり、データモデルを異なる方法で考えるべきです.時には役に立たないこともありますが、いったん使えば...爽やかです.君は段誉の六脉神剣だと思っているのか.
おしっこを撒くべきかも?Redisのサイトを見てみましょうか?oh、Part 2を始めましょう.