Heim > Fragen und Antworten > Hauptteil
在系统中,经常看见大家使用memcached的add方法来设置锁,通过该方法的返回值来处理。
问题:假设,第一个线程进入某个方法中,向缓存中添加值来表示上锁,假设这时缓存会做两步,第一步先判断该值是否已存在,如果存在则返回false,不存在则添加返回true。但是当程序走完第一步发现值不存在时,CPU切换到另一个线程上,也走到这里,发现也不存在该值,然后这两个线程对memcached的add操作都返回了true。那所有基于这种多步操作的来实现的锁是否都没有保障呢?对于程序来说最小的”一步“是什么呢?就是保证程序在这个单位操作内不会切换到其他线程上的操作。
(题主是一个新手,所以很多地方都是猜想,并不知道memcached之类的缓存是否在查询是否存在该值时做过什么保障处理,只是为了引出该问题,知道的朋友可以解答一下,不对的地方请大家指出)
PHP中文网2017-04-11 09:48:39
Memcached本身不存在锁和事物之类保证一致性的方案。
不过Memcached提供了一些功能能够让开发者实现保证一致性的功能。
在Memcached中使用gets命令获取数据时,我们还能够获得一个CAS identifier值,这个值可以用以表示当前缓存值的状况。当我们使用cas命令修改缓存值时,需要同时携带这个CAS identifier,而如果Memcached检测到CAS identifier不为当前缓存的CAS identifier,也就是缓存值已经被改变,那么Memcached会回绝这次修改。
当然,对于你说的add命令,Memcached只要判断缓存中存在这一值,就会回绝添加,不会让第二次add还为true。
详情请查阅Memcached文档
https://github.com/memcached/...
巴扎黑2017-04-11 09:48:39
然后这两个线程对memcached的add操作都返回了true
不会的,memcached的add操作是个原子操作(其实大部分memcahed命令都是原子的)。