网络视频直播系统中,关于发红包功能并发问题的处理教程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yun_bao_2144899870/article/details/88532669

随着直播行业的火爆发展,各种直播平台涌现出来。为了提高平台人气,活跃直播间内气氛,各大网络视频直播系统中都纷纷加入了各项功能,比如:送礼物、发弹幕、抢红包、连麦、主播PK等等,在这些功能中,抢红包功能相对比较特殊,因为它对并发处理的要求比较高。
一、一般的处理过程
首先把红包分配好,存储到数据库里,然后在当前用户进行抢红包操作的时候,网络视频直播系统会先从数据库中进行发红包的记录查询,查到记录后把记录从数据库中删除,避免金额数目混乱,最后系统自动处理用户抢红包成功后的业务操作。
二、眼下的现实情况
如果用户是依次进行抢红包操作的话,以上业务逻辑是完全不会有问题的,但现实情况中,用户是不会依次进行抢红包操作的。那么抢红包的并发问题就成了大问题。
在并发的情况下,上述的流程就会出现一个问题:多个用户会抢到同一个红包记录,最终会出现用户抢到的红包数量和红包总金额超出发红包时的总金额。如此一来,网络视频直播系统如何保证抢到红包的用户数量和红包总和的准确性就成了关键。
三、问题的解决方法
解决抢红包时产生的并发问题可以用Redis来实现,Redis 提供了一个队列的存储方式,并可以通过冒泡的方式把存储的数据依次取出。具体实现过程如下:
发红包的时候:

/*指定红包的存储key*/
$key2='red_list_'.$redid;
/* 通过红包数量分配红包金额 */
    	$red_list=$this->redlist($coin,$nums,$type);
/* 将分配好的红包存入缓存 */
    	foreach($red_list as $k=>$v){
            DI()->redis->rPush($key2,$v);
        }

用户抢红包的时候:

        $key2='red_list_'.$redid;
/* 是否存在未抢红包 */
           $ifexist=DI()->redis->exists($key2);
           if($ifexist){
/* 尝试获取一个红包 */
               $coin=DI()->redis->lPop($key2);
               if($coin>0){
                	/* 处理业务 */
               }
           }  

Redis lPop的使用实现了在获取数据的同时删除该数据的功能,极大改善了直播平台抢红包时产生的并发问题。更多与网络视频直播系统相关的资讯和分析会在以后逐渐放出,敬请期待,需要的朋友请关注我。
声明:文章为原创内容,转载请注明原文链接及作者

猜你喜欢

转载自blog.csdn.net/yun_bao_2144899870/article/details/88532669