memcache cas 乐观锁

什么是CAS协议

Memcached于1.2.4版本新增CAS(Check and Set)协议类同于Java并发的CAS(Compare and Swap)原子操作,处理同一item被多个线程更改过程的并发问题。

在Memcached中,每个key关联有一个64-bit长度的long型惟一数值,表示该key对应value的版本号。这个数值由Memcached server产生,从1开始,且同一Memcached server不会重复。在两种情况下这个版本数值会加1:1、新增一个key-value对;2、对某已有key对应的value值更新成功。删除item版本值不会减小。

 

php使用

Memcached::cas()执行一个“检查并设置”的操作,因此,它仅在当前客户端最后一次取值后,该key 对应的值没有被其他客户端修改的情况下, 才能够将值写入。检查是通过cas_token参数进行的, 这个参数是Memcach指定给已经存在的元素的一个唯一的64位值, 怎样获取这个值请查看Memcached::get*() 系列方法的文档。注意:这个值作为double类型是因为PHP的整型空间限制。

译注:这是Memcached扩展比Memcache扩展一个非常重要的优势, 在这样一个系统级(Memcache自身提供)的冲突检测机制(乐观锁)下, 我们才能保证高并发下的数据安全。

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);

do {
    /* 获取ip列表以及它的标记 */
    $ips = $m->get('ip_block', null, $cas);
    /* 如果列表不存在, 创建并进行一个原子添加(如果其他客户端已经添加, 这里就返回false)*/
    if ($m->getResultCode() == Memcached::RES_NOTFOUND) {
        $ips = array($_SERVER['REMOTE_ADDR']);
        $m->add('ip_block', $ips);
    /* 其他情况下,添加ip到列表中, 并以cas方式去存储, 这样当其他客户端修改过, 则返回false */
    } else { 
        $ips[] = $_SERVER['REMOTE_ADDR'];
        $m->cas($cas, 'ip_block', $ips);
    }   
} while ($m->getResultCode() != Memcached::RES_SUCCESS);

?>

  

转载于:https://www.cnblogs.com/iamdoufu/p/4632923.html

回答: 乐观锁和悲观锁是实现并发控制的两种主要手段。乐观锁适用于读多写少的情况,它不依赖于数据库中的锁机制,而是通过在表中新增一个版本号来实现。乐观锁的特点是无论是否开启事务,都可以在逻辑上实现乐观锁乐观锁的开销比悲观锁小,但一旦发生锁冲突需要回滚,开销比较大。乐观锁适合用在取锁失败概率较小的场景,可以提升系统的并发性能。\[2\] 悲观锁适用于写多读少的情况,它需要依赖数据库的锁机制来实现。在事务中使用select ... for update操作来实现悲观锁,可以最大程度地保证数据操作的独占性。悲观锁的特点是需要开启事务,并且会对扫描过的行进行锁定,这可能导致性能问题。悲观锁主要用于数据争用激烈的环境,以及在锁保护数据的成本低于回滚事务的成本的情况下使用。\[3\] 需要注意的是,乐观锁和悲观锁不仅仅存在于关系型数据库系统中,还存在于其他系统中,如hibernate、tair、memcache等。因此,不应该将乐观锁、悲观锁与其他数据库锁进行对比。它们是一种思想,用于实现并发控制。\[1\] #### 引用[.reference_title] - *1* [MySql悲观锁(行锁)和乐观锁](https://blog.csdn.net/weixin_45433031/article/details/120838045)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [MySQL中的悲观锁和乐观锁](https://blog.csdn.net/lamp_yang_3533/article/details/79180370)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值