Redis基本データ型のString

11710 ワード

RedisのKey
  • Redisのkeyはバイナリセキュリティであり、任意のバイナリシーケンスをkeyとして使用することができ、すなわち文字列やピクチャの内容をkeyとして使用することができ、空の文字列はRedisにおいても有効なkeyと考えられることに注意する.
  • keyは長すぎるべきではありません.1つは、ストレージの観点からメモリが消費され、keyを検索するときにkeyを比較するとオーバーヘッドが増加します.
  • では、「student:id」、「student:age」などの記述フィールドをキーとして区切ることを推奨します.
  • keyの最大容量は512 Mである.

  • 基本コマンド
  • 一致規則に適合するキー名リスト
  • を取得する.
    > keys pattern [? / * /[] ]
    

    ここでpatternは正規表現であり、対応するルールに合致するkeyのリストを返します.
  • は、1つのキーが存在するか否かを判断する
  • である.
    > exiests key
    
  • keyに対応するvalueのデータ構造タイプ
  • を取得する.
    > type key
    

    基本データ型-string
    1.基本賦値、取値操作
    1.1賦課
    > set user:name eric
    OK
    

    setコマンドはパラメータを持つことができ、NX:keyが存在しない場合にのみ付与操作を行う.XX:キーが既に存在する場合のみ、付与操作を行います.
    1.2一括割付
    msetコマンドset複数keyのvalueに使用
    > mset user:name eric user:age 18
    OK
    

    1.3値を取る
    > get user:name
    "eric"
    

    1.4ロット値
    mgetコマンドはバッチで値を取り、パラメータは複数keyでvalueリストを返します.
    > mget user:name user:age
    1) "eric"
    2) "18"
    

    2.文字列操作
    2.1文字列の結合
    > append user:name 1122
    (integer) 8
    > get user:name 
    "eric1122"
    

    2.2文字列切り取り
    コマンドgetrange key start end、開始終了インデックス間のサブ文字列を取得
    > getrange user:name 1 6
    "ric112"
    

    2.3取得長さ
    strlenコマンドユーザはkeyに対応するvalueの長さを取得する
    > strlen user:name
    integer) 8 
    > strlen user:age
    (integer) 2
    

    3.数値操作
    上記で作成したkeyのvalueのタイプは同じで、stringです.以下のようにします.
    > type user:name
    string
    > type user:age
    string
    

    ただし、OBJECT ENCODINGコマンドを使用して、valueのエンコーディングタイプをさらに表示します.
    > object encoding user:name
    "raw"
    > object encoding user:age
    "int"
    

    stringタイプはintを符号化形式とするvalueに対して数値操作をサポートする.
    3.1増加
    incr key、keyのvalueに対して1 incrby key incrementを増加して、指定した整数を増加します
    > incr user:age
    (integer) 19
    > incrby user:age 10
    (integer) 29
    > get user:age
    "29"
    

    3.2減少(プラス同様)
    3.3バイナリセキュリティ
    なぜRedisはバイナリで安全なのですか?まず次の例を見てみましょう.
    > set num 99
    OK
    > strlen num
    (integer) 2
    

    このときnumを1から増やしてstrlenを使ってnumの長さを取得すると、結果は何になりますか?
    > incr num
    (integer) 100
    > strlen num
    ???
    

    このときnumのvalueは100ですが、このときこのvalueの長さを取得すると、結果はいくらになりますか?答えは:3
    numを1000追加したら?このときvalueの長さはいくらですか?
    > incrby num 1000
    (integer) 1100
    > get num 
    "1100"
    > strlen num
    ???
    

    numのvalueは1100で、符号化タイプはintですが、長さはいくらですか?JAvaでの整数長は4バイトですが、Redisではどうなっていますか?1100は何バイトで表すことができますか?
    プログラムの実行の答えは:4なぜですか?Redisはバイナリセキュリティなので、バイナリセキュリティとは、私に転送されたデータのバイナリがどのようなものなのか、私はどのように保存しているのか、データの再符号化、シーケンス化などの操作はしません.本質的にデータはバイト配列の形で格納され、取得されます.これは、オーバーフローや文字化けしの問題がないことを意味します.だから「100」という文字列の長さは3で、「1100」の長さは4です.
    4.Bitmap
    Bitmapは実際のデータ型ではなく、一連のビット操作のコマンドであり、RedisはBitmapをString型に帰属する.Stringの最大長は512 Mであるため、Bitmapは232ビットまで表すことができる.
    4.1賦値と取値
    setbitおよびgetbitコマンドは、バイナリの特定のビットの値を設定/取得するために使用されます.コマンドフォーマットは、setbit/getbit key[offset value]です.offsetはバイナリの特定のビット数であり、valueはその位置を1または0にします.
    > setbit key 1 1
    (integer) 1
    > getbit key 1 
    (integer) 1
    > get key 
    "@"
    > strlen key
    (integer) 1
    

    上記setbitコマンドは、1バイト目の1ビット目を1に割り当て、keyに対応するvalueは01000000であり、getbitコマンドは、そのバイナリ数の1ビット目を1に取得する.01000000に対応するASSICコードは「@」、すなわちvalueは「@」である.
    次のコマンドを実行します.
    > setbit key 9 1
    (integer) 0
    > strlen key
    (integer) 2
    

    9番目の位置を1にすると、Redisは自動的に1バイトを後ろに補い、2バイト(すなわち01000000 01000000)になり、valueの9番目のバイトである2番目のバイトの1位が1になる.従って現在valueの長さは2である.
    4.2 Bitビット統計
    コマンド:bitcount key[start end]valueのビット数を「1」に統計します.ここでstartは開始バイトのインデックス値を表し、endは終了バイトのインデックス値を表す(ここではバイナリビットのインデックスではなくバイトのインデックスであることに注意).次のようになります.
    #  key    01000000 01000000
    > bitcount key 0 1
    (integer) 2
    > bitcount key 1 1
    (integer) 1
    

    1番目のコマンドは0バイト目から1バイト目まで終了し、「1」の個数を統計し、結果は2である.2番目のコマンドは、実は1バイト目の「1」の個数を統計するので、結果は1です.
    4.3ビット検索
    コマンド:bitpos key bit[start end]は、指定したバイト範囲の最初のbitビットのインデックスを検索するために使用されます.ここで、bitは検索が必要な値であり、start、endはそれぞれ検索範囲の開始バイト、終了バイトのインデックスを表す.次のようになります.
    #key    01000000 01000000
    > bitpos key 1 1 1
    (integer) 9
    > bitpos key 1 0 1
    (integer) 1
    

    1バイト目の1番目のビットインデックスは9で、0バイト目から1バイト目の範囲の1番目のビットインデックスは1です.
    4.4ビット操作
    コマンド:bitop operation destkey key[key...]
    #  k1,  1   7     1, 01000001,   “A”
    > setbit k1 1 1
    (integer) 0
    > setbit k1 7 1
    (integer) 0
    > get k1
    "A"
    #  k2,  1   6     1, 01000010,   “B”
    > setbit k2 1 1
    (integer) 0
    > setbit k2 6 1
    (integer) 0
    > get k2
    "B" 
    

    (1)と操作–and
    # k1 k2  ,    :01000000,   “@”,     destkey
    > bitop and andkey k1 k2
    (integer) 1
    > get andkey 
    "@"
    

    (2)または操作–or
    # k1 k2  ,    :01000011,   “C”,     destkey
    > bitop or orkey k1 k2
    (integer) 1
    > get orkey 
    "C"
    

    シーンを単純に適用
    Redisは、データに対して上述した各種の演算方法を提供しており、クライアントが処理を行う際に、Redisのデータ処理方法を直接呼び出せばよく、同時にデータがRedis内部に格納される行為を「計算からデータへの移動」と呼ぶ.
    数値計算アクションシーンの適用
    1つの典型的なシーンは秒殺であり、ユーザーは複数のクライアントを訪問することによって商品秒殺を行い、クライアントがRedisを通じて数値の自己増加を行い、商品の最大数に増加した場合、秒殺が終了すると抽象することができる.Redisの業務処理プロセスは単一スレッドであるため,複数のクライアントの要求にスレッドセキュリティの問題はなく,商品の買い過ぎの問題も起こらない.同様のシナリオでは、マルチクライアント・ユーザーがサービス・エンドにアクセスした回数を統計し、ユーザーの操作ログを記録するなどのビジネスを統計します.
    Bitmapアプリケーションシーン
    もし以下の需要があると仮定します:電信事業者はユーザーにハンドヘルド営業庁のサービスを提供して、今局側はユーザーごとに1年以内のハンドヘルド営業庁の登録状況を統計したいと思って、どんな日に登録して、全部で何日登録しますか?シナリオ1:データベースを使用して、各ユーザーのログイン状況を記録します.ユーザーがログインするたびに、ログイン当日の日付を含むレコードが追加されます.その後、1年間で合計何日ログインしてSQL文で検索しますか.質問:1人のユーザーが1年に何日ログインすれば、何件の記録が発生するか、ここでは電信事業者のユーザー数が基本的に千万級であることにも注意しなければならない.このように、この表は膨大になり、本案は実行できない.シナリオ2:RedisのBitmapを使用してユーザーログイン情報を格納する
    #  eric    2 、 4   365      ,        Bitmap 
    > setbit eric 1 1
    (integer) 0
    
    > setbit eric 3 1
    (integer) 0
    
    > setbit eric 364 1
    (integer) 0
    

    ユーザericログイン情報を格納するデータサイズは、次のとおりです.
    > strlen eric
    (integer) 46
    

    46バイトユーザーごとに46バイトを使用すると、データベースのシナリオよりも1年間のログイン状況を統計できます.ユーザーのログイン状況を取得するには、次の手順に従います.
    # Redis       ,-1        
    > bitcount eric 0 -1
    (integer) 3
    

    もちろん、実際のシーンでは、1000万人以上のアクティブなユーザーがいる場合、システムの圧力も大きく、ここでの例は、シナリオ1のデータベースストレージを最適化するだけです.
    小結
    本稿では,Redisにおけるkeyの概念とkeyに関するいくつかのコマンドを概説し,文字列,数値,Bitmapに分けてRedis基本データ型におけるStringに重点を置いた.各データ型に対する処理コマンドをそれぞれ列挙し,計算からデータへの移動の特徴を際立たせた.最後にいくつかの実用的なシーンを紹介しましたが、今回紹介した結果、RedisのStringについて基本的な理解が得られたのではないでしょうか.