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