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来向服务器添加一个键值对应,如果成功则添 ...
随机推荐
- ie中弹出框中元素的定位
用selenium在ie8浏览器中定位一个弹出框时,直接用ie developer tools可能不一定能定位到,有一个解决的办法是直接在url后面加上#noHide,刷新后,然后再用ie devel ...
- N-Queens II——Leetcode
Follow up for N-Queens problem. Now, instead outputting board configurations, return the total numbe ...
- Construct Binary Tree from Inorder and Postorder Traversal——LeetCode
Given inorder and postorder traversal of a tree, construct the binary tree. 题目大意:给定一个二叉树的中序和后续序列,构建出 ...
- SRM 399(1-250pt)
DIV1 250pt 题意:给出一个size不超过50的数组a和整数n,求x,y,z使得|n - x*y*z|最小,且x,y,z均不再数组a中.若有多组xyz使得|n-x*y*z|最小,输出字典序最小 ...
- php微信支付接口开发程序(一)
阅读对象 本文阅读对象:商户系统(在线购物平台.人工收银系统.自动化智能收银系统或其他)集成微信支付涉及的技术架构师,研发工程师,测试工程师,系统运维工程师. 支付模式 1. 刷卡支付 刷卡支付是用户 ...
- JDBC 之 事务
1.概念:事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功. 2.数据库开启事务的命令dtl: Start transaction开启事务 Rollback回滚事务(撤销) ...
- ok6410 u-boot-2012.04.01移植六完善MLC NAND支持
继ok6410 u-boot-2012.04.01移植四.五后,开发板基本已支持MLC NAND,支持DM9000.但是通过NAND命令更新u-boot到NAND,还存在问题,需要根据u-boot的n ...
- Amoeba for MySQL 非常好用的mysql集群软件
http://docs.hexnova.com/amoeba/ Amoeba for MySQL致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当query 路由功能,专 ...
- HDU 3018 Ant Trip
九野的博客,转载请注明出处: http://blog.csdn.net/acmmmm/article/details/10858065 题意:n个点m条边的无向图,求用几笔可以把所有边画完(画过的边 ...
- QT程序库
实际上,QT不仅仅是一个巨大的程序库,而是7个程序库,还包括许多使用工具,qmake是其中的一个.如今,术语GUI工具包代表的东西的用途不再仅仅是系统提供的那么一个小部分(GUI界面).尤其是QT ...