Redis分布式鎖實現

2021-10-03 04:35:07 字數 1775 閱讀 7390

關閉訂單方法

private void closeorder(string lockname),threadname:{}",const.redis_lock.close_order_task_lock,thread.currentthread().getname());

int hour = integer.parseint(propertiesutil.getproperty("close.order.task.time.hour","2"));

iorderservice.closeorder(hour);

redisshardedpoolutil.del(const.redis_lock.close_order_task_lock);

log.info("釋放{},threadname:{}",const.redis_lock.close_order_task_lock,thread.currentthread().getname());

log.info("******************************=");

}

第乙個版本的:

public void closeordertaskv2()else",const.redis_lock.close_order_task_lock);

}log.info("關閉訂單定時任務結束");

}

這裡如果在redisshardedpoolutil.setnx執行完成後伺服器掛機,進不去closeorder就會發生死鎖。

可以使用@predestroy註解,使用tomcat的shutdown命令後,會呼叫它。 

@predestroy

public void dellock()

但是,一旦使用kill -9殺掉tomcat程序,以上方法就無效了。

迭代公升級後-雙重防死鎖,使用setnx + getset兩個原子性方法

@scheduled(cron="0 */1 * * * ?")

public void closeordertaskv3()elseelse",const.redis_lock.close_order_task_lock);

}}else",const.redis_lock.close_order_task_lock);}}

log.info("關閉訂單定時任務結束");

}

當然,我們可以最便捷的使用redisson實現分布式鎖。**如下

public void closeordertaskv4(),threadname:{}",const.redis_lock.close_order_task_lock,thread.currentthread().getname());

int hour = integer.parseint(propertiesutil.getproperty("close.order.task.time.hour","2"));

iorderservice.closeorder(hour);

}else,threadname:{}",const.redis_lock.close_order_task_lock,thread.currentthread().getname());

}} catch (interruptedexception e) finally

lock.unlock();

log.info("redisson分布式鎖釋放鎖");

}}

分布式鎖 使用Redis實現分布式鎖

關於分布式鎖的實現,我的前一篇文章講解了如何使用zookeeper實現分布式鎖。關於分布式鎖的背景此處不再做贅述,我們直接討論下如何使用redis實現分布式鎖。關於redis,筆主不打算做長篇大論的介紹,只介紹下redis優秀的特性。支援豐富的資料型別,如string list map set zs...

redis實現分布式鎖

隨便 系統越來越大,各功能模組除了垂直切割以外,同時也得做集群處理,那麼問題來了,在多執行緒情況下對於資源的競爭就需要乙個統一的訪問限制。以選課系統為例子,集群中各節點對課程可選數量同時操作,這裡就需要同步了,否則會導致最後選到的數量比可選的數量大,這裡我們的分布式鎖就派上用場了。利用redis來實...

redis實現分布式鎖

分布式鎖可以基於很多種方式實現,比如zookeeper redis.不管哪種方式,他的 基本原理是不變的 用乙個狀態值表示鎖,對鎖的占用和釋放通過狀態值來標識。1 使用redis的setnx命令實現分布式鎖 1 實現的原理 redis為單程序單執行緒模式,採用佇列模式將併發訪問變成序列訪問,且多客戶...