1. 程式人生 > >(詳細可用)分散式鎖實現 Java + redis (一)

(詳細可用)分散式鎖實現 Java + redis (一)

/** * * * redis 實現分散式鎖 * Created by zhuangjiesen on 2017/12/8. */ public class JedisDistributedLock implements DistributedLock , ApplicationContextAware, ApplicationListener<ContextRefreshedEvent> { private ApplicationContext applicationContext; private static ThreadLocal<String> lockKeys = new
ThreadLocal<>(); private static ConcurrentHashMap<String , Object> disLocks = new ConcurrentHashMap<>(); private JedisPool jedisPool; @Override public void lock(String key) { Jedis jedis = jedisPool.getResource(); Long count = jedis.setnx( key , "1"
); if (count != null && count.longValue() > 0) { System.out.println("--lock--1. 獲取到分散式鎖......."); lockKeys.set(key); } else { System.out.println("--lock--2. not .......未獲取到分散式鎖......."); Object lock = null; if ((lock
= disLocks.get(key)) == null) { // double check synchronized (disLocks) { if ((lock = disLocks.get(key)) == null) { lock = new Object(); disLocks.put(key , lock); } } } synchronized (lock) { try { //執行緒休眠 lock.wait(); System.out.println("-------------------------"); lock(key); } catch (InterruptedException e) { e.printStackTrace(); } } } } @Override public boolean tryLock(String key) { Jedis jedis = jedisPool.getResource(); Long count = jedis.setnx( key , "1"); if (count != null && count.longValue() > 0) { return true; } return false; } @Override public void unLock() { try { String key = lockKeys.get(); unLock(key); } finally { lockKeys.remove(); } } @Override public void unLock(String key) { Jedis jedis = jedisPool.getResource(); Long del = jedis.del(key); Object lock = null; if (del != null && del.longValue() > 0 && (lock = disLocks.remove(key)) != null) { //解鎖 synchronized (lock) { lock.notifyAll(); } } System.out.println("--unLock--3. key : " + key + " del : " + del); } @Override public void scheduleTask() { //執行輪訓死鎖問題 } @Override public void setApplicationContext(ApplicationContext context) throws BeansException { this.applicationContext = context; } /* * spring 容器載入完畢呼叫 * * */ @Override public void onApplicationEvent(ContextRefreshedEvent event) { if (event.getApplicationContext().getParent() == null) { jedisPool = applicationContext.getBean(JedisPool.class); Jedis jedis = jedisPool.getResource(); Thread t1 = new Thread(new Runnable() { @Override public void run() { jedis.subscribe(new JedisPubSub() { @Override public void onMessage(String channel, String message) { super.onMessage(channel, message); Object lock = null; System.out.println(" 1. channel : " + channel); System.out.println(" 2. message : " + message); if ("[email protected]__:del".equals(channel) && (lock = disLocks.remove(message)) != null) { //解鎖 synchronized (lock) { lock.notifyAll(); } } } } , "[email protected]__:del"); } }); t1.start(); } } }

相關推薦

(詳細可用)分散式實現 Java + redis ()

/** * * * redis 實現分散式鎖 * Created by zhuangjiesen on 2017/12/8. */ public class JedisDistributedLock implements DistributedLock , ApplicationContextAwa

Redisson 分散式實現分析(

  設計分散式鎖要注意的問題 互斥 分散式系統中執行著多個節點,必須確保在同一時刻只能有一個節點的一個執行緒獲得鎖,這是最基本的一點。 死鎖 分散式系統中,可能產生死鎖的情況要相對複雜一些。分散式系統是處在複雜網路環境中的,當一個節點獲取到鎖,如果它在釋放鎖之前掛掉了,

Redis系列-生產應用篇-分散式(5)-單程序Redis分散式Java實現(Redisson使用與底層實現)-原子

Redisson單程序Redis分散式樂觀鎖的使用與實現 本文基於Redisson 3.7.5 4. 原子鎖類 Redisson中實現了兩種原子鎖類:RAtomicLong和RAtomicDouble,還有RLongAdder和RDoubleAdder RA

分散式):基於redis分散式實現

隨著業務越來越複雜,應用服務都會朝著分散式、叢集方向部署,而分散式CAP原則告訴我們,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分割槽容錯性),三者不可得兼。很多場景中,需要使用分散式事務、分散式鎖等技術來

【轉】基於Redis Lua指令碼實現分散式Java實現

最近專案中需要用到一個分散式的鎖,考慮到基於會話節點實現的zookeeper鎖效能不夠,於是想使用redis來實現一個分散式的鎖。看了網上的幾個實現方案後,發現都不夠嚴謹。比如這篇:用Redis實現分散式鎖裡面設計的鎖有個最大的問題是鎖的超時值TTL會一直被改寫

Redis分散式實現原理 java

/** * 鎖在給定的等待時間內空閒,則獲取鎖成功 返回true, 否則返回false * @param subKey * @param timeout 如果timeout=0,取不到鎖時,不等待,直接返回. * @param unit * @return */ public bo

dubbo 常用的基於redis分散式實現

  小弟本著先會用在學習原理的原則 先用了dubbo 現在在實際業務中 因為分散式專案做了叢集,需要用的分散式鎖,就用到了基於redis的分散式鎖,廢話不多說,先來程式碼: package com.tiancaibao.utils; import org.slf4j.Logger

Java分散式,搞懂分散式實現看這篇文章就對了

隨著微處理機技術的發展,人們只需花幾百美元就能買到一個CPU晶片,這個晶片每秒鐘執行的指令比80年代最大的大型機的處理機每秒鐘所執行的指令還多。如果你願意付出兩倍的價錢,將得到同樣的CPU,但它卻以更高的時鐘速率執行。因此,最節約成本的辦法通常是在一個系統中使用集中在一起的大量的廉價CPU。所以,傾向

jedisLock—redis分散式實現

一、使用分散式鎖要滿足的幾個條件: 系統是一個分散式系統(關鍵是分散式,單機的可以使用ReentrantLock或者synchronized程式碼塊來實現) 共享資源(各個系統訪問同一個資源,資源的載體可能是傳統關係型資料庫或者NoSQL) 同步訪問(即有很多個程序同事

Redis分散式 實現秒殺系統 SET命令實現

基於Redis命令:SET key valueNX EX max-lock-time   可適用於redis單機和redis叢集模式 1.SET命令是原子性操作,NX指令保證只要當key不存在時才會設定value 2.設定的value要有唯一性,來確保鎖不會被誤刪(

ZooKeeper完全解析(七) 使用ZooKeeper實現分散式Java實現

  在上一節中,我們講了使用ZooKeeper來實現分散式鎖的原理,連結為  ZooKeeper完全解析(六) 使用ZooKeeper實現分散式鎖之實現原理 ,這一節我們來講一下如何使用Java來實現分散式鎖:   在實現原理中,我們把使用ZooKeeper實現分散式鎖分成

Redis分散式實現簡單秒殺功能

這版秒殺只是解決瞬間訪問過高伺服器壓力過大,請求速度變慢,大大消耗伺服器效能的問題。 主要就是在高併發秒殺的場景下,很多人訪問時並沒有拿到鎖,所以直接跳過了。這樣就處理了多執行緒併發問題的同時也保證了伺服器的效能的穩定。 接下來我們使用redis的分散式鎖來進行枷鎖處理: 我們可以在進入下單的方法後將核

基於 Redis分散式實現及踩坑案例

關於分散式鎖的實現,目前常用的方案有以下三類:資料庫樂觀鎖;基於分散式快取實現的鎖服務,典型代表有 Redis 和基於 Redis 的 RedLock;基於分散式一致性演算法實現的鎖服務,典型代表有 ZooKeeper、Chubby 和 ETCD。本場 Chat 將介紹基於

架構師日記——基於redis分散式實現

很久之前有講過併發程式設計中的鎖 併發程式設計的鎖機制:synchronized和lock 。在單程序的系統中,當存在多個執行緒可以同時改變某個變數時,就需要對變數或程式碼塊做同步,使其在修改這種變數時能夠線性執行消除併發修改變數。而同步的本質是通過鎖來實現的。為了實現多個執行緒在一個時

redis學習之五】基於redis分散式實現

    在單個JVM中,我們可以很方便的用sychronized或者reentrantLock在資源競爭時進行加鎖,保證高併發下資料執行緒安全。但是若是分散式環境下,多個JVM同時對一個資源進行競爭時,我們該如何保證執行緒安全呢?分散式鎖便能實現我們的要求。   &n

redis分散式實現-面試題

1 加鎖(key自定義,value為uuid) Boolean setNX(byte[] key, byte[] value); 2 設定過期時間(key,timeout,unit) public Boolean expire(K key, final long t

基於redis分散式實現“秒殺”

最近在專案中遇到了類似“秒殺”的業務場景,在本篇部落格中,我將用一個非常簡單的demo,闡述實現所謂“秒殺”的基本思路。 業務場景 所謂秒殺,從業務角度看,是短時間內多個使用者“爭搶”資源,這裡的資源在大部分秒殺場景裡是商品;將業務抽象,技術角度看,秒殺就是

分散式,使用redis還是zookeeper來實現? ---上篇

背景: 專案終於在使用redis的redLock演算法出現了生產問題,就是master-slaver模式,執行緒一進入lock,而master準備寫進slaver的時候down了,而另外一個執行緒進入了lock,這時候就出現了併發的情況出現,雖然設定了過期時間,但是這時候資料已經不一致了

分散式實現--基於zookeeper和redis的兩種方案

通過實現Watch介面,實現process(WatchedEvent event)方法來實施監控,使CountDownLatch來完成監控,在等待鎖的時候使用CountDownLatch來計數,等到後進行countDown,停止等待,繼續執行。以下整體流程基本與上述描述流程一致,只是在監聽的時候使用的是Cou

SpringMVC+Redis實現分散式實現秒殺功能

1.實現分散式鎖的幾種方案 1.Redis實現 (推薦) 2.Zookeeper實現 3.資料庫實現 Redis實現分散式鎖 * * 在叢集等多伺服器中經常使用到同步處理一下業務,這是普通的事務是滿足不了業務需求,需要分散