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

Spring?boot?整合?Redisson實(shí)現(xiàn)分布式鎖并驗(yàn)證功能

 更新時(shí)間:2022年05月19日 10:48:59   作者:幻夜星辰  
這篇文章主要介紹了Spring?boot?整合?Redisson實(shí)現(xiàn)分布式鎖并驗(yàn)證,redisson是官方推薦的分布式鎖實(shí)現(xiàn)方案,采用redis自身的原子命令和lua腳本來實(shí)現(xiàn),需要的朋友可以參考下

簡述

整篇文章寫的比較粗糙,大佬看了輕噴。前半部分 是整合spring boot和redisson, 后半部分是驗(yàn)證分布式鎖。在整個過程中遇見了不少的問題,在此做個記錄少走彎路

redisson是官方推薦的分布式鎖實(shí)現(xiàn)方案,采用redis自身的原子命令和lua腳本來實(shí)現(xiàn)

1. 在idea中新建spring boot工程并引入所需依賴

idea中直接新建一個spring boot項(xiàng)目即可,再在pom.xml中引入所需依賴,依賴信息如下

  <!-- redis所需 -->
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!-- web頁面訪問所需 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-data-25</artifactId>
    <version>3.16.4</version>
</dependency>
<!-- Redisson所需依賴 -->
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.16.4</version>
</dependency>

2. 編寫相關(guān)代碼實(shí)現(xiàn)

采用一個票卷庫存來進(jìn)行鎖的驗(yàn)證,需要預(yù)先在redis里面設(shè)置一個key為ticket的信息,值為100之類的數(shù)字即可 代碼示例編寫:

@RestController
@Slf4j
public class RedisController {
    // spring boot 操作redis的模板方法類
    @Autowired
    private StringRedisTemplate redisTemplate;

    // redisson操作bean
    @Resource
    private Redisson redisson;
    @RequestMapping("/lock")
    public String deductTicket(){
        String lockKey = "ticket";
        
        // 在spring boot 2.0.6版本中整合的redisson,key和鎖不能一樣
        // redis setnx 操作,此處的lockKey在后面追加1是為了避免redisson鎖時(shí)報(bào)錯, 需要和待鎖住的數(shù)據(jù)的key信息不同
        RLock lock = redisson.getLock(lockKey+"1");
        try {
            lock.lock();
            int ticketCount = Integer.parseInt(redisTemplate.opsForValue().get(lockKey));
            if (ticketCount > 0) {
                int realTicketCount = ticketCount - 1;
                log.info("扣除成功:剩余票數(shù):" + realTicketCount);
                redisTemplate.opsForValue().set(lockKey, realTicketCount + "");
                return realTicketCount + "";
            } else {
                log.error("扣除失敗");
                return "error";
            }
            return "end";
        } finally {
            lock.unlock();
        }
    }
}

application.yml配置信息如下

server:
  port: 8899  # web服務(wù)對外端口
  redis:
    host: 192.168.0.160 #redis地址
    database: 0 #采用的庫編號
    port: 6379 #redis端口
    password: 123456 #redis密碼,如果redis沒有設(shè)置密碼直接去掉該配置不寫空

3. 模擬實(shí)際環(huán)境驗(yàn)證

一個簡單的分布式鎖驗(yàn)證的demo完成了,比較粗糙,驗(yàn)證的方式有多樣的,可以采用java本身的多線程進(jìn)行驗(yàn)證,也可以類似實(shí)際環(huán)境部署多個節(jié)點(diǎn)來驗(yàn)證,這里為了技術(shù)的廣度的一個應(yīng)用,采用后面的方式。

3.1 下載idea的docker插件并配置相關(guān)鏡像信息

  • docker插件下載

  • idea配置docker連接虛擬機(jī)上的docker

    開啟docker遠(yuǎn)程連接

vim /usr/lib/systemd/system/docker.service

找到 ExecStart,在最后面添加 -H tcp://0.0.0.0:2375

重啟docker

systemctl daemon-reload 
systemctl start docker

開放端口

firewall-cmd --zone=public --add-port=2375/tcp --permanent

idea配置docker連接

配置完成后可在idea中看到連接的docker鏡像、容器相關(guān)信息

3.2 將spring boot打包的jar構(gòu)建為docker鏡像

編寫Dockerfile

在工程目錄中新建Dockerfile,與pom.xml文件同級

Dockerfile內(nèi)容如下

