php - 基于缓存锁的一些问题。
怪我咯
怪我咯 2017-04-11 09:46:39
0
2
405

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

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


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

怪我咯
怪我咯

走同样的路,发现不同的人生

Antworte allen(2)
Ty80

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

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

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

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

巴扎黑

然后这两个线程对memcached的add操作都返回了true

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

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage