锁的使用,一般情况是针对并发或者我们希望程序(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锁的更多相关文章

  1. memcache锁,解决查询过多email查询为空的问题

    /* 设置memcache锁,解决查询过多email查询为空的问题 Begin */ $mmc = new Memcache; $mmc->connect('127.0.0.1', 11211) ...

  2. memcache的add和set区别

    add可以做memcache锁 使用场景:用户兑换商品,在网络不好的情况下,点击多次,set会将多次提交全纪录下来,add只会记录一次

  3. PHP解决抢购、秒杀、抢楼、抽奖等阻塞式高并发库存防控超量的思路方法

    如今在电商行业里,秒杀抢购活动已经是商家常用促销手段.但是库存数量有限,而同时下单人数超过了库存量,就会导致商品超卖甚至库存变负数的问题. 又比如:抢购火车票.论坛抢楼.抽奖乃至爆红微博评论等也会引发 ...

  4. PHP项目:如何用PHP高并发检索数据库?

    对于抢票.秒杀这种业务,我说说自己对这种高并发的理解吧,这里提出个人认为比较可行的几个方案: 方案一:使用队列来实现 可以基于例如MemcacheQ等这样的消息队列,具体的实现方案这么表述吧 比如有1 ...

  5. PHP 高并发、抢票、秒杀 解决方案

    对于抢票.秒杀这种业务,我说说自己对这种高并发的理解吧,这里提出个人认为比较可行的几个方案:方案一:使用队列来实现可以基于例如MemcacheQ等这样的消息队列,具体的实现方案这么表述吧比如有100张 ...

  6. CentOS的Gearman安装

    背景:用PHP做一些简单的上传是没有任何的问题,但是要做断点上传好像也是没有大问题,但要是并发的切片加断点上传可能就会有问题了哟.第一个问题是合并问题:如果一上传就合并,PHP老半天不返回是一个方面( ...

  7. php高并发秒杀解决方案

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/super_runman/article/details/53037151 在秒杀.抢火车票等地方,我 ...

  8. C# 高并发、抢单解决思路

    高并发 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求.高并发相关常用的一些指标有响应时间(Respon ...

  9. 【系统架构】缓存Memcache 使用原子性操作add,实现并发锁

    原文地址 memcache中Memcache::add()方法在缓存服务器之前不存在key时, 以key作为key存储一个变量var到缓存服务器.我们使用add来向服务器添加一个键值对应,如果成功则添 ...

随机推荐

  1. Rectangle Area——LeetCode

    Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defined b ...

  2. Smartdraw世界上最流行的商业绘图软件

    Smartdraw 更多图片(5张) SmartDraw是世界上最流行的商业绘图软件.2006 年获美国政府司法部 (U.S. Department of Justice) 专用软件,2007获美国政 ...

  3. [已解决问题] Could not find class XXX referenced from method XXX.<YYY>

    导入Jar包的问题,有时候即使引入了Jar包也会报错,比如我在引入了libsvm.jar后仍然会报此错 解决方法是: Step 1. 创建User library,随便命一个名,然后把Jar包导入 S ...

  4. Windows下Postgre SQL数据库通过Slony-I 实现数据库双机同步备份

    一. 我们要实现的环境是windows xp.windows2003上安装Postgre SQL数据库,实现目的是两台数据库服务器进行数据库同步,即数据库同步更新.删除.插入等对数据库的操作. 二. ...

  5. Hadoop与HBase中遇到的问题

    1. Hadoop中遇到的问题 曾经所遇到的问题因为没有记录,所以忘了 (1)NameNode没有启动成功, 是因为你对HDFS多次格式化,导致datanode中与namenode中的VERSION文 ...

  6. 动态规划 is beginning。。。。。。。。。

    感觉动态规划非常模糊,怎么办呢??? 狂刷题吧!! !! ! !!! ! !!! !! ! ! ! .!! ..!.! PKU  PPt 动规解题的一般思路 1. 将原问题分解为子问题         ...

  7. UILable:显示多种颜色的方法

    借用别人封装好的类库,用来显示同一个UILable上的多种颜色的字. 类库可以直接在次博客中下载,下载后别忘留言哦. 类库使用:主要用了CoreText里面的东西,所以在使用类库之前需要引用CoreT ...

  8. 再回首,Java温故知新(二):Java基本数据类型

    Java作为一种强类型语言,意味着每一个变量都会有特定的类型,Java共有8种基本类型,其中有4种整型(byte.short.int.long).两种浮点型(float.double).1种字符型(c ...

  9. Java 7之多线程- Semaphore--转载

    Semaphore用于保存当前可用许可的数量.是通过共享锁实现的.根据共享锁的获取原则,Semaphore分为"公平信号量"和"非公平信号量". "公 ...

  10. 在Mac OS 中显示和隐藏系统文件

    使用终端 输入以下代码 defaults write com.apple.finder AppleShowAllFiles -bool YES 来显示隐藏了的文件 如usr/bin 把YES改成NO ...