快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

如何实现单机redis分布式锁-创新互联

这篇文章主要为大家展示了如何实现单机redis分布式锁,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。

创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站建设、成都网站制作、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的秭归网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

最近我们有个服务经常出现存储的数据出现重复,首先上一个系统流程图:

如何实现单机redis分布式锁

用户通过http请求可以通知任务中心结束掉自己发送的任务,这时候任务中心会通过MQ通知结束服务去结束任务保存数据,由于任务结束数据计算保存有一定延时,所以存在用户短时间内多次结束同一个任务,这时候就会导致我们结束服务对同一个任务保存多次数据。恰好我们也是用了redis,所以对于这个问题我当时想到使用分布式锁来解决,那么如何用redis实现分布式锁呢?

首先要明确一个分布式锁应具备的原则:

互斥性。在任意时刻,只有一个客户端能持有锁;不会发生死锁。即使一个客户端持有锁的期间崩溃而没有主动释放锁,也需要保证后续其他客户端能够加锁成功;加锁和解锁必须是同一个客户端;有高可用的获取锁和释放锁功能。

由于我们只使用了单机的redis,所以本文的实现不具备第四点原则。

我们这个锁的实现就包括两点:加锁、解锁。首先看加锁。先上代码:

public boolean tryGetDistributedLock(String lockKey, String requestId, int expireTime) throws Exception{
    Jedis jedis = null;
    try {
      jedis = getJedisClient();
      String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
      if (LOCK_SUCCESS.equals(result)) {
        return true;
      }
      return false;
    } finally {
      returnResource(jedis);
    }
 }

另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


本文名称:如何实现单机redis分布式锁-创新互联
网页地址:http://6mz.cn/article/ddjhej.html

其他资讯