php - 基于缓存锁的一些问题。

 壮壮由之妈_245 发布于 2022-11-29 20:48

在系统中,经常看见大家使用memcached的add方法来设置锁,通过该方法的返回值来处理。

问题:假设,第一个线程进入某个方法中,向缓存中添加值来表示上锁,假设这时缓存会做两步,第一步先判断该值是否已存在,如果存在则返回false,不存在则添加返回true。但是当程序走完第一步发现值不存在时,CPU切换到另一个线程上,也走到这里,发现也不存在该值,然后这两个线程对memcached的add操作都返回了true。那所有基于这种多步操作的来实现的锁是否都没有保障呢?对于程序来说最小的”一步“是什么呢?就是保证程序在这个单位操作内不会切换到其他线程上的操作。


(题主是一个新手,所以很多地方都是猜想,并不知道memcached之类的缓存是否在查询是否存在该值时做过什么保障处理,只是为了引出该问题,知道的朋友可以解答一下,不对的地方请大家指出)

2 个回答
  • Memcached本身不存在锁和事物之类保证一致性的方案。
    不过Memcached提供了一些功能能够让开发者实现保证一致性的功能。

    在Memcached中使用gets命令获取数据时,我们还能够获得一个CAS identifier值,这个值可以用以表示当前缓存值的状况。当我们使用cas命令修改缓存值时,需要同时携带这个CAS identifier,而如果Memcached检测到CAS identifier不为当前缓存的CAS identifier,也就是缓存值已经被改变,那么Memcached会回绝这次修改。

    当然,对于你说的add命令,Memcached只要判断缓存中存在这一值,就会回绝添加,不会让第二次add还为true。

    详情请查阅Memcached文档
    https://github.com/memcached/...

    2022-11-29 21:58 回答
  • 然后这两个线程对memcached的add操作都返回了true

    不会的,memcached的add操作是个原子操作(其实大部分memcahed命令都是原子的)。

    2022-11-29 21:58 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有