分布式架构系统必备神器之Redis数据库 视频资料

Posted 小小白的成长

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式架构系统必备神器之Redis数据库 视频资料相关的知识,希望对你有一定的参考价值。

视频获取方式见尾部~

    这期之所以更新Redis 缓存数据库是因为小编在面试高级的工程师的时候被问到了这些问题,下期将更新小编面试的时候遇到的算法问题,,,

什么是分布式锁定?

在多线程程序中,不同的线程可能需要访问相同的资源。但是,允许所有线程同时访问资源可能会导致争用情况,错误和其他意外行为。

为了确保没有两个线程可以同时访问同一资源,并且确保以可预测的顺序对资源进行操作,程序员使用一种称为的机制每个线程首先获取锁,然后对资源进行操作,最后将锁释放给其他线程。

在Java中,出于多种原因,锁定对象通常比使用同步更灵活首先,Lock API可以在不同的方法中运行,而同步块则完全包含在一个方法中。

另外,如果线程被阻塞,则它无法访问同步的块。使用Lock,该线程将仅在可用时获取锁。这大大减少了线程等待的时间。另外,当线程正在等待时,可以调用一个方法来中断线程,而当线程正在等待获取同步块时,这是不可能的。

分布式锁定意味着您不仅需要考虑多个线程或进程,还需要考虑在不同计算机上运行的不同客户端。这些单独的服务器必须进行协调,以确保它们中的任何一个在任何给定时间都在使用资源。

基于Redis的分布式Java锁定工具

Redisson框架是一个Redis的基于内存数据网格的Java,对于谁需要执行分布式锁定程序员提供了多个对象。下面,我们将讨论每个选项及其之间的区别。

1.锁

RLock接口java.util.concurrent.locks.Lock 使用Java 实现  接口。这是一个可重入的锁,这意味着线程可以多次锁定资源。一个计数器变量跟踪锁定请求的发出次数。一旦线程发出足够的解锁请求并且计数器达到0,就释放资源。

以下简单代码示例演示了如何在Redisson中创建和初始化Lock:

RLock lock = redisson.getLock("anyLock");//最熟悉的锁定方法lock.lock();try { ...} finally { lock.unlock();}

如果获取此锁的Redisson实例崩溃,则该锁可能会在此获取状态下永久挂起。为了避免这种情况,Redisson维护了一个锁“看门狗”,该看门狗在持有该锁的Redisson实例仍处于活动状态时延长了该锁的过期时间。默认情况下,此锁定看门狗的超时为30秒。可以通过Config.lockWatchdogTimeout 设置更改此限制  

Redisson还允许您在leaseTime获取租约时指定参数。在指定的时间间隔后,锁将自动释放:

//获取锁定并在10秒后自动释放//如果尚未调用解锁方法lock.lock(10, TimeUnit.SECONDS);//等待100秒,并在10秒后自动将其解锁boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);if (res) {  try { ... } finally { lock.unlock(); }}

Redisson还为Lock 对象提供了异步/反应/ rxjava2接口  

RLock lock = redisson.getLock("anyLock");lock.lockAsync();...//反应性流(Spring Project Reactor实现)RLockReactive lock = redissonReactive.getLock("anyLock");Mono<Void> res = lock.lock();...//反应式流(RxJava2实现)RLockReactive lock = redissonRx.getLock("anyLock");Flowable<Void> res = lock.lock();...


因为RLock实现了  Lock 接口,所以只有拥有锁的线程才可以解锁资源。否则,任何尝试都会遇到  IllegalMonitorStateException

2. FairLock

与其表弟一样RLockRFairLock 也实现  java.util.concurrent.locks.Lock 接口。通过使用   FairLock,您可以保证线程将按照请求资源的顺序来获取资源(即“先进先出”队列)。在为队列中的下一个线程解锁资源之前,Redisson会给已死掉五秒钟的线程重新启动。

与一样  RLocks,创建和启动a  FairLock 是一个简单的过程:

RLock lock = redisson.getFairLock("anyLock");lock.lock();try {  ...} catch {  lock.unlock();}

3. ReadWriteLock

Redisson的RReadWriteLock 实现   java.util.concurrent.locks.ReadWriteLock 接口。在Java中,读/写锁实际上是两个锁的组合:一个只读锁可以同时由多个线程拥有,而写锁只能一次由一个线程拥有。

创建和初始化a的方法RReadWriteLock 如下:

RReadWriteLock rwlock = redisson.getReadWriteLock("anyRWLock");rwlock.readLock().lock();try { ...} finally { rwlock.readLock().lock();}rwlock.writeLock().lock();try { ...} finally { rwlock.writeLock().lock();}

4. RedLock

RedissonRedLock 对象实现Redlock锁定算法,以与Redis一起使用分布式锁:

RLock lock1 = redissonInstance1.getLock("lock1");RLock lock2 = redissonInstance2.getLock("lock2");RLock lock3 = redissonInstance3.getLock("lock3");RedissonRedLock lock = new RedissonRedLock(lock1, lock2, lock3);lock.lock();try { ...} finally { lock.unlock();}

在Redlock算法中,我们有许多独立的Redis主节点位于不同的计算机或虚拟机上。该算法尝试使用相同的键名和随机值依次获取这些实例中的每个实例的锁。仅当客户端能够比锁有效的总时间更快地从大多数实例中获取锁时,才获取锁。

5.多重锁定

RedissonMultiLock 对象能够将多个单独的RLock 实例组合在一起  ,并将其作为一个实体进行管理:


 
   
   
 
RLock lock1 = redissonInstance1.getLock("lock1");RLock lock2 = redissonInstance2.getLock("lock2");RLock lock3 = redissonInstance3.getLock("lock3");RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);lock.lock();try { ...} finally { lock.unlock();}

如上例所示,每个RLock 对象可能属于不同的Redisson实例。反过来,这可能会连接到其他Redis数据库。

最后的想法

在这篇文章中,我们已经探索了一些不同的工具,Java开发者可以对Redis的数据库之上的Redisson框架执行分布式锁定:  Lock,  FairLock,  ReadWriteLock,  RedLock,和  MultiLock


网盘链接:https://pan.baidu.com/s/1ynb6DbyzoOp1XKW6w2qSww

提取码:g8vt


感觉不错的话,麻烦动动小手关注一下小编啦


更多精彩请点击

1.




以上是关于分布式架构系统必备神器之Redis数据库 视频资料的主要内容,如果未能解决你的问题,请参考以下文章

分布式下必备神器之分布式锁

架构师必备之常见面试题整理——高性能三十问!

Redis之分布式架构

视频MHDD|VCR|PC3000测试总汇 硬盘收卖佬必备神器

java架构师(实战篇)

云计算必备良方-Redis集群架构