FROM openjdk:8-jdk-alpine # 指定基礎(chǔ)鏡像為jdk8
ADD target/spring-0.0.1-SNAPSHOT.jar app.jar #將打包的jar包放入鏡像中并重命名為app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]  #啟動jar包

在pom.xml中添加插件信息

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>1.0.0</version>
    <configuration>
        <imageName>com.demo/${project.artifactId}</imageName>
        <dockerDirectory></dockerDirectory>
        <resources>
            <resource>
                <targetPath>/</targetPath>
                <directory>${project.build.directory}</directory>
                <include>${project.build.finalName}.jar</include>
            </resource>
        </resources>
    </configuration>
</plugin>

idea添加docker構(gòu)建配置

此處操作的目的是為了便于在idea中直接構(gòu)建鏡像啟動容器

配置信息如下

(1)Dockerfile文件位置

(2)鏡像tag

(3)構(gòu)建成功后啟動的容器名稱

(4)端口映射 宿主機(jī)端口:容器內(nèi)端口

jar包打好之后可直接點(diǎn)擊

如果沒有問題idea的docker控制臺會輸出容器內(nèi)啟動相關(guān)日志信息

此處為了驗(yàn)證分布式鎖,需要兩個節(jié)點(diǎn)以上,所以這里我手動啟動了另外一個docker容器(暫時(shí)沒有編寫shell腳本)

啟動命令如下

docker run -d --name demo2 -p 8900:8899 demo:1.1

容器名稱demo2 映射到宿主機(jī)端口 8900

查看應(yīng)用日志可使用 docker logs -f 容器名稱

spring boot 構(gòu)建docker鏡像應(yīng)該有更簡單的方式,歡迎在評論區(qū)交流補(bǔ)充

3.2 配置nginx

可以更改默認(rèn)的日志格式如下,為了記錄代理的具體節(jié)點(diǎn)信息

 log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" ' '"$upstream_addr"';

配置負(fù)載均衡

upstream tomcat { 
        server 192.168.0.160:8899 weight=10; # 此處設(shè)置權(quán)重為相同的即可
        server 192.168.0.160:8900 weight=10;
    }

配置代理

location  / {
           proxy_pass http://tomcat;
           proxy_redirect default;
        }

完整的代理配置如下

配置完成后

nginx -s reload

進(jìn)行訪問驗(yàn)證

192.168.0.160/lock

可查看nginx、容器內(nèi)日志信息來驗(yàn)證是否訪問成功

