日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

【Redis】Redisson分布式鎖原理與使用

作者:Mr.VK 更新時(shí)間: 2024-03-09 編程語言

【Redis】Redisson分布式鎖原理與使用

什么是Redisson?

Redisson - 是一個高級的分布式協(xié)調(diào)Redis客服端,能幫助用戶在分布式環(huán)境中輕松實(shí)現(xiàn)一些Java的對象,Redisson、Jedis、Lettuce 是三個不同的操作 Redis 的客戶端,Jedis、Lettuce 的 API 更側(cè)重對 Reids 數(shù)據(jù)庫的 CRUD(增刪改查),而 Redisson API 側(cè)重于分布式開發(fā)。

視頻介紹:面試官:分布式鎖有什么作用?如何實(shí)現(xiàn)分布式鎖?_嗶哩嗶哩_bilibili

GitHub地址:https://github.com/redisson/redissonre

Redisson原理流程圖

在這里插入圖片描述

Redisson 分布式鎖的缺點(diǎn)

Redis分布式鎖會有個缺陷,就是在Redis哨兵模式下:客戶端1 對某個Master節(jié)點(diǎn)寫入了Redisson鎖,此時(shí)會異步復(fù)制給對應(yīng)的 Slave節(jié)點(diǎn)。但是這個過程中一旦發(fā)生 Master節(jié)點(diǎn)宕機(jī),主備切換,slave節(jié)點(diǎn)從變?yōu)榱?Master節(jié)點(diǎn)。這時(shí)客戶端2 來嘗試加鎖的時(shí)候,在新的Master節(jié)點(diǎn)上也能加鎖,此時(shí)就會導(dǎo)致多個客戶端對同一個分布式鎖完成了加鎖。這時(shí)系統(tǒng)在業(yè)務(wù)語義上一定會出現(xiàn)問題,導(dǎo)致各種臟數(shù)據(jù)的產(chǎn)生。

Redisson分布式鎖使用實(shí)例

1.引入Redisson依賴

<!--原生-->
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.13.4</version>
</dependency>

<!--或者另一種Spring集成starter-->
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.13.6</version>
</dependency>

2.配置Redisson

@Configuration
public class RedissionConfig {
    @Value("${spring.redis.host}")
    private String redisHost;

    @Value("${spring.redis.password}")
    private String password;

    private int port = 6379;

    @Bean
    public RedissonClient getRedisson() {
        Config config = new Config();
        config.useSingleServer().
                setAddress("redis://" + redisHost + ":" + port).
                setPassword(password);
        config.setCodec(new JsonJacksonCodec());
        return Redisson.create(config);
    }
}

3.使用Redisson分布式鎖

@Resource
private RedissonClient redissonClient;

RLock rLock = redissonClient.getLock(lockName);
try {
    boolean isLocked = rLock.tryLock(expireTime, TimeUnit.MILLISECONDS);
    if (isLocked) {
        // TODO
    }
} catch (Exception e) {
    rLock.unlock();
}

原文鏈接:https://blog.csdn.net/Mr_VK/article/details/132385088

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新