Heim  >  Artikel  >  Datenbank  >  Incr- und Hash-Anwendungen von Redis analysieren

Incr- und Hash-Anwendungen von Redis analysieren

藏色散人
藏色散人nach vorne
2021-09-18 16:46:202852Durchsuche

incr

Zum Beispiel verwenden Pekinger Nummernschilder einen Prozess, bei dem zunächst die Qualifikationen erfasst und dann genehmigt werden. Es gibt N Nummern im Nummernschildpool und die Seite wird in zehn Elementen pro Seite angezeigt. Nach jeder Nummer befindet sich eine Schaltfläche zum Ergreifen, und eine Person kann nur ein Nummernschild ergreifen, und dasselbe Nummernschild kann nur von jemandem erfasst werden eine Person. Referenz zum Geschäftsmodell (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
     }
}

Außerdem incr Ist richtig, dass string-Typen, hash-Typen und sortedSet-Typen alle bedient werden könnenincrstring类型,hash类型,sortedSet类型都可以进行操作

blpop

blpop相对于lpop有一个好处,可以对多个队列进行优先级操作。
blpop会按照key的排列顺序依次弹出,返回值为key的listname及具体元素值,而且可以设置block时间,原则是先阻塞先服务.

        $date = date('Ymd', time());
        //左进左出 ,优先分配一般的车牌号码,然后在分配非常好的连号号码,设置一个阻塞时间
        return $this->redis->blpop(self::$_config['dispatch_normal_list'] . $date, self::$_config['dispatch_better_list'] . $date, self::$_config['redis_block_l_pop_time_out']);

hsetnx

设置hash中一个field为指定value,前提是field不存在。如果存在,返回0。
这样能保证在一个人只能抢一个车牌,但是抢到车牌执行付款或者其他业务操作过程中,其他人无法对此操作,(即不能将此车牌绑定到其他人身上)。根据具体业务情况,可设置基于car_no的hash field和基于 people 的hash field。

hash_base_people {"zhangsan":"京A888","lisi":"京A999"}
hash_base_car_no {"京A888":"zhangsan","京A999":"lisi"}

基于这两个hash 可以做更多关于业务的操作,比如通过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

如果有入口将北京可以抢拍的车牌放入到一个list里

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

其中list_name的值可以根据car_no的具体值来确定,比如有6和8的我就放入到better_car_no列表里,其他的放入到normal_car_no列表里,最后可以用blpop来指定一个先后优先级。

rpoplpush

安全的队列弹出模式,比如N多人对一个入口按钮进行操作,如果list结构中有足够的数据,每个人有且只有一条数据会被领取,领取之后再做其他的业务操作。
但是问题是,如果用lpop之后,原队列中已被弹出,如果中途客户端在取得该pop的元素后,且完成处理此元素前,客户端发生崩溃。这时候此条消息就凭空消失了。如果没有其他补助措施(比如通过绑定或者记录此弹出的元素)需要严谨要求,可以用rpoplpush可以解决此问题。在客户端真正处理完此pop的元素之后,通过lrem

blpop

blpop ist Der Unterschied zu lpop besteht darin, dass mehrere Warteschlangen priorisiert werden können. blpop wird der Reihe nach entsprechend der Reihenfolge von key angezeigt. Der Rückgabewert ist der Listenname und der spezifische Elementwert von key und block kann Zeit eingestellt werden. Das Prinzip besteht darin, zuerst zu blockieren und zuerst zu dienen Wert, Prämisse Ja Feld existiert nicht. Falls vorhanden, wird 0 zurückgegeben. Dadurch wird sichergestellt, dass eine Person nur ein Nummernschild ergreifen kann, andere Personen dies jedoch nicht tun können, während sie das Nummernschild zur Durchführung von Zahlungen oder anderen Geschäftsvorgängen ergreifen (d. h. dieses Nummernschild kann nicht an andere Personen gebunden werden). Abhängig von der spezifischen Geschäftssituation können ein Hash-Feld basierend auf car_no und ein Hash-Feld basierend auf Personen festgelegt werden.
rrreee

Basierend auf diesen beiden Hashes können Sie weitere geschäftsbezogene Vorgänge ausführen, z. B. die Überprüfung der spezifischen Bindungsbeziehung über hget usw. 🎜🎜hdel🎜🎜Wenn beim Bindungsmodell über hsetnx jemand eine Kaution für ein bestimmtes Nummernschild usw. zahlt, bedeutet dies, dass es für immer eliminiert werden kann, sodass hdel verwendet wird. Wenn außerdem innerhalb der angegebenen Zeit keine Vorgänge wie die Zahlung einer Kaution durchgeführt werden, wird das Kennzeichen auf die ursprüngliche Liste zurückgesetzt. 🎜rrreee🎜lpush🎜🎜Wenn es eine Einfahrt gibt, fügen Sie die Nummernschilder, die in Peking eingerastet werden können, in eine Liste ein🎜rrreee🎜Der Wert von list_name kann anhand des spezifischen Werts von car_no bestimmt werden. Wenn es beispielsweise 6 gibt und 8, ich werde sie in die Liste better_car_no einfügen, andere werden in die Liste normal_car_no eingefügt, und schließlich können Sie mit blpop eine Priorität angeben . 🎜🎜rpoplpush🎜🎜Sicherer Warteschlangen-Popup-Modus, wenn beispielsweise N Personen eine Eingangstaste betätigen, wenn genügend Daten in der Listenstruktur vorhanden sind, wird jede Person nur ein Datenelement erfassen und andere Geschäfte Die Operationen werden nach Erhalt durchgeführt. 🎜Aber das Problem besteht darin, dass nach der Verwendung von lpop die ursprüngliche Warteschlange geöffnet wurde, wenn der Client das pop-Element in der Mitte erhält und bevor die Verarbeitung dieses Elements abgeschlossen ist abgestürzt. Zu diesem Zeitpunkt verschwand die Nachricht wie aus dem Nichts. Wenn keine anderen ergänzenden Maßnahmen (z. B. Bindung oder Aufzeichnung des Popup-Elements) strenge Anforderungen erfordern, können Sie rpoplpush verwenden, um dieses Problem zu lösen. Nachdem der Client das pop-Element tatsächlich verarbeitet hat, wird die Nachricht sicher über lrem gelöscht. 🎜🎜🎜Empfohlenes Lernen: „🎜Redis-Video-Tutorial🎜“🎜🎜

Das obige ist der detaillierte Inhalt vonIncr- und Hash-Anwendungen von Redis analysieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen