实现原理:
memcached带有add函数,利用add函数的特性即可实现分布式锁。add和set的区别在于:如果多线程并发set,则每个set都会成功,但最后存储的值以最后的set的线程为准。而add的话则相反,add会添加第一个到达的值,并返回true,后续的添加则都会返回false。利用该点即可很轻松地实现分布式锁。
优点
并发高效。
缺点
(1)memcached采用列入LRU置换策略,所以如果内存不够,可能导致缓存中的锁信息丢失。
(2)memcached无法持久化,一旦重启,将导致信息丢失。
代码的相关配置见上一篇文章,这里只写controller层的使用如下:
import lombok.extern.slf4j.Slf4j;
import net.spy.memcached.MemcachedClient;
import net.spy.memcached.internal.OperationFuture;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
public class testController {
@Autowired
private MemcachedClient client;
/**
* 实现分布式锁
* @return
*/
@GetMapping("/get2")
public boolean get1(){
String key="key1";
Object obj="刘备";
if (client.get(key) == null) {
boolean bl = client.add(key, 5, obj).getStatus().isSuccess(); // exp 5 是5秒之后锁会自动解开
if ( bl) {
log.info("成功获得锁--------------");
log.info(client.get("key1").toString());
return true;
}else{
log.info("没有获得锁--------------");
return false;
}
}
log.info("没有获得锁--------------");
return false;
}
}
欢迎批评指正。
版权声明:本文为aaaa00原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。