memcache 实现分布式锁

实现原理:

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版权协议,转载请附上原文出处链接和本声明。