memcached的两种并发处理

add方法:memcached的add函数是原子操作,因此就不可能有两个并行add操作同时进行,同时,如果对未时效的key再次add操作的时候会返回false。

MemCachedClient client = new MemCachedClient();
System.out.println(client.add("key1",1,new Date(1*1000)));
System.out.println(client.add("key1", 2,new Date(2*1000)));
Thread.sleep(2*1000);
System.out.println(client.add("key1",3,new Date(3*1000)));

执行结果:

true
false
true

次方法要求在key1不过期的时间内,不能进行第二次操作,这个一般可用于防止单用户重复提交操作。还有一个问题就是add是有时效的,如果缓存时间过完之后,仍可以再次add;如果把key1永久有效,就会造成缓存满后,造成key1溢出,被其他值取代。

gets/cas方法:此方法是利用了一个乐观锁的概念,就是每次对一个key设值的时候,会更改此值的版本号,当你get值时,同时获取一个版本号casUnique,如果期间有其他操作更改了此值,那么版本号也相应+1,当你set值的时候,他会比较你的get值时的版本号,是否正确,如果不正确set返回false;

MemCachedClient client = new MemCachedClient();
client.set("key1", 1 );
MemcachedItem item1 = client.gets("key1");
System.out.println("key1 value:" + item1.value + " casUnique:" + item1.casUnique);
System.out.println(client.cas("key1",  2, item1.casUnique));
MemcachedItem item2 = client.gets("key1");
System.out.println("key1 value:" + item2.value + " casUnique:" + item2.casUnique);
System.out.println(client.cas("key1",  2, item1.casUnique));

执行结果:

key1 value:1 casUnique:55
true
key1 value:2 casUnique:56
false

这样会有效防止丢失更新、脏读的状况。

你可能感兴趣的:(java,并发,memcached)