Maison  >  Article  >  base de données  >  Analyser les applications d'augmentation et de hachage de Redis

Analyser les applications d'augmentation et de hachage de Redis

藏色散人
藏色散人avant
2021-09-18 16:46:202842parcourir

incr

Par exemple, les plaques d'immatriculation de Pékin adoptent un processus consistant à saisir d'abord puis à approuver les qualifications. Il y a N numéros dans le pool de plaques d'immatriculation, et la page est affichée en dix éléments par page. Il y a un bouton de saisie après chaque numéro, et une personne ne peut saisir qu'une seule plaque d'immatriculation, et la même plaque d'immatriculation ne peut être saisie que par. une personne. Référence du modèle économique (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
     }
}

De plus, incr est-ce que les types string, les types hash et les types sortedSet peuvent tous être utilisésincrstring类型,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 est différent de lpop Un avantage est que plusieurs files d'attente peuvent être priorisées. blpop apparaîtra dans l'ordre selon l'ordre de key. La valeur de retour est le nom de la liste et la valeur de l'élément spécifique de key, et <. code>block peut être défini Time, le principe est de bloquer en premier et de servir en premier rrreee
hsetnx

🎜Définissez un champ dans hash au spécifié. valeur, prémisse Oui. Le champ n'existe pas. S'il est présent, renvoie 0. 🎜Cela garantit qu'une seule personne ne peut saisir qu'une seule plaque d'immatriculation, mais pendant le processus de saisie de la plaque d'immatriculation pour effectuer un paiement ou d'autres opérations commerciales, d'autres personnes ne peuvent pas le faire (c'est-à-dire que cette plaque d'immatriculation ne peut pas être liée à d'autres personnes). En fonction de la situation commerciale spécifique, un champ de hachage basé sur car_no et un champ de hachage basé sur des personnes peuvent être définis. 🎜rrreee🎜Sur la base de ces deux hachages, vous pouvez effectuer davantage d'opérations liées à l'entreprise, telles que vérifier la relation de liaison spécifique via hget, etc. 🎜🎜hdel🎜🎜Avec le modèle de liaison via hsetnx, lorsque quelqu'un paie une caution pour une certaine plaque d'immatriculation, etc., cela signifie qu'elle peut être éliminée pour toujours, donc hdel sera utilisé. De plus, si aucune opération telle que le paiement d'une caution n'est effectuée dans le délai imparti, le numéro de plaque d'immatriculation sera remis dans la liste d'origine. 🎜rrreee🎜lpush🎜🎜S'il y a une entrée, mettez les plaques d'immatriculation qui peuvent être cassées à Pékin dans une liste🎜rrreee🎜La valeur de list_name peut être déterminée en fonction de la valeur spécifique de car_no Par exemple, s'il y en a 6. et 8, je vais les mettre dans la liste better_car_no, les autres sont mis dans la liste normal_car_no, et enfin vous pouvez utiliser blpop pour spécifier une priorité . 🎜🎜rpoplpush🎜🎜Mode contextuel de file d'attente sécurisée, par exemple, si N personnes actionnent un bouton d'entrée, s'il y a suffisamment de données dans la structure de la liste, chaque personne aura et une seule donnée sera collectée, et d'autres affaires les opérations seront effectuées après sa réception. 🎜Mais le problème est qu'après avoir utilisé lpop, la file d'attente d'origine a été sautée. Si le client obtient l'élément pop au milieu et avant de terminer le traitement de cet élément, le client. s'est écrasé. À ce moment-là, le message a disparu de nulle part. S'il n'y a pas d'autres mesures supplémentaires (telles que la liaison ou l'enregistrement de l'élément pop-up) qui nécessitent des exigences strictes, vous pouvez utiliser rpoplpush pour résoudre ce problème. Une fois que le client a effectivement traité l'élément pop, le message est supprimé en toute sécurité via lrem. 🎜🎜🎜Apprentissage recommandé : "🎜Tutoriel vidéo Redis🎜"🎜🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer