Redisの戦闘|詳細5つの忠Redisのデータ型

私たちは、RedisのはRedisのは、より広範な利用シナリオを持っています豊富なデータ型を、提供することである実際には、別の利点があり、それが知られているので、Redisのは非常に主流KVデータベース、高性能な読み書き能力であることを知っています。ユーザーが利用できるRedisのデータ型は、それを持っていることは何?あります:文字列(文字列)、リスト(リスト)、セット(セット)、ハッシュ(ハッシュ)、ZSET(順序集合)、HyperLogLogsは(データ構造の計算ベース)は、ストリーム(のRedis 5.0が提供します使用されるログ構造をモデル化し、新たなデータタイプ)。

データ型は、データがRedisの値を入力し、Redisのキータイプは常に文字列であることに留意されたいです。

この記事では、最も一般的なデータ型の5種類を使用した最初の5つ、を見て詳しいです。Redisの残りの2種類は、公式ウェブサイト(redis.io)次についての自分自身を知らせる上に置くことができます。また、Redisのは、すでにコンテンツを尋ねますJavaプログラマのインタビューですが、“Redis有哪些数据类型?”それは面接の口は、基本的な問題が来ています。でも、これが最初の質問されていない可能性がある場合、それは基本的に、これはクールされているRedisのです。

文字列|文字列型

Redisの文字列型は、文字列、整数または浮動小数点数を記憶することができます。記憶装置は、整数または浮動小数点数だけでなく、増減操作を実行する場合。

そして、バイナリ文字列型が安全であるRedisの、それは絵バイトストリームのように、そのようなシリアル化されたオブジェクトなどの任意のデータを含めることができます。しかし、サイズは-512Mの上限によって保存されています

ここでは、バイナリセキュリティへの影響を説明するには:シンプルが、解決フラグビット(C言語\ 0)の特定の文字列に基づいていない、入力されているものに関係なくは、常に出力は、元の入力処理であることを確認しますよりむしろ特定のフォーマットに従って処理。

Redisのはバイナリセーフの文字列型を達成する方法ですか?

その答えは、SDS(簡易動的ストリング、シンプルな動的な文字列)は、Redisのは底が独自のデータ構造を定義しています。(次を理解するためのシンプル)

typedef char *sds;

struct sdshdr {

    // buf 已占用长度
    int len;

    // buf 剩余可用长度
    int free;

    // 实际保存字符串数据的地方
    char buf[];
};

文字列を操作するためのコマンド

財団セットは、get、delコマンドと例

get keyname与えられたキー内に格納された値を取得
set keyname value与えられたストレージAYキーの設定値
del keyname(すべてのタイプの汎用コマンド)指定された値に保存され、削除キーを

127.0.0.1:6379> set happy today
OK
127.0.0.1:6379> get happy
"today"
127.0.0.1:6379> del happy
(integer) 1
127.0.0.1:6379> get happy
(nil)
127.0.0.1:6379> 

インクリメントとデクリメントコマンドので、

incr keyname格納された値を加えた鍵
decr kenameの鍵ストレージには、1マイナス
incrby keyname amount鍵蓄積量プラスの整数値
decrby keyname amountキーの整数値を減算することにより量を格納された
incrbyfloat keyname amount格納された値のプラスキー浮上量を

127.0.0.1:6379> set number 1
OK
127.0.0.1:6379> get number
"1"
127.0.0.1:6379> incr number
(integer) 2
127.0.0.1:6379> get number
"2"
127.0.0.1:6379> decr number
(integer) 1
127.0.0.1:6379> get number
"1"
127.0.0.1:6379> incrby number 3
(integer) 4
127.0.0.1:6379> get number
"4"
127.0.0.1:6379> decrby number 2
(integer) 2
127.0.0.1:6379> get number
"2"
127.0.0.1:6379> incrbyfloat number 1.23
"3.23"
127.0.0.1:6379> get number
"3.23"