nginx如何訪問出現(xiàn)error,可查看nginx中的錯誤日志。如果是權(quán)限問題(# failed (13: Permission denied) while connecting to upstream) 可用root用戶啟動或使用命令 setsebool -P httpd_can_network_connect 1 來解決

3.3 下載安裝Jmeter進(jìn)行測試

Jmeter下載地址:jmeter.apache.org/download_jm…

下載解壓后在bin目錄中店家jmeter.bat即可啟動jmeter

新增計(jì)劃

配置線程信息

(1) 請求線程數(shù)

(2) 多少s內(nèi)啟動完線程 設(shè)置為0代表同時(shí)啟動 設(shè)置為2代表2s內(nèi)啟動完20個線程,1s啟動10個線程

添加請求

(1) ip地址

(2) 端口

(3) path信息,這里設(shè)置為jar中的地址信息

點(diǎn)擊綠色三角箭頭啟動并進(jìn)行驗(yàn)證

查看redis緩存中設(shè)置的數(shù)據(jù)是否在測試完成后符合預(yù)期值,也可查看nginx中的日志來確定請求是否平均分配到了兩個節(jié)點(diǎn)

參考文章:
juejin.cn/post/684490…

juejin.cn/post/709110…

到此這篇關(guān)于Spring boot 整合 Redisson實(shí)現(xiàn)分布式鎖并驗(yàn)證的文章就介紹到這了,更多相關(guān)Spring boot 分布式鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • feign服務(wù)端發(fā)現(xiàn)異??蛻舳颂幚淼姆椒ń榻B

    feign服務(wù)端發(fā)現(xiàn)異??蛻舳颂幚淼姆椒ń榻B

    這篇文章主要給大家介紹了關(guān)于feign服務(wù)端發(fā)現(xiàn)異常客戶端處理的方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用feign具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 關(guān)于fastjson的常見API詳解

    關(guān)于fastjson的常見API詳解

    這篇文章主要介紹了關(guān)于fastjson的常見API詳解,Fastjson是一個Java庫,可用于將Java對象轉(zhuǎn)換為其JSON表示,它還可用于將JSON字符串轉(zhuǎn)換為等效的Java對象,Fastjson可以處理任意Java對象,包括您沒有源代碼的預(yù)先存在的對象,需要的朋友可以參考下
    2023-07-07
  • SpringBoot整合Flink CDC實(shí)現(xiàn)實(shí)時(shí)追蹤mysql數(shù)據(jù)變動

    SpringBoot整合Flink CDC實(shí)現(xiàn)實(shí)時(shí)追蹤mysql數(shù)據(jù)變動

    我們將整合Spring Boot和Apache Flink CDC(Change Data Capture)來實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)追蹤,下面是一個基本的實(shí)踐流程代碼,包括搭建Spring Boot項(xiàng)目、整合Flink CDC以及實(shí)現(xiàn)數(shù)據(jù)變動的實(shí)時(shí)追蹤,需要的朋友可以參考下
    2024-07-07
  • Java中獲取Class對象的3種方式代碼示例

    Java中獲取Class對象的3種方式代碼示例

    Class對象是反射的核心,通過他可以調(diào)用類的任意方法,下面這篇文章主要給大家介紹了關(guān)于Java中獲取Class對象的3種方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • 如何通過Java監(jiān)聽MySQL數(shù)據(jù)的變化

    如何通過Java監(jiān)聽MySQL數(shù)據(jù)的變化

    對于二次開發(fā)來說,很大一部分就找找文件和找數(shù)據(jù)庫的變化情況,下面這篇文章主要給大家介紹了關(guān)于如何通過Java監(jiān)聽MySQL數(shù)據(jù)的變化的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • mybatis查詢SqlServer慢問題及解決

    mybatis查詢SqlServer慢問題及解決

    這篇文章主要介紹了mybatis查詢SqlServer慢問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • java中Map遍歷的四種方式總結(jié)

    java中Map遍歷的四種方式總結(jié)

    Map集合遍歷日常開發(fā)最常使用,下面這篇文章主要給大家總結(jié)介紹了關(guān)于java中Map遍歷的四種方式,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-03-03
  • 基于Jackson實(shí)現(xiàn)API接口數(shù)據(jù)脫敏的示例詳解

    基于Jackson實(shí)現(xiàn)API接口數(shù)據(jù)脫敏的示例詳解

    用戶的一些敏感數(shù)據(jù),例如手機(jī)號、郵箱、身份證等信息,在數(shù)據(jù)庫以明文存儲,但在接口返回?cái)?shù)據(jù)給瀏覽器(或三方客戶端)時(shí),希望對這些敏感數(shù)據(jù)進(jìn)行脫敏,所以本文就給大家介紹以惡如何利用Jackson實(shí)現(xiàn)API接口數(shù)據(jù)脫敏,需要的朋友可以參考下
    2023-08-08
  • Jmeter?BlazeMeter實(shí)現(xiàn)web錄制過程

    Jmeter?BlazeMeter實(shí)現(xiàn)web錄制過程

    BlazeMeter是一款與Apache JMeter兼容的chrome插件,采用BlazeMeter可以方便的進(jìn)行流量錄制和腳本生成,作為接口測試腳本編寫的一個基礎(chǔ),這篇文章主要介紹了Jmeter?BlazeMeter實(shí)現(xiàn)web錄制,需要的朋友可以參考下
    2021-12-12
  • Java OpenCV實(shí)現(xiàn)人臉識別過程詳解

    Java OpenCV實(shí)現(xiàn)人臉識別過程詳解

    這篇文章主要介紹了Java OpenCV實(shí)現(xiàn)人臉識別過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08

最新評論

双辽市| 沂水县| 沾化县| 湘潭县| 泸水县| 威信县| 苍南县| 临猗县| 永济市| 唐海县| 米脂县| 平安县| 迭部县| 萨迦县| 赤城县| 米脂县| 新蔡县| 泗洪县| 闽清县| 旌德县| 濉溪县| 榆树市| 白银市| 墨脱县| 永昌县| 清流县| 巴林右旗| 澜沧| 石渠县| 洛阳市| 新河县| 大渡口区| 屯昌县| 濉溪县| 华坪县| 武义县| 巴马| 崇仁县| 都匀市| 乌什县| 陵川县|