<?php
/*** 高并发原子性 true/false 业务设置* 每个限制业务1000W用户 内存占用 2.5MB 10000W用户 内存占用12MB* @author MikePeng*/
class Model_Atombit extends Model_Tables{const BUCKET = 1000000;//业务限制类型  高并发业务true/false检测模块 public static $aModeList = array('isplaypoker'=>array(  //用户今天是否玩牌'time'        => 'Ymd',  //业务按天限制'expire'   => 86400,  //限制过期时间),);public static function redis(){return mm::redis('limit');}/*** 原子性设置 状态值,同一业务 同一用户只能设置一次* @param int $mid  要设置的用户mid* @param int $mode 要设置的业务* @param boole $value 要设置的值 1/0* @param int $time 业务时间戳* @param int $bucket 是否需要拆分桶  因为bit操作有512MB限制 假如一个业务的内存占用超过此值 务必采用桶模式存储* @return 0/1  业务设置前的值*/public function setAtomBit($mid,$mode,$value=1,$time=0,$bucket=false){if( !($config = self::$aModeList[$mode]) ){fc::debug(date('Ymd H:i:s')."|{$mid}-{$mode} is not find!", __FUNCTION__.'_error.log', 10);return false;}//设置原子桶ID$bucketid = $bucket ? ceil($mid/self::BUCKET) : 0;//根据桶余数表示用户在此桶的位置$mid = $bucket ? $mid%self::BUCKET : $mid;$date = $time ? date($config['time'],$time) : date('Ymd');$cachekey = $this->_getCacheKey($mode,$date,$bucketid);$value = $value ? 1 : 0;$flag = self::redis()->setBit($cachekey,$mid,$value);self::redis()->expire($cachekey,$config['expire']);return $flag;}/*** 获取用户具体业务的限制值* @param int $mid  要设置的用户mid* @param int $mode 要设置的业务*/public function getAtomBit($mid,$mode){if( !($config = self::$aModeList[$mode]) ){return false;}$cachekey = $this->_getCacheKey($mode,$config['time']);return self::redis()->getBit($cachekey,$mid);}}
例子
public function statisticsNewPlay($api, $mid, $aData) {$mstatModel = mm::model('mstat');$statModel = mm::model('stat');$aMidCache = $mstatModel->mget($mid);if( !mm::model('atombit')->setAtomBit($mid,'isplaypoker',1,$aData['begin_time']) ){$statModel->incrby($api, 'otherStat', 'lgplay');if( !$aMidCache['lgdays'] || $aMidCache['lgdays']<2 ){$statModel->incrby($api, 'otherStat', 'firstplay');}}$mstatModel->mset($mid, array('lastplaytime' => $aData['begin_time']));//更新最后一次玩牌时间$mstatModel->incrby($mid, 'plays');//玩一局牌后,往里加玩牌数if ($aMidCache['plays'] >= 2) {mm::model('validated')->updc(date('Ymd', time()), $mid);}mm::model('mstatmonth')->update($mid, $aData['begin_time']);
}

  


转载于:https://www.cnblogs.com/starzhan/p/7388106.html

原子性判断,防并发思路相关推荐

  1. php秒杀防重复中奖_PHP如何应对秒杀抢购高并发思路

    原标题:PHP如何应对秒杀抢购高并发思路 我们常用QPS(Query Per Second,每秒处理请求数)来衡量一个web应用的吞吐率,解决每秒数万次的高并发场景,这个指标非常关键. 举个栗子:假设 ...

  2. 抢票或商品订单防并发、防超卖

    分享一下自己项目开发过程中的设计方案,涉及到订单防并发.防超卖的需求,兼容类似抢票,订单需要锁定商品序号,付款后成交,超时或取消后需要将序号放回可以重新下单的需求. 目录 函数整体思路 代码实现 优化 ...

  3. 基于Redis的incr、发布订阅防并发和setnx、轮询防并发的理解

    先上代码: 1.incr.发布订阅防并发 package com.xxx.epps.sfeicuss.common.anticoncurrency;import com.xxx.epps.sfeicu ...

