ホームページ  >  記事  >  データベース  >  Redis の incr およびハッシュ アプリケーションを解析する

Redis の incr およびハッシュ アプリケーションを解析する

藏色散人
藏色散人転載
2021-09-18 16:46:202842ブラウズ

incr

たとえば、北京のナンバー プレートでは、最初に取得してから資格を承認するプロセスが採用されています。ナンバー プレート プールには N 個の番号があり、ページは 1 ページあたり 10 個の項目で表示されます。各番号の後に取得ボタンがあり、1 人が 1 つのナンバー プレートのみ取得でき、同じナンバー プレートを取得できるのは 1 人だけです。一人。ビジネス モデル リファレンス (http://num.10010.com/NumApp/chseNumList/init?num=186)

 if ($this->redis_db->incr("bj_".$car_no) != 1) {
      让别人先下手了,点别的去~
  }else{
       //抢到竞态条件,如果不复核资质要求退出,并清除incr
       if(抢到了但是没资质等){
         释放对此id的竟态权,别占茅坑
         $this->yredis_db->del("bj_".$id);
       }else{
         其他业务A
         抱得号码归...
         其他业务B
     }
}

さらに、 incrstring 型、hash 型、sortedSet

blpop

で操作可能blpoplpop に対する利点の 1 つは、複数のキューに対して優先操作を実行できることです。
blpopkey の順序に従って順にポップアップされ、戻り値はリスト名と key の特定の要素の値、および ## です#block# を設定できます。## 時間、原則は最初にブロックし、最初にサーブすることです。<pre class="brush:php;toolbar:false">        $date = date('Ymd', time());         //左进左出 ,优先分配一般的车牌号码,然后在分配非常好的连号号码,设置一个阻塞时间         return $this-&gt;redis-&gt;blpop(self::$_config['dispatch_normal_list'] . $date, self::$_config['dispatch_better_list'] . $date, self::$_config['redis_block_l_pop_time_out']);</pre>hsetnx

フィールド

ハッシュ# に設定します## を指定された value に変換します (field が存在しない場合)。存在する場合は 0 を返します。 これにより、1 人が 1 つのナンバー プレートしか取得できないことが保証されますが、支払いやその他の業務を実行するためにナンバー プレートを取得するプロセス中、他の人はこれを行うことができません (つまり、このナンバー プレートを他の人に拘束することはできません) )。特定のビジネス状況に応じて、car_no に基づくハッシュ フィールドと人物に基づくハッシュ フィールドを設定できます。 <pre class="brush:php;toolbar:false">hash_base_people {&quot;zhangsan&quot;:&quot;京A888&quot;,&quot;lisi&quot;:&quot;京A999&quot;} hash_base_car_no {&quot;京A888&quot;:&quot;zhangsan&quot;,&quot;京A999&quot;:&quot;lisi&quot;}</pre>これら 2 つのハッシュに基づいて、hget による特定のバインディング関係の確認など、より多くのビジネス関連の操作を実行できます。

hdel

hsetnx によるバインディング モデルでは、誰かが特定のナンバー プレートなどに対してデポジットを支払うと、そのナンバー プレートを永久に削除できることを意味し、これを hdel として使用します。なお、所定の時間内に保証金の支払い等の操作が行われなかった場合、ナンバープレートの番号は元のリストに戻ります。

 //删除以people_id为key的hash
 $base_people_id_del = $this->redis->hdel(self::$_config['hash_base_people'], $people_id);

 //删除以car_no为key的hash
 $base_car_no_del = $this->redis->hdel(self::$_config['hash_base_car_no'], $clue_id);

lpush

入口がある場合は、北京でスナップできるナンバー プレートをリストに入れます

$lpush_res = $redisObj->lpush($list_name, $car_no);

list_name の値は、 car_no の特定の値。たとえば、6 と 8 がある場合、それらを

better_car_no

リストに入れ、その他を

normal_car_no リストに入れます。最後に # を使用できます。 ##blpop シーケンスを指定します。 rpoplpushセーフキューポップアップモード、例えばN人が入口ボタンを操作する リスト構造に十分なデータがあれば、各人が持つのは1つだけデータを受信しますので、受信後に他の業務を行ってください。

しかし問題は、

lpop

を使用した後、元のキューがポップされていることです。クライアントが途中で、この要素の処理が完了する前に

pop
要素を取得した場合、クライアントがクラッシュしました。この時点で、メッセージはどこからともなく消えました。厳密な要件を必要とする他の補足的な手段 (ポップアップ要素のバインドや記録など) がない場合は、rpopplush を使用してこの問題を解決できます。クライアントが実際に pop 要素を処理した後、このメッセージは lrem を通じて安全に削除されます。 推奨される調査: 「redis ビデオ チュートリアル

以上がRedis の incr およびハッシュ アプリケーションを解析するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。