最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot使用redisson實現(xiàn)分布式鎖的代碼示例

 更新時間:2023年06月07日 10:25:12   作者:夜空下的星  
在實際項目中,某些場景下可能需要使用到分布式鎖功能,那么實現(xiàn)分布式鎖有多種方式,常見的如mysql分布式鎖、zookeeper分布式鎖、redis分布式鎖,本文介紹springboot如何使用redisson實現(xiàn)分布式鎖,需要的朋友可以參考下

一、前言

在實際項目中,某些場景下可能需要使用到分布式鎖功能,那么實現(xiàn)分布式鎖有多種方式,常見的如mysql分布式鎖、zookeeper分布式鎖、redis分布式鎖,從效率上講,redis無疑是性能最好的,但也會存在一些問題

1.獲取鎖的線程在執(zhí)行任務(wù)的過程中掛掉,來不及釋放鎖,這塊資源將會永遠被鎖?。ㄋ梨i),別的線程再也別想進來,因此我們需要給key加個過期時間,保證這把鎖要在一定時間后自動釋放。

2.高并發(fā)情況下redis分布式鎖永久失效 的問題(一個線程可能刪除了別的線程的鎖)
假設(shè)線程 A 可能某些原因執(zhí)行的很慢很慢,到達過期時間都沒執(zhí)行完,這時候鎖過期自動釋放,此時線程 B 得到了鎖;

隨后,線程 A 執(zhí)行完了任務(wù),線程 A 隨之釋放鎖。但這時候線程 B 還沒執(zhí)行完,線程A實際上 刪除的是線程 B加的鎖
解決方法:
可以在 釋放鎖之前做一個判斷,驗證當前的鎖是不是自己加的鎖

3.可能出現(xiàn)并發(fā)情況
當線程 A 執(zhí)行的很慢很慢,到達過期時間都沒執(zhí)行完,這時候鎖過期自動釋放,線程 B得到了鎖。此時就有多個線程在訪問同步代碼塊。
解決方法:我們可以使用redisson實現(xiàn),內(nèi)部實現(xiàn)鎖續(xù)期功能。

二、實現(xiàn)

1.在springboot中引入redisson依賴包

 <dependency>
    		<groupId>org.redisson</groupId>
    		<artifactId>redisson-spring-boot-starter</artifactId>
    		<version>3.10.6</version>
		</dependency>

2.配置redisson,代碼如下:

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
@Configuration
public class RedissonConfig {
	@Bean(destroyMethod = "shutdown")
	public RedissonClient redisson() throws IOException{
		//RedissonClient redisson = Redisson.create(Config.fromYAML(new //ClassPathResource("redisson-single.yml").getInputStream()));
		Config config = new Config();
        config.useSingleServer()
        .setAddress("redis://192.168.6.52:6379").setPassword("123456")
        .setRetryInterval(5000)
        .setTimeout(10000)
        .setConnectTimeout(10000);
        return Redisson.create(config);
   }
}

3.我們以商品庫存為例:

import java.util.concurrent.TimeUnit;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.suntree.entity.Price;
import com.suntree.mapper.PriceMapper;
@Service
public class ProductService {
	@Autowired
	RedissonClient redissonClient;
	@Autowired
	ProductMapper productMapper;
	@Transactional
	public String descreaseProduct(String productId,Integer quanlity) {
		String key="des_product_lock:"+productId;
		RLock lock=redissonClient.getLock(key);
		lock.lock();
		Product product =productMapper.selectById(productId);
		if(product ==null) {
			return "產(chǎn)品未找到";
		}
		String result="";
		try {
			if(product .getQuanlity()==0) {
				return "當前數(shù)量為0,不能再扣了?。?;
			}
			product .setQuanlity(product .getQuanlity()-1);
			productMapper.updateById(product );
			result = "當前數(shù)量:" + product .getQuanlity();
			System.err.println(result);
		}catch (Exception e) {
			System.err.println(e.getMessage());
			throw new RuntimeException("扣庫存操作失敗了");
		}finally {
			lock.unlock();
		}
		return result;
	}
}

這就是實現(xiàn)分布式鎖常見場景。

