memcache锁
锁的使用,一般情况是针对并发或者我们希望程序(crontab的job)串行处理,我们加锁的办法有很多,像文件锁,数据库锁,或者memcache锁,这里关注一下memcache锁,针对memcache锁,考虑三个问题。
1、 memcache并发情况下的get,set会出现什么样的问题?
2、 如何使用memcache实现加锁
3、 memcache加锁后,解锁前程序crash,如何处理
针对第一个问题,我们考虑一下这样一个场景,我们使用memcache记录一个用户最近五次的访问时间。
我们会怎么做呢?
我们用用户的uid做key,将每次访问的时间用符号连接起来做value,存储在memcache中。我们看一下程序的流程。
先get查看用户的uid是否存在,如果不存在,set key是uid,value是当前时间,如果存在,获取vaule,做下逻辑处理,连接上当前时间。我们一厢情愿的希望我们的程序是 get --> set -->get --> set……, 可是,问题来了,并发了,用户第一次访问的时间还未set,就来了第二次访问,并且get数据了,成了 get --> get --> set --> set,会发生什么呢? “脏读”,第二次读到的数据不准确。很明显,第二次set 会把第一次set的值替换掉。 我们丢了一次记录!
怎么办? 加锁! 很简单我们改一下流程, 加锁 --> get --> set --> 解锁 -->加锁 --> get --> ……
我们程序在每次要get的时候,都加上一把锁,如果加不上,我们可以等待,直到能加上锁,我们再去get值, 这样就保证我们改的数据不会出现上面脏读的问题!
来看第二个问题,如何使用memcache加锁呢?
| Memcache::add | 增加一个条目到缓存服务器 |
| Memcache::addServer | 向连接池中添加一个memcache服务器 |
| Memcache::close | 关闭memcache连接 |
| Memcache::connect | 打开一个memcached服务端连接 |
| Memcache::decrement | 减小元素的值 |
| Memcache::delete | 从服务端删除一个元素 |
| Memcache::flush | 清洗(删除)已经存储的所有的元素 |
| Memcache::get | 从服务端检回一个元素 |
| Memcache::getExtendedStats | 缓存服务器池中所有服务器统计信息 |
| Memcache::getServerStatus | 用于获取一个服务器的在线/离线状态 |
| Memcache::getStats | 获取服务器统计信息 |
| Memcache::getVersion | 返回服务器版本信息 |
| Memcache::increment | 增加一个元素的值 |
| Memcache::pconnect | 打开一个到服务器的持久化连接 |
| Memcache::replace | 替换已经存在的元素的值 |
| Memcache::set | Store data at the server |
| Memcache::setCompressThreshold | 开启大值自动压缩 |
| Memcache::setServerParams | 运行时修改服务器参数和状态 |
| Memcache::setServerParams | 运行时修改服务器参数和状态 |
memcache锁的更多相关文章
- memcache锁,解决查询过多email查询为空的问题
/* 设置memcache锁,解决查询过多email查询为空的问题 Begin */ $mmc = new Memcache; $mmc->connect('127.0.0.1', 11211) ...
- memcache的add和set区别
add可以做memcache锁 使用场景:用户兑换商品,在网络不好的情况下,点击多次,set会将多次提交全纪录下来,add只会记录一次
- PHP解决抢购、秒杀、抢楼、抽奖等阻塞式高并发库存防控超量的思路方法
如今在电商行业里,秒杀抢购活动已经是商家常用促销手段.但是库存数量有限,而同时下单人数超过了库存量,就会导致商品超卖甚至库存变负数的问题. 又比如:抢购火车票.论坛抢楼.抽奖乃至爆红微博评论等也会引发 ...
- PHP项目:如何用PHP高并发检索数据库?
对于抢票.秒杀这种业务,我说说自己对这种高并发的理解吧,这里提出个人认为比较可行的几个方案: 方案一:使用队列来实现 可以基于例如MemcacheQ等这样的消息队列,具体的实现方案这么表述吧 比如有1 ...
- PHP 高并发、抢票、秒杀 解决方案
对于抢票.秒杀这种业务,我说说自己对这种高并发的理解吧,这里提出个人认为比较可行的几个方案:方案一:使用队列来实现可以基于例如MemcacheQ等这样的消息队列,具体的实现方案这么表述吧比如有100张 ...
- CentOS的Gearman安装
背景:用PHP做一些简单的上传是没有任何的问题,但是要做断点上传好像也是没有大问题,但要是并发的切片加断点上传可能就会有问题了哟.第一个问题是合并问题:如果一上传就合并,PHP老半天不返回是一个方面( ...
- php高并发秒杀解决方案
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/super_runman/article/details/53037151 在秒杀.抢火车票等地方,我 ...
- C# 高并发、抢单解决思路
高并发 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求.高并发相关常用的一些指标有响应时间(Respon ...
- 【系统架构】缓存Memcache 使用原子性操作add,实现并发锁
原文地址 memcache中Memcache::add()方法在缓存服务器之前不存在key时, 以key作为key存储一个变量var到缓存服务器.我们使用add来向服务器添加一个键值对应,如果成功则添 ...
随机推荐
- qemu kvm 虚拟化
虚拟化: KVM是一个基于Linux内核的虚拟机,属于完全虚拟化.虚拟机监控的实现模型有两类:监控模型(Hypervisor)和宿主机模型(Host-based).由于监控模型需要进行处理器调度,还需 ...
- js中正则表达式的使用
1,作用:匹配一个字符串中的一些内容2,声明和使用: 1),构造函数 var reg=new RegExp(/表达式/) 2),字面量 var reg=/表达式/ 推荐使用 eg: var reg=/ ...
- [置顶] 数据持久层(DAO)常用功能–通用API的实现
在Web开发中,一般都分3层. Controller/Action 控制层, Service/Business 服务层/业务逻辑层, Dao 数据访问层/数据持久层. 在学习和工作的实践过程中,我发现 ...
- J2EE之WebLogic Server
WebLogic是用于开发.集成.部署和管理大型分布式Web应用. 网络应用和数据库应 用的Java应用server. 将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用 ...
- java 获取黑屏信息保存在list中,截取字符执行
ArrayList<String> list1 = new ArrayList<String>(); Process p = Runtime.getRuntime().exec ...
- android EditText中的inputType
android 1.5以后添加了软件虚拟键盘的功能,所以在输入提示中将会有对应的软键盘模式 android中inputType属性在EditText输入值时启动的虚拟键盘的风格有着重要的作用.这也大大 ...
- RT:How HTTP use TCP connection
In HTTP/0.9 (not used anymore), each request uses a separate TCP connection, and the end of a respon ...
- 刨根问底:对于 self = [super init] 的思考
对象初始化有两种方式:[class new] 与 [[class alloc] init] 对于后者,有分配和初始化的过程,alloc 从应用程序的虚拟地址空间上为该对象分配足够的内存,并且将新对象的 ...
- 怎么在后台修改前台html页面的key、title、description
public void UpdateMeta(string title, string keyword, string desc) { ; i >= ; i--) { if (this.Head ...
- 纯css+js水平时间轴
自定义,并自动加载时间节点 当前时间节点居中,突出显示 时间动态无痕添加 效果图: 初始状态 时间左走到一定2016.1月后 html: <!-- 水平时间轴 --> <div id ...