  4. 商品秒杀,防并发解决思路

    我们在做电商项目的时候,经常会遇到抢购秒杀的问题,综合来说主要是两个问题 一,高并发情况下对数据库产生的压力 二,如何避免超卖(库存< 0)的情况. 针对这两个问题来谈下解决思路 一,缓解数据库 ...

  5. 微服务-高并发-思路

    一.为什么选择Go语言 Go 语言相对其它语言具有几点天然的优势: 语法简单,上手快 性能高,编译快,开发效率也不低 原生支持并发,协程模型是非常优秀的服务端模型,同时也适合网络调用 部署方便,编译包 ...

  6. HSIC简介:一个有意思的判断相关性的思路

    作者丨苏剑林 单位丨追一科技 研究方向丨NLP,神经网络 个人主页丨kexue.fm 前段时间在机器之心看到这样的一个推送彻底解决梯度爆炸问题,新方法不用反向传播也能训练 ResNet,当然,媒体的标 ...

  7. 7-28 搜索树判断 (25 分)(思路加详解) just easy!

    一:题目 对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值.如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树. 现在我们给出一个 ...

  8. OpenCV FLANN匹配器判断重复图像 思路及代码

    最近在清手机存储空间时想到一个问题,就是通过判断图片的重复性来删除不必要的文件,以节省空间,于是这两个月就一直在想应该怎么弄.由于灰度图像属于二维数据,所以判断图像整体的重复其实就是判断两个图像各自二 ...

  9. 2021-04-09 三角形判断测试用例编写思路

    判断一个三角形是等边三角形.等腰三角形还是不规则三角形的测试用例设计: 设计思路:考虑用等价类方法进行分析,等价类分为有效等价类和无效等价类: 是否是三个整数.三个整数之间的关系:能否够构成三角形,能 ...

  10. Leetcode 392. 判断子序列 解题思路及C++实现

    解题思路: 使用贪心算法,每在字符串t中找到s的相应顺序的一个字符,就当做找到了该字符,然后接着去找后面的字符. 程序大循环:在字符串 t 中去寻找字符串 s 的第一个字符. 每当找到 s 的起始字符 ...

最新文章

  1. 使用CAShapeLayer实现一个音量大小动态改变的控件
  2. 如何快速向数据库插1000万数据?4种方法对比,它简单却速度最快
  3. Linux的命令组成
  4. 1 week110的zookeeper的安装 + zookeeper提供少量数据的存储
  5. 计算机学院 迎新口号,清华大学迎新标语
  6. DecimalFormat的用法
  7. 2021年中国电动气动控制器市场趋势报告、技术动态创新及2027年市场预测
  8. Atitit.判断元素是否显示隐藏在父元素 overflow
  9. Mac笔记本Postman升级为新版本后,打开时一直转圈,无法使用
  10. 编译HG255D的openwrt固件
  11. 多说评论系统API调用和本地身份说明(JWT)
  12. 高可用的分布式Hadoop大数据平台搭建,超详细,附代码。
  13. 杨元庆:税收影响联想电脑国内售价
  14. 视频gif如何制作?试试这个视频制作gif神器
  15. windows系统下自定义图标
  16. 贝叶斯视角下的机器学习
  17. server2008网卡驱动包_网卡工作原理详解
  18. socket.io不错的websocket
  19. 熵权法、主客观权重及matlab应用
  20. 固态分区 basic_无需重装系统,Win10电脑简单分区操作。

热门文章

  1. PL/SQL中直接写SQL语句和用EXECUTE IMMEDIATE方法的区别
  2. support.SerializationFailedException: Failed to deserialize payload.
  3. 第一次注册苹果开发者账号
  4. BZOJ 3329 Xorequ 数字DP+矩阵乘法
  5. Ubuntu安装R及RStudio
  6. Linux下防止用户查看他人的进程-hidepid
  7. Camtasia 2021mac版
  8. 全网最全 Java 日志框架适配方案!还有谁不会?
  9. 数数FastJson那些年犯下的'血案'...
  10. 关于 Ping 的过程,你真的了解吗?