サブストリングとコマンドビット

append keyname value指定された値は、文字列値の末尾に追加され
getrange keyname start endたすべての文字を含む開始と終了を含むサブストリング組成範囲、開始から終了まで取得した
setrange keyname offset valueオフセットが格納されたキーキー名文字列(上書き)をオーバーライド値パラメータ値によって開始オフセットを。
getbit keyname offsetキー名文字列が指定されたオフセット上のビット(ビット)を得、値を保存します。
setbit keyname offset valueキー名文字列は、値セットを記憶されているか、指定されたオフセットにビット(ビット)をクリアします。

注Redisのインデックスは0から始まり

127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> append hello ,java
(integer) 10
127.0.0.1:6379> get hello
"world,java"
127.0.0.1:6379> getrange hello 2 5
"rld,"
127.0.0.1:6379> setrange hello 6 redis
(integer) 11
127.0.0.1:6379> get hello
"world,redis"
127.0.0.1:6379> 
127.0.0.1:6379> setbit bitstr 100 1
(integer) 0
127.0.0.1:6379> getbit bitstr 100
(integer) 1
127.0.0.1:6379> get bitstr
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b"
127.0.0.1:6379> 

他のいくつかの重要なコマンド

setnx key valueキーキーは既に、何のアクションSETNXコマンドを存在しない場合、キーは、キーのキー値にキー値が存在しない場合にのみ。
setex key seconds value値へのキー、キーの値を設定し、生存の鍵の鍵は、seconds秒に設定されています。キー、キーがすでに存在する場合は、SETEXコマンドは、以前の値を上書きします。

説明:

  • SETNXは(そうでない場合は、その後、SET)速記を「未が存在する場合はSET」です。コマンドは、1セットの成功を返し、セットアップが失敗した場合に0を返します。
  • SETEXコマンドSETキー値と対応し、キー秒#セット生存効果に2つのコマンドをEXPIREが、SETEXはアトミック操作です。
127.0.0.1:6379> exists mark
(integer) 0
127.0.0.1:6379> setnx mark abcd
(integer) 1
127.0.0.1:6379> setnx mark defg
(integer) 0
127.0.0.1:6379> get mark
"abcd"
127.0.0.1:6379> setex cachekey 20 ak98
OK
127.0.0.1:6379> get cachekey
"ak98"
127.0.0.1:6379> ttl cachekey
(integer) 2

リスト|リストのタイプ

リストタイプで同様の種類と多くのプログラミング言語のRedisのリスト可以有序地存储多个字符串

サポートプッシュまたはリストの左右端からポップの要素。Redisのリスト基礎となる実装は、二重リンクリストから、(その内容を実現するためのRedisデータ構造)リストを圧縮されています。図を参照してください

からの画像

「Redisの設計と実装」からの写真

運用コマンドの詳細なリスト

lpush key value [value...]

リスト・ヘッダに1つ以上の値の値。キーが存在しない場合は、空のリストを作成し、LPUSH操作を実行します。キーは、リストの種類存在するが、いない場合は、エラーが返されます。

LPUSHコマンドを実行した後、リストの長さを返します。

127.0.0.1:6379> lpush listkey a
(integer) 1
127.0.0.1:6379> lpush listkey a b c
(integer) 4
127.0.0.1:6379> lrange listkey 0 -1
1) "c"
2) "b"
3) "a"
4) "a"
127.0.0.1:6379> 
  • リストの種類を繰り返し要素を添加してもよく、そして集合(コレクション)が異なると言うへ戻ります。
  • LRANGEのlistkey 0は-1リスト全体の内容を取得することです
  • 同様rpushコマンドは、右からの要素のリストに追加されます

LPOP key

リストの左端から値をポップし、ポップアップ値に戻します