4.接著我們可以在controller層調(diào)用,我們可以模擬多線程操作,看扣庫存是否會有問題。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.suntree.service.ProductService ;
@RestController
@RequestMapping("/product")
public class ProductController {
	@Autowired
	ProductService productService ;
	@GetMapping("/descrease")
	public String descreaseProduct() {
		return productService .descreaseProduct("2020-2020", 200);
	}
}

大家可以自己嘗試下。

到此這篇關(guān)于Springboot使用redisson實現(xiàn)分布式鎖的代碼示例的文章就介紹到這了,更多相關(guān)Springboot redisson實現(xiàn)分布式鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JAVA 線程通信相關(guān)知識匯總

    JAVA 線程通信相關(guān)知識匯總

    這篇文章主要介紹了JAVA 線程通信相關(guān)知識,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-06-06
  • IDEA?tomcat啟動項目方式

    IDEA?tomcat啟動項目方式

    這篇文章主要介紹了IDEA?tomcat啟動項目方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • springmvc前臺向后臺傳值幾種方式總結(jié)(從簡單到復(fù)雜)

    springmvc前臺向后臺傳值幾種方式總結(jié)(從簡單到復(fù)雜)

    今天小編就為大家分享一篇springmvc前臺向后臺傳值幾種方式總結(jié)(從簡單到復(fù)雜),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • Java枚舉的使用與反射應(yīng)用方式

    Java枚舉的使用與反射應(yīng)用方式

    枚舉類型是一種特殊的類,限定為固定實例集合,且是類型安全和線程安全的,枚舉類型不可繼承,但可以添加屬性和方法,支持單例模式,枚舉常量可以通過反射獲取和操作,提供了靈活性和擴展性
    2024-09-09
  • Java設(shè)計模式之橋接模式詳解(Bridge Pattern)

    Java設(shè)計模式之橋接模式詳解(Bridge Pattern)

    橋接模式是一種結(jié)構(gòu)型設(shè)計模式,旨在將抽象部分與其實現(xiàn)部分分離,從而使兩者可以獨立地變化,橋接模式通過組合關(guān)系代替繼承關(guān)系,將抽象和實現(xiàn)解耦,使代碼更具擴展性和維護性
    2025-02-02
  • Java集合的組內(nèi)平均值的計算方法總結(jié)

    Java集合的組內(nèi)平均值的計算方法總結(jié)

    在Java中,經(jīng)常需要對集合進行各種操作,其中之一就是計算集合的組內(nèi)平均值,本文將介紹如何使用Java集合來計算組內(nèi)平均值,并提供一些示例代碼和實用技巧
    2024-08-08
  • 堆排序算法的講解及Java版實現(xiàn)

    堆排序算法的講解及Java版實現(xiàn)

    這篇文章主要介紹了堆排序算法的講解及Java版實現(xiàn),堆排序基于堆這種數(shù)據(jù)結(jié)構(gòu),在本文中對堆的概念也有補充介紹,需要的朋友可以參考下
    2016-05-05
  • java中的4種循環(huán)方法示例詳情

    java中的4種循環(huán)方法示例詳情

    大家好,本篇文章主要講的是java中的4種循環(huán)方法示例詳情,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Java 多線程使用要點分析

    Java 多線程使用要點分析

    這篇文章主要介紹了Java 多線程使用要點分析的相關(guān)資料,Java 多線程開發(fā)需要主要的細節(jié)問題很多,這里就說下,需要的朋友可以參考下
    2016-12-12
  • vue+springboot+webtrc+websocket實現(xiàn)雙人音視頻通話會議(最新推薦)

    vue+springboot+webtrc+websocket實現(xiàn)雙人音視頻通話會議(最新推薦)

    這篇文章主要介紹了vue+springboot+webtrc+websocket實現(xiàn)雙人音視頻通話會議,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-05-05

最新評論

潮安县| 昭苏县| 奈曼旗| 临邑县| 蓬安县| 宜宾市| 遂川县| 嘉鱼县| 巫山县| 济南市| 芦溪县| 陆河县| 肇州县| 长治县| 新源县| 始兴县| 泰兴市| 清河县| 兴文县| 衡水市| 沙坪坝区| 沂南县| 界首市| 台安县| 贵德县| 会理县| 扎赉特旗| 北碚区| 启东市| 苗栗市| 汨罗市| 唐海县| 娄底市| 南投县| 安溪县| 白朗县| 缙云县| 融水| 西林县| 嘉义县| 喀喇沁旗|