Redisの5種類のデータ構造の基本的な操作

4687 ワード

Redis
redis操作命令練習Redisは、文字列の長さが512 MBを超えてはならないことを規定している.
1)文字列string
文字列の基本操作設定とキー値の取得ペアSETとGETを使用して文字列値を設定および取得します.
> SET key value
OK
> GET key
"value"
       
> SET key1 value1
OK
> SET key2 value2
OK
> MGET key1 key2 key3    #       
1) "value1"
2) "value2"
3) (nil)
> MSET key1 value1 key2 value2
> MGET key1 key2
1) "value1"
2) "value2"

EXISTSキーとDELキーを使用して、キー値ペアの存在と削除を問い合せます.
> EXISTS key
(integer) 1
> DEL key
(integer) 1
> GET key
(nil)

SETNXキーワードの使用
> SETNX key value1  #    key      SET   
(integer) 1
> SETNX key value1  #    key     SET   
(integer) 0
> GET key
"value"             #      

カウント
> SET counter 100
> INCR count
(interger) 101
> INCRBY counter 50
(integer) 151
      GETSET   
> SET key value
> GETSET key value1
"value"

2)リストリスト
RedisのリストはJava言語のLinkedListに相当し,配列ではなくチェーンテーブルであることに注意する.これはlistの挿入と削除操作が非常に速く,時間的複雑度はO(1)であるが,インデックスの位置決めが遅く,時間的複雑度はO(n)であることを意味する.LPUSHとRPUSHはそれぞれlistの左側(頭部)と右側(尾部)に新しい要素を追加することができる.LRANGEコマンドはlistから一定範囲の要素を取り出すことができる.LINDEXコマンドはlistから指定した下のテーブルの要素を取り出すことができ、Javaチェーンテーブル操作のget(int index)操作に相当する.
> rpush mylist A
(integer) 1
> rpush mylist B
(integer) 2
> lpush mylist first
(integer) 3
> lrange mylist 0 -1    # -1          ,                  ,   
1) "first"
2) "A"
3) "B"

List実装キューキューは、メッセージキューと非同期論理処理でよく使用される先進的なデータ構造であり、要素のアクセス順序を確保します.
> RPUSH books python java golang
(integer) 3
> LPOP books
"python"
> LPOP books
"java"
> LPOP books
"golang"
> LPOP books
(nil)

List実装スタックは先進的なデータ構造であり,キューとは正反対である.
> RPUSH books python java golang
> RPOP books
"golang"
> RPOP books
"java"
> RPOP books
"python"
> RPOP books
(nil)

3)辞書hash
Redisの辞書はJavaのHashMapに相当し,内部実装もあまり似ていないが,「配列+チェーンテーブル」のチェーンアドレス法により部分的なハッシュ競合を解決するとともに,このような構造も2つの異なるデータ構造の利点を吸収している.辞書の基本操作hashにも欠点があり、hash構造の記憶消費は単一の文字列より高いため、hashを使用するべきか文字列を使用するべきかは、実際の状況に応じて再三考慮する必要がある.
> HSET books java "think in java"    #                       
(integer) 1
> HSET books python "python cookbook"
(integer) 1
> HGETALL books    # key   value     
1) "java"
2) "think in java"
3) "python"
4) "python cookbook"
> HGET books java
"think in java"
> HSET books java "head first java"  
(integer) 0        #        ,     0
> HMSET books java "effetive  java" python "learning python"    #     
OK

4)集合set
Redisの集合はJava言語のHashSetに相当し,その内部のキー値ペアは無秩序で一意である.その内部実装は特殊な辞書に相当し、辞書のすべてのvalueは値NULLである.集合setの基本使用
> SADD books java
(integer) 1
> SADD books java    #   
(integer) 0
> SADD books python golang
(integer) 2
> SMEMBERS books    #     ,set      
1) "java"
2) "python"
3) "golang"
> SISMEMBER books java    #      value     ,    contains
(integer) 1
> SCARD books    #     
(integer) 3
> SPOP books     #     
"java"

5)シーケンステーブルzsetあり
これはRedisの最も特色のあるデータ構造をもたらす可能性があります.JavaのSortedSetとHashMapの結合体に似ています.一方、setであり、内部valueの一意性を保証します.一方、各valueにscore値を付与し、ソートの重みを表すことができます.その内部実装は「ジャンプテーブル」というデータ構造を用いている.
> ZADD books 9.0 "think in java"
> ZADD books 8.9 "java concurrency"
> ZADD books 8.6 "java cookbook"

> ZRANGE books 0 -1     #   score     ,         
1) "java cookbook"
2) "java concurrency"
3) "think in java"

> ZREVRANGE books 0 -1  #   score     ,         
1) "think in java"
2) "java concurrency"
3) "java cookbook"

> ZCARD books           #     count()
(integer) 3

> ZSCORE books "java concurrency"   #      value   score
"8.9000000000000004"                #    score    double       ,           

> ZRANK books "java concurrency"    #   
(integer) 1

> ZRANGEBYSCORE books 0 8.91        #          zset
1) "java cookbook"
2) "java concurrency"

> ZRANGEBYSCORE books -inf 8.91 withscores  #        (-∞, 8.91]    zset,      。inf    infinite,      。
1) "java cookbook"
2) "8.5999999999999996"
3) "java concurrency"
4) "8.9000000000000004"

> ZREM books "java concurrency"             #    value
(integer) 1
> ZRANGE books 0 -1
1) "java cookbook"
2) "think in java"