127.0.0.1:6379> lrange listkey 0 -1
1) "c"
2) "b"
3) "a"
4) "a"
127.0.0.1:6379> lpop listkey
"c"
127.0.0.1:6379> lrange listkey 0 -1
1) "b"
2) "a"
3) "a"
127.0.0.1:6379> 

lrange key start end

最後の範囲のすべての要素への鍵与えられた開始値のリストを取得します。

0は、最初の要素を示し-1最後の要素です。

127.0.0.1:6379> lrange listkey 0 -1
1) "b"
2) "a"
3) "a"
127.0.0.1:6379> lrange listkey 0 1
1) "b"
2) "a"
127.0.0.1:6379>

lindex key index

インデックス値で指定された単一の要素のリストを取得します。

することができる-1、それは、最後の要素を表す-2ように最後から二番目の要素であり、。

127.0.0.1:6379> lrange listkey 0 -1
1) "b"
2) "a"
3) "a"
127.0.0.1:6379> lindex listkey 0
"b"
127.0.0.1:6379> lindex listkey -1
"a"
127.0.0.1:6379> lindex listkey 3
(nil)
127.0.0.1:6379> 

blpop key [key …] timeout

blpopは、キーコマンドLPOPブロッキングバージョンでポップアップコマンドをブロックしています。ポップアップリスト内で使用可能な要素を与えられていない場合は、接続が待機タイムアウトするまで、または発見の要素をポップするまで、blpopコマンドをブロックされます。

オーダーパラメータをチェックし、各キーリスト、最初の非空リストのポップアップ素子によれば、複数のパラメータのキーが与えられたとき。

議論は二つのケースに分けることができ、一つは少なくとも一つのキーの存在であり、リストが空でない場合、コマンドはblpopブロックされません、さらにblpopコマンドリストは、この時間がタイムアウト期間内にブロックされる空のリストです。

ノンブロッキングシナリオを見て、戻り値は、名前とポップアップ要素の最初の非空のリストです。

127.0.0.1:6379> lpush list1 hello java
(integer) 2
127.0.0.1:6379> lpush list2 hello redis
(integer) 2
127.0.0.1:6379> blpop list2 list1 list3 0
1) "list2"
2) "redis"
127.0.0.1:6379> 

blpop BOOK1 BOOK2 300コマンドが生きるためにブロックされている実行した後、シーンをブロックします。

127.0.0.1:6379> exists book1
(integer) 0
127.0.0.1:6379> exists book2
(integer) 0
127.0.0.1:6379> blpop book1 book2 300
阻塞在这里了

この時間は、我々は別のRedisのクライアントを開いた場合、次のコマンドを実行しlpushてbook1のリスト要素をプッシュするコマンドを。

127.0.0.1:6379> lpush book1 springboot
(integer) 1
127.0.0.1:6379> 

この場合、元のブロッククライアントへ行くポップの要素を持っています。

127.0.0.1:6379> exists book1
(integer) 0
127.0.0.1:6379> exists book2
(integer) 0
127.0.0.1:6379> blpop book1 book2 300
1) "book1"
2) "springboot"
(237.45s)
127.0.0.1:6379> 

私たちは、メッセージキューの簡易版を実装するためにそれを使用できると考えるのは最も可能性の高い、コマンドをブロックの種類の特性を使用して、Redisのリスト。

セット|セットタイプ

Redisのの無秩序方法の異なる複数の要素の集合を記憶します。それは障害と異なることに留意されたいです。

要素のセットはまた、複数の差分セット及びセット動作に設定することができるか否かを確認することに加えて、高速追加、削除、の交点のセットを実行することに加えて。

基本的な実装の概要

主に、辞書と呼ばれるデータ構造の基本的な実装により、Redisのコレクション型。しかし、格納された値は、整数、選択されたデータ構造INTSETであるかどうかに基づいて、Redisの究極の性能を追求するためです。一定の条件が満たされたとき、それは辞書を実装するために切り替わります。

ここに画像を挿入説明

