Redis应用场景4-分布式锁

Redis在实际开发中有哪些应用场景?

Redis在实际开发中有哪些应用场景?下面我结合Redisson来演示Redis在分布式场景中热点数据缓存、计数器、队列、发布/订阅、分布式锁…等场景下的应用。

分布式锁

Redisson实现分布式锁利用的是Redis中set命令的原子性和lua脚本的原子性的特性来实现的。在这两个特性的基础上面Redisson给我们提供了锁重入、锁自动续期、锁的原子释放等功能。

下面使用3行代码来实现加锁和解锁:

package com.example.redisdemo;

import org.junit.jupiter.api.Test;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.concurrent.TimeUnit;

@SpringBootTest
class RedisLockTests {

    private static final Logger logger = LoggerFactory.getLogger(RedisLockTests.class);

    @Autowired
    private RedissonClient redissonClient;


    @Test
    public void publishTest() {
        // 获取锁
        RLock redisson = redissonClient.getLock("redisson");
        // 加锁
        redisson.lock(10, TimeUnit.SECONDS);
        // 业务代码
        logger.info("业务代码");
        // 解锁
        redisson.unlock();
    }


}

这里用到的主要是RLock的API,下面是API的一些注释:

public interface RRLock {
    //----------------------Lock接口方法-----------------------

    /**
     * 无参lock:有效期默认30秒
     */
    void lock();
    /**
     * 和字面意思一样,尝试获取锁,获取成功返回true,如果锁被占用则返回false.
     */
    boolean tryLock();
    /**
     * 和tryLock()方法是类似的,在指定时间内获取,锁获取成功返回true,如果锁被占用则返回false.。
     *
     * @param time 获取锁等待时间
     * @param unit 时间单位 小时、分、秒、毫秒等
     */
    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
    /**
     * 解锁
     */
    void unlock();
    /**
     * 中断锁 表示该锁可以被中断 假如A和B同时调这个方法,A获取锁,B为获取锁,那么B线程可以通过
     * Thread.currentThread().interrupt()方法中断该线程
     */
    void lockInterruptibly();

    //----------------------RLock接口方法-----------------------
    /**
     *  和lock()方法是类似的,在指定锁有效时间。
     *
     * @param leaseTime 锁有效时间
     * @param unit      时间单位 小时、分、秒、毫秒等
     */
    void lock(long leaseTime, TimeUnit unit);
    /**
     * 和tryLock()方法是类似的,多一个锁的有效时间
     *
     * @param waitTime  等待时间
     * @param leaseTime 锁有效时间
     * @param unit      时间单位 小时、分、秒、毫秒等
     */
    boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException;
    /**
     * 检验该锁是否被线程使用,如果被使用返回True
     */
    boolean isLocked();
    /**
     * 检查当前线程是否获得此锁(这个和上面的区别就是该方法可以判断是否当前线程获得此锁,而不是此锁是否被线程占有)
     * 这个比上面那个实用
     */
    boolean isHeldByCurrentThread();
    /**
     * 中断锁 和上面中断锁差不多,只是这里如果获得锁成功,添加锁的有效时间
     * @param leaseTime  锁有效时间
     * @param unit       时间单位 小时、分、秒、毫秒等
     */
    void lockInterruptibly(long leaseTime, TimeUnit unit);  
}

当然在Redisson中还有红锁(RedLock)、公平锁(FairLock)、联锁(MultiLock)、读写锁(ReadWriteLock)等。具体用法可以参考API

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值