一、CAS和GETS
Memcached从1.2.4版本号新增CAS(Check and Set)协议,用于处理同一个ITEM(key-value)被多个session更新改动时的数据一致性问题。
如果有两个session(A、B)。要同一时候改动某个key的值x,而且改动的数据是基于原来数据的一个计算的结果。session A和B同一时候得到了key的值x,session A经过计算后应该更新为y,session B经过计算后也更新为y,可是session B事实上期望的是拿到y值,并将其计算为Z后更新。
造成这个问题的解决办法就是缺少一个类似于MySQL的事务,用于数据并发改动的一致性问题。
CAS命令着眼于解决一定的并发改动问题,引入了乐观锁的概念。在试图改动某个KEY的值之前,先由GETS命令得到某个KEY的值及其版本。完毕数据操作更新数据时。使用CAS慎重更新,比較版本是否与本地的版本一致,否则放弃此次的改动。
Memcached在默认开启CAS协议后,每一个key关联有一个64-bit长度的long型惟一数值。表示该key相应value的版本。
这个数值由Memcached server产生。从1開始,且同一Memcached server不会反复。在两种情况下这个版本号数值会加1:
1、新增一个key-value对;
2、对某已有key相应的value值更新成功。删除item版本号值不会减小。
首先为了获得KEY值的版本,引入了GETS命令,能够发现GETS命令比GET命令多返回了一个数字,这个数字就是上面我们提到的KEY值的版本。
然后是CAS命令。与SET命令类似,仅仅是在最后面多了一个參数,也就是key值得版本。仅仅有版本与存储的数据版本一致时,更新操作才会生效。
set a 0 0 1 x STORED gets a VALUE a 0 1 1 //最后一位就是a的版本 x END set a 0 0 1 y STORED gets a VALUE a 0 1 2 //新增或改动之后。版本都会添加 y cas a 0 0 1 1 //cas更新的时候。不同于set操作。最后一位要指定版本,当本地版本和server版本同样的时候,更新才会有效 x EXISTS cas a 0 0 1 2 y STORED
二、stats items和stats cachedump
你以前是否也有想知道memcached里面都存了哪些数据的需求,你是否也以前在寻找一个方法能像redis一样能够遍历memcached全部的key
事实上就是应用我们平时经经常使用到的stats方法。stats方法不仅能获得memcached的一个概况信息,假设加上子命令还能够获得很多其它的更加具体的信息。如slabs,items等。
stats items命令,能够获得memcached内item组的相关信息,如分组内item的数量,踢掉次数等。
后面执行cachedump命令的时候会用到这个命令的返回信息(item组序号)。
stats cachedump命令,能够将某个slab中的items所有dump出来。第一个參数就是上面stats items返回的items组号,也就是slab的编号,第二个參数为一次显示多少个item信息,假设为0就显示这个item组的所有items,第二列就是key。
stats items STAT items:1:number 3 STAT items:1:age 943 STAT items:1:evicted 0 STAT items:1:evicted_nonzero 0 STAT items:1:evicted_time 0 STAT items:1:outofmemory 0 STAT items:1:tailrepairs 0 STAT items:1:reclaimed 0 STAT items:1:expired_unfetched 0 STAT items:1:evicted_unfetched 0 END stats cachedump 1 0 ITEM c [5 b; 1405246917 s] ITEM b [1 b; 1405246917 s] ITEM a [1 b; 1405246917 s] END
尽管应用这两个命令并不能一次显示所有的key,可是假设我们自己依据stats items的返回值自己做一次迭代,或者不过为了手动做几个item的抽样,那么就能非常好的帮助我们了解memcached中数据的情况。
本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5267863.html,如需转载请自行联系原作者