ここで説明するのは、おそらく低い字典、同じではありません、プログラムが辞書に新しいキーと値のペアを追加したり、キー検索に基づくことができ、実際には、キーと値のペアのセットで構成されている(キーと値のペア)の各種キーと値のペアで構成更新:または削除ファイル。

辞書内のキーの要素を保持するように設定(セット)の使用記憶されたデータ内の辞書のデータ構造を、Redisの、辞書が均一であり、NULLの値セット。

詳細な操作コマンドセットタイプ

sadd key member [member...]

コレクションのキーに1つ以上の要素を追加し、それが無視され、コレクションの要素に存在しています。新しく追加された要素の数を返し、含まれていない要素を無視。

srem key member [member...]

一つ以上の要素のセットを削除し、存在しない要素は無視されます。戻り値の要素の数が正常に削除されました。

sismember key meber

要素がコレクションのキー部材内に存在するかどうかを確認してください。1を返し、そうでない場合、またはキーが存在しない場合は、0を返します。

scard key戻り値のセットに含まれる要素の数
spop keyセット内の1つの要素のランダムな除去、除去要素を返します。
smembers keyコレクションに含まれるすべての要素を返します。

127.0.0.1:6379> sadd set1 java spring redis
(integer) 3
127.0.0.1:6379> smembers set1
1) "redis"
2) "spring"
3) "java"
127.0.0.1:6379> scard set1
(integer) 3
127.0.0.1:6379> srem set1 spring
(integer) 1
127.0.0.1:6379> sismember set1 spring
(integer) 0
127.0.0.1:6379> smembers set1
1) "redis"
2) "java"
127.0.0.1:6379> sadd set1 mysql spring
(integer) 2
127.0.0.1:6379> spop set1
"redis"
127.0.0.1:6379> smembers set1
1) "mysql"
2) "spring"
3) "java"
127.0.0.1:6379>

以下に、複数組のを処理するためのコマンドの一部であります

sdiff key [key...]再び第1のセットに存在するが、ではないコレクションの他の要素に(数学上の集合差演算)が
sinter key [key...]要素(数学的交点オペレータ)に存在するすべてのセットを返す
sunion key [key...]要素のセットの存在下で少なくとも戻します(セットは、数学的計算します)

127.0.0.1:6379> smembers set1
1) "mysql"
2) "spring"
3) "java"
127.0.0.1:6379> smembers set2
1) "mysql"
2) "springboot"
3) "redis"
127.0.0.1:6379> sdiff set1 set2
1) "java"
2) "spring"
127.0.0.1:6379> sinter set1 set2
1) "mysql"
127.0.0.1:6379> sunion set1 set2
1) "mysql"
2) "springboot"
3) "java"
4) "spring"
5) "redis"
127.0.0.1:6379>

ハッシュ|ハッシュテーブル(ハッシュテーブル)

Redisのは実際には減少のRedisのハッシュバージョンのタイプです。これは、キーと値のペア、キーRedisの内部に格納されたキーと値のペアを複数に格納されています。

基本的な実装の概要

これを達成するために、ハッシュの基礎となるの主な種類は、辞書データ構造に基づいています。

ここに画像を挿入説明
実装する際にハッシュRedisの内部データ型は、2つのデータ構造を使用することです。あなたは空のハッシュテーブルを作成すると、それは辞書の形になることができ、一定の条件を満たした後、デフォルトのziplistで使用されるデータ構造です。

詳細なハッシュテーブル操作コマンド

hmget hash-key key [key...]ハッシュテーブル内のキーから1つ以上の値を取得
hmset hash-key key value [key value...]する値を設定するための1つの以上のキー内部のハッシュテーブルで
hdel hash-key key [key...]の成功に削除キーを返さ一つ以上のキーと値のペア内の削除されたハッシュテーブルの数を
hlen hash-keyリターンハッシュテーブルが含まれていキーと値のペアの数が
hexists hash-key key指定されたキーは、ハッシュテーブルに存在するかどうかを確認する
hkeys hash-key含まれる全てのキーのハッシュを取得する
hvals hash-keyハッシュを取得するすべての値を含んでいる
hgetall hash-key含まれる全て取得したハッシュキーの

