利用php做网站,建设商场黄金网站,在网站上显示备案信息,网站404页面制作方法1. 介绍Redisson和分布式锁的概念
1.1 Redisson简介
Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid, IMDG)。它不仅提供了对分布式和可伸缩数据结构的支持#xff0c;还提供了多种分布式服务#xff0c;包括但不限于分布式锁、集合、映射、计…1. 介绍Redisson和分布式锁的概念
1.1 Redisson简介
Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid, IMDG)。它不仅提供了对分布式和可伸缩数据结构的支持还提供了多种分布式服务包括但不限于分布式锁、集合、映射、计数器、发布/订阅消息等。Redisson通过利用Redis键的atomic性质实现了分布式锁等高级功能。
1.2 分布式锁的重要性
在分布式系统中多个进程可能会同时访问相同的资源如数据库记录或文件。如果不适当管理就会导致数据不一致或竞态条件。分布式锁是控制分布式系统中多个节点共享资源同步访问的一种机制。它们帮助维护跨节点的资源访问顺序保持数据的一致性和完整性。
1.3 Redisson在分布式锁中的角色
Redisson将Redis的高性能和高可用性引入了分布式锁的实现。利用Redis强大的命令集Redisson实施锁操作成为可能并且这些锁操作是原子的这意味着Redisson提供了一种可靠和高效的方式来实施分布式锁机制。
2. 可重入锁(Reentrant Lock)
2.1 可重入锁的概述
可重入锁是指同一个线程可以多次获得同一把锁。这种类型的锁可以避免死锁的发生因为它允许同一线程在没有释放锁的情况下多次获得锁。这在递归函数或者一系列相互调用的函数需要访问同一个资源时特别有用。
2.2 在Redisson中实现可重入锁
Redisson实现了一个分布式的可重入锁RLock它支持自动续租保证了锁的持有者在宕机或无响应时锁会自动释放。它通过利用Redis的特性有效地完成锁定和解锁操作。
2.3 可重入锁的实际应用场景
可重入锁非常适合那些需要连续几次访问一个资源的场景。例如一个电商平台的订单创建过程中从验证库存到最终下单可能需要多次进行资源锁定可重入锁可以确保整个过程的同步执行。
2.4 代码实现和示例
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;public class ReentrantLockExample {public static void main(String[] args) {Config config new Config();config.useClusterServers().addNodeAddress(redis://127.0.0.1:7181);RedissonClient redisson Redisson.create(config);RLock lock redisson.getLock(anyLock);try {// 支持自动续租lock.lock();// 处理业务逻辑} finally {lock.unlock();}}
}在上面的例子中我们创建了Redisson客户端并且获取了一个分布式锁anyLock。在锁定资源期间如果处理业务逻辑的时间超过了锁的持续时间Redisson会自动续租直到业务逻辑处理完成随后释放锁。这确保了在发生异常情况下锁将不会被永久持有。
3. 公平锁(Fair Lock)
3.1 公平锁与非公平锁的区别
公平锁是一种严格按照请求锁的顺序来分配锁的机制即先来先得。对比之下非公平锁则可能允许后请求的进程先获得锁。非公平锁可能会导致某些线程饥饿但是通常其性能高于公平锁因为它减少了线程之间的切换。
3.2 Redisson的公平锁实现
Redisson提供了RFairLock一个可重入的公平锁实现。它保证了最长等待的线程最优先获取锁。这是通过在Redis中维护一个请求队列来实现的确保了锁分配的公平性。
3.3 使用公平锁解决问题的示例
公平锁适用于需要保证处理顺序的场景如打印队列、线程池任务执行顺序等。它可以避免饥饿情况保证系统处理的有序性和公平性。
3.4 代码实现和示例
import org.redisson.Redisson;
import org.redisson.api.RFairLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;public class FairLockExample {public static void main(String[] args) {Config config new Config();config.useClusterServers().addNodeAddress(redis://127.0.0.1:7181);RedissonClient redisson Redisson.create(config);RFairLock fairLock redisson.getFairLock(anyFairLock);try {// 尝试加锁最多等待100秒上锁以后10秒自动解锁boolean res fairLock.tryLock(100, 10, TimeUnit.SECONDS);if (res) {// 处理业务逻辑}} catch (InterruptedException e) {e.printStackTrace();} finally {fairLock.unlock();}}
}在上面的示例中我们使用了Redisson的RFairLock来创建一个公平锁确保线程按照请求锁的顺序来获得锁定资源的权限。尝试锁定时我们设置了最大等待时间和锁的持有时间以避免可能的死锁。
4. 联锁(MultiLock)
4.1 联锁的工作原理
联锁是一种同步机制用于同时获取多个锁。在分布式系统中当需要对多个独立资源进行操作时联锁确保所有的资源都被锁定以进行安全的原子操作。
4.2 如何使用Redisson实现联锁
Redisson通过MultiLock类提供了联锁的实现。你可以将多个RLock对象传入MultiLock它会同时锁定所有的锁。只有当所有的锁都被成功获取线程才能继续执行。
4.3 联锁的使用场景
联锁在需要执行跨多个资源的复合操作时非常有用例如在两个账户间进行资金转账时需要同时锁定两个账户的资源。
4.4 代码实现和示例
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.api.MultiLock;import java.util.concurrent.TimeUnit;public class MultiLockExample {public static void main(String[] args) {Config config new Config();config.useClusterServers().addNodeAddress(redis://127.0.0.1:7181);RedissonClient redisson Redisson.create(config);RLock lock1 redisson.getLock(lock1);RLock lock2 redisson.getLock(lock2);RLock lock3 redisson.getLock(lock3);MultiLock multiLock new MultiLock(lock1, lock2, lock3);try {// 尝试加锁最多等待100秒上锁以后10秒自动解锁boolean res multiLock.tryLock(100, 10, TimeUnit.SECONDS);if (res) {// 处理跨多个资源的复合操作}} catch (InterruptedException e) {e.printStackTrace();} finally {multiLock.unlock();}}
}在上面的代码中我们创建了一个联锁它会组合三个单独的锁。只有当这三个锁都成功被获取时才会执行后续的复合操作。这保证了操作的原子性。
5. 红锁(RedLock)
5.1 了解红锁算法
红锁(RedLock)是一种在多个独立的Redis节点上提供分布式锁的算法。它由Redis的创造者Antirez提出旨在通过在多个节点上使用锁来提高容错性。如果单个节点宕机使用RedLock算法的系统仍能保持正常运作。
5.2 Redisson中的红锁应用
在Redisson中RedLock算法被用作确保多个Redis节点间互斥操作的一种方式。通过在多个节点上加锁RedLock使得系统更加健壮能够抵御单点故障。
5.3 红锁的实战演示
红锁适用于需要高可用性和高可靠性锁的场景。特别是当系统部署在可能会出现网络分区或者节点故障的环境中时红锁提供了一种更安全的锁策略。
5.4 代码实现和示例
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.RedissonRedLock;import java.util.concurrent.TimeUnit;public class RedLockExample {public static void main(String[] args) {Config config1 new Config();config1.useSingleServer().setAddress(redis://127.0.0.1:7181);RedissonClient redisson1 Redisson.create(config1);Config config2 new Config();config2.useSingleServer().setAddress(redis://127.0.0.1:7182);RedissonClient redisson2 Redisson.create(config2);Config config3 new Config();config3.useSingleServer().setAddress(redis://127.0.0.1:7183);RedissonClient redisson3 Redisson.create(config3);RLock lock1 redisson1.getLock(lock);RLock lock2 redisson2.getLock(lock);RLock lock3 redisson3.getLock(lock);RedissonRedLock redLock new RedissonRedLock(lock1, lock2, lock3);try {// 尝试加锁最多等待100秒上锁以后10秒自动解锁boolean res redLock.tryLock(100, 10, TimeUnit.SECONDS);if (res) {// 执行任务}} catch (InterruptedException e) {e.printStackTrace();} finally {redLock.unlock();}}
}在以上示例中我们通过连接到三个不同的Redis服务器创建了三个RLock对象并将它们组合成一个RedissonRedLock对象。这帮助我们在多个节点间实现了互斥提高了分布式环境下的数据一致性和系统的容错性。
6. 读写锁(ReadWriteLock)
6.1 读写锁的必要性和原理
读写锁是一种支持并发读取而在写入时需要排它的锁机制。这种锁允许多个读取者同时访问资源但在写入者访问时所有读取者和其他写入者都必须等待。这大大提高了在读多写少场景下的性能。
6.2 Redisson的读写锁特性
Redisson实现的RReadWriteLock提供了一个读写锁的分布式实现它保证了当有线程持有写锁时所有的读锁和其他写锁都将等待。
6.3 在实际项目中应用读写锁
在诸如电子商务网站的商品详情页面读操作远多于写操作的场景中读写锁可以有效地提升性能和吞吐量。
6.4 代码实现和示例
import org.redisson.Redisson;
import org.redisson.api.RReadWriteLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;import java.util.concurrent.TimeUnit;public class ReadWriteLockExample {public static void main(String[] args) {Config config new Config();config.useClusterServers().addNodeAddress(redis://127.0.0.1:7181);RedissonClient redisson Redisson.create(config);RReadWriteLock rwlock redisson.getReadWriteLock(anyRWLock);RLock readLock rwlock.readLock();RLock writeLock rwlock.writeLock();// 获取读锁readLock.lock();try {// 执行读取操作} finally {readLock.unlock();}// 获取写锁try {boolean res writeLock.tryLock(100, 10, TimeUnit.SECONDS);if (res) {// 执行写入操作}} catch (InterruptedException e) {e.printStackTrace();} finally {writeLock.unlock();}}
}在这个例子中我们使用Redisson的RReadWriteLock来分别获取读锁和写锁。读锁可以被多个线程同时持有而写锁则保证了独占性直到释放后其他读写操作才能继续进行。
7. 信号量(Semaphore)
7.1 信号量的基本概念
信号量是一个计数器用来控制多个线程对共享资源的访问。它主要用于实现资源的并发访问控制并且可以是二进制的即互斥锁或者可以拥有多个单位。
7.2 使用Redisson实现分布式信号量
Redisson的分布式信号量RSemaphore允许在多个服务间共享信号量的状态提供了一种跨进程或跨服务器同步资源访问的方式。
7.3 分布式信号量的应用案例
分布式信号量非常适用于限制对某一资源访问的并发数比如限制并发访问数据库的线程数量或者在微服务架构中限制对某个服务的并发请求量。
7.4 代码实现和示例
import org.redisson.Redisson;
import org.redisson.api.RSemaphore;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;public class SemaphoreExample {public static void main(String[] args) {Config config new Config();config.useClusterServers().addNodeAddress(redis://127.0.0.1:7181);RedissonClient redisson Redisson.create(config);RSemaphore semaphore redisson.getSemaphore(mySemaphore);try {// 尝试获取一个许可boolean acquired semaphore.tryAcquire(1, 100, TimeUnit.SECONDS);if (acquired) {// 执行业务逻辑}} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {// 释放许可semaphore.release();}}
}上面的代码片段展示了如何使用Redisson的RSemaphore来控制对共享资源的并发访问。在需要访问资源时线程会尝试从信号量中获取许可如果成功则继续执行; 完成后释放许可。
8. 可过期性信号量(PermitExpirableSemaphore)
8.1 可过期性信号量介绍
可过期性信号量是一种特殊类型的信号量它允许线程在一定时间内持有许可当指定时间过后许可会自动失效。这对于需要限时访问的资源来说是非常实用的。
8.2 Redisson的可过期性信号量应用
Redisson提供了RPermitExpirableSemaphore类用于创建和管理可过期性信号量。这允许在分布式系统中实现临时许可的功能确保资源使用的灵活性和安全性。
8.3 如何在项目中使用可过期性信号量
当我们需要对资源的访问进行时间限制时比如在线考试系统中对试题的访问我们可以使用可过期性信号量来控制访问时间。
8.4 代码实现和示例
import org.redisson.Redisson;
import org.redisson.api.RPermitExpirableSemaphore;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;public class PermitExpirableSemaphoreExample {public static void main(String[] args) throws InterruptedException {Config config new Config();config.useClusterServers().addNodeAddress(redis://127.0.0.1:7181);RedissonClient redisson Redisson.create(config);RPermitExpirableSemaphore semaphore redisson.getPermitExpirableSemaphore(mySemaphore);// 获取一个5分钟后过期的许可String permitId semaphore.acquire(5, TimeUnit.MINUTES);try {// 执行业务逻辑} finally {// 释放许可semaphore.release(permitId);}}
}在这段代码中RPermitExpirableSemaphore被用来获取一个可以在5分钟后自动过期的许可。许可的ID用于后续释放该许可时的识别。
9. 闭锁(CountDownLatch)
9.1 闭锁的概念和用途
闭锁CountDownLatch是一种同步机制它允许一个或多个线程等待直到一系列操作在其他线程中完成。一旦这些操作完成闭锁会放开等待的线程就可以恢复执行。
9.2 通过Redisson实现分布式闭锁
Redisson通过RCountDownLatch类提供了闭锁的分布式实现。这允许在不同的JVM进程中等待一定事件的发生并且与传统的CountDownLatch用法类似。
9.3 分布式闭锁在协调任务中的应用
分布式闭锁特别适用于处理分布式系统中的任务协调问题例如在一台机器上启动服务前确保必要的几个服务已经在其他机器上启动。
9.4 代码实现和示例
import org.redisson.Redisson;
import org.redisson.api.RCountDownLatch;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;public class CountDownLatchExample {public static void main(String[] args) throws InterruptedException {Config config new Config();config.useClusterServers().addNodeAddress(redis://127.0.0.1:7181);RedissonClient redisson Redisson.create(config);RCountDownLatch latch redisson.getCountDownLatch(anyCountDownLatch);latch.trySetCount(1);// 在另一个线程或JVM中// latch.countDown();// 等待闭锁释放latch.await();// 继续执行后续逻辑}
}在这段代码里我们使用了RCountDownLatch来创建一个闭锁其计数器为1。只有当另一个线程或在另一个JVM上调用countDown()方法后主线程调用的await()方法之后的代码才会执行。 文章转载自: http://www.morning.fkyrk.cn.gov.cn.fkyrk.cn http://www.morning.zxwqt.cn.gov.cn.zxwqt.cn http://www.morning.xwgbr.cn.gov.cn.xwgbr.cn http://www.morning.smpb.cn.gov.cn.smpb.cn http://www.morning.bpmdr.cn.gov.cn.bpmdr.cn http://www.morning.pjxlg.cn.gov.cn.pjxlg.cn http://www.morning.yrbhf.cn.gov.cn.yrbhf.cn http://www.morning.ssxlt.cn.gov.cn.ssxlt.cn http://www.morning.qhmhz.cn.gov.cn.qhmhz.cn http://www.morning.rymd.cn.gov.cn.rymd.cn http://www.morning.drswd.cn.gov.cn.drswd.cn http://www.morning.dbhnx.cn.gov.cn.dbhnx.cn http://www.morning.fcrw.cn.gov.cn.fcrw.cn http://www.morning.trnl.cn.gov.cn.trnl.cn http://www.morning.cttti.com.gov.cn.cttti.com http://www.morning.c7496.cn.gov.cn.c7496.cn http://www.morning.ftldl.cn.gov.cn.ftldl.cn http://www.morning.xtgzp.cn.gov.cn.xtgzp.cn http://www.morning.qmsbr.cn.gov.cn.qmsbr.cn http://www.morning.wcqkp.cn.gov.cn.wcqkp.cn http://www.morning.pjwrl.cn.gov.cn.pjwrl.cn http://www.morning.iiunion.com.gov.cn.iiunion.com http://www.morning.grpbt.cn.gov.cn.grpbt.cn http://www.morning.yqpzl.cn.gov.cn.yqpzl.cn http://www.morning.cptzd.cn.gov.cn.cptzd.cn http://www.morning.rqlqd.cn.gov.cn.rqlqd.cn http://www.morning.ktmbr.cn.gov.cn.ktmbr.cn http://www.morning.fnxzk.cn.gov.cn.fnxzk.cn http://www.morning.bgkk.cn.gov.cn.bgkk.cn http://www.morning.dpruuode.cn.gov.cn.dpruuode.cn http://www.morning.lwzgn.cn.gov.cn.lwzgn.cn http://www.morning.bztzm.cn.gov.cn.bztzm.cn http://www.morning.gydsg.cn.gov.cn.gydsg.cn http://www.morning.kjyfq.cn.gov.cn.kjyfq.cn http://www.morning.jhtrb.cn.gov.cn.jhtrb.cn http://www.morning.bhwz.cn.gov.cn.bhwz.cn http://www.morning.kcnjz.cn.gov.cn.kcnjz.cn http://www.morning.hwnnm.cn.gov.cn.hwnnm.cn http://www.morning.bfycr.cn.gov.cn.bfycr.cn http://www.morning.jgmdr.cn.gov.cn.jgmdr.cn http://www.morning.zstbc.cn.gov.cn.zstbc.cn http://www.morning.nuobeiergw.cn.gov.cn.nuobeiergw.cn http://www.morning.pmtky.cn.gov.cn.pmtky.cn http://www.morning.tkrpt.cn.gov.cn.tkrpt.cn http://www.morning.sjmxh.cn.gov.cn.sjmxh.cn http://www.morning.znlhc.cn.gov.cn.znlhc.cn http://www.morning.lcwhn.cn.gov.cn.lcwhn.cn http://www.morning.hrzky.cn.gov.cn.hrzky.cn http://www.morning.rwpfb.cn.gov.cn.rwpfb.cn http://www.morning.wtcd.cn.gov.cn.wtcd.cn http://www.morning.blzrj.cn.gov.cn.blzrj.cn http://www.morning.jngdh.cn.gov.cn.jngdh.cn http://www.morning.fpxyy.cn.gov.cn.fpxyy.cn http://www.morning.tymnr.cn.gov.cn.tymnr.cn http://www.morning.hpkgm.cn.gov.cn.hpkgm.cn http://www.morning.spfh.cn.gov.cn.spfh.cn http://www.morning.bdzps.cn.gov.cn.bdzps.cn http://www.morning.skrcn.cn.gov.cn.skrcn.cn http://www.morning.hdtcj.cn.gov.cn.hdtcj.cn http://www.morning.pdkht.cn.gov.cn.pdkht.cn http://www.morning.twwzk.cn.gov.cn.twwzk.cn http://www.morning.qjtbt.cn.gov.cn.qjtbt.cn http://www.morning.hxwrs.cn.gov.cn.hxwrs.cn http://www.morning.nysjb.cn.gov.cn.nysjb.cn http://www.morning.ypbp.cn.gov.cn.ypbp.cn http://www.morning.dzrcj.cn.gov.cn.dzrcj.cn http://www.morning.bqppr.cn.gov.cn.bqppr.cn http://www.morning.kjtdy.cn.gov.cn.kjtdy.cn http://www.morning.pqkrh.cn.gov.cn.pqkrh.cn http://www.morning.prmyx.cn.gov.cn.prmyx.cn http://www.morning.qbjgw.cn.gov.cn.qbjgw.cn http://www.morning.nwynx.cn.gov.cn.nwynx.cn http://www.morning.bnxnq.cn.gov.cn.bnxnq.cn http://www.morning.wjrq.cn.gov.cn.wjrq.cn http://www.morning.lwxsy.cn.gov.cn.lwxsy.cn http://www.morning.wchcx.cn.gov.cn.wchcx.cn http://www.morning.bsgfl.cn.gov.cn.bsgfl.cn http://www.morning.nqfxq.cn.gov.cn.nqfxq.cn http://www.morning.zczkm.cn.gov.cn.zczkm.cn http://www.morning.bbmx.cn.gov.cn.bbmx.cn