127.0.0.1:6379> hmset hash1 username tom email 123@123 year 12
OK
127.0.0.1:6379> hmget hash1 email
1) "123@123"
127.0.0.1:6379> hlen hash1
(integer) 3
127.0.0.1:6379> hdel hash1 year
(integer) 1
127.0.0.1:6379> hexists hash1 year
(integer) 0
127.0.0.1:6379> hkeys hash1
1) "username"
2) "email"
127.0.0.1:6379> hvals hash1
1) "tom"
2) "123@123"
127.0.0.1:6379> hgetall hash1
1) "username"
2) "tom"
3) "email"
4) "123@123"
127.0.0.1:6379>

ZSET |順序集合

コレクションの順序付き集合、より整然とした言葉と比較すると、我々は、記憶素子のセットのコレクション型は順不同、Redisのは秩序を確保する方法であることを順序セットされている知っていますか?スコアの使用、保管中にこれらの部材とスコアとの間のマッピングの順序集合、コマンドを処理し、スコアを提供し、コマンドメンバーまたはスコアに整然としたアクセスのサイズに基づいてスコア。

基本的な実装の概要

Redisのは、順序集合を達成(ジャンプテーブル、自己検査と呼ばれる)ジャンプ・テーブルと呼ばれるデータ構造を使用するだけでなく、圧縮の前述のリストの使用に。場合にも、独自の変換には、一定の条件を満たしています。

ここに画像を挿入説明

詳細な動作コマンドセットを注文しました

zadd z-key score memer [score member...]順序集合に追加された所定の値のメンバーと
zrem z-key member [member...]組内は所定の部材を除去し、除去するメンバーの数を返す順序付けから
zcard z-key含有する順序集合のメンバーの数を返すために
zincrby z-key increment member添加メンバーメンバーの値を増分
zcount z-key min maxメンバーの数は、minとmaxとの間に介在し、戻り値
zrank z-key member順序付けられたセットに復帰部材の部材位置
zscore z-key memberメンバ部材の戻り値が
zrange z-key start stop [withscores]与えられた場合順序集合は、メンバーが開始と停止との間に介在ランクリターンをオプションのwithscoresオプション、コマンドが返すも一緒にスコアのメンバーに名前を付けます。

zrevrank z-key member戻り値は降順で得点のメンバーによると、メンバーのランク付けでメンバーのセットを注文しました。
zrevrange z-key start stopバックメンバーの順序集合に対する位置の所定の範囲内で、降順にスコアによってメンバー。
zrangebyscore z-key min maxすべてのメンバーの順序集合の値は、minとmaxの間に介在戻り値

127.0.0.1:6379> zadd zset1 10 a 12 b 1 c 3 d 20 e
(integer) 5
127.0.0.1:6379> zcard zset1
(integer) 5
127.0.0.1:6379> zcount zset1 2 10
(integer) 2
127.0.0.1:6379> zrank zset1 d
(integer) 1
127.0.0.1:6379> zscore zset1 e
"20"
127.0.0.1:6379> zrange zset1 3 5
1) "b"
2) "e"
127.0.0.1:6379> zrevrank zset1 d
(integer) 3
127.0.0.1:6379> zrevrange zset1 3 5
1) "d"
2) "c"
127.0.0.1:6379> zrangebyscore zset1 5 10
1) "a"
127.0.0.1:6379> 

著者情報:
公開番号:二大隊の司令官ノートは
ゴシップ:弾丸の雨は、少なくともに、出てきたときに、使用技術は、自分の風の壁を構築し、「それは顔ブラスト!!!」

おすすめ

転載: www.cnblogs.com/happyone/p/12057050.html