首页 > 数据库 >Redisson详解

Redisson详解

时间:2024-09-28 23:19:46浏览次数:13  
标签:缓存 获取 Redisson 线程 内存 Linux 详解

Redisson 是 Redis 的一个分布式锁实现库,它提供了简单易用的 API 来处理分布式锁。在处理未获取到锁的线程时,Redisson 通过合理的机制来管理等待和超时行为,确保锁的竞争有序并防止资源的长期占用。具体来说,Redisson 处理未获取到锁的线程的方式如下:

1. 等待锁(可配置超时时间)

当一个线程尝试获取锁而锁已经被其他线程占用时,Redisson 支持线程进入等待状态,直到:

  • 锁被释放。
  • 线程的等待时间超时

通过 tryLock(long waitTime, long leaseTime, TimeUnit unit) 方法,Redisson 可以设定一个等待时间waitTime)。如果在指定的等待时间内锁被释放,该线程就能获取锁;如果超时,线程将停止等待并返回失败。


java

复制代码

RLock lock = redissonClient.getLock("myLock"); boolean isLocked = lock.tryLock(10, 60, TimeUnit.SECONDS); // 等待10秒,持有锁60秒 if (isLocked) { try { // 执行业务逻辑 } finally { lock.unlock(); } } else { // 处理未获取到锁的情况 }

在这个例子中,如果线程在 10 秒内没有获取到锁,它将返回 false 并执行未获得锁时的逻辑。

2. 公平锁机制

Redisson 提供公平锁的机制。公平锁按照请求的顺序授予锁访问权,确保每个线程以 FIFO(先进先出)的顺序获取锁,防止饥饿现象的发生。

当线程未能获取到锁时,它会被挂起到锁的等待队列中,按顺序等待前面的线程释放锁。公平锁的关键在于确保线程以公平的方式竞争锁,而不是让某个线程一直无法获取到锁。


java

复制代码

RLock fairLock = redissonClient.getFairLock("myFairLock");

3. 可中断锁

Redisson 提供了可中断锁的支持,线程在等待锁的过程中,可以被中断(例如通过 Thread.interrupt())。如果线程在等待锁时被中断,它将立刻停止等待并抛出 InterruptedException,从而允许应用程序捕获并处理这个中断事件。


java

复制代码

RLock lock = redissonClient.getLock("myLock"); try { lock.lockInterruptibly(); // 等待过程中可以被中断 // 执行业务逻辑 } catch (InterruptedException e) { // 处理中断情况 } finally { lock.unlock(); }

4. 分布式锁超时自动释放

为了防止某些线程在获取到锁后因未能及时释放而导致其他线程长时间无法获取锁,Redisson 支持为锁设定自动释放时间。当线程持有锁超过设定的时间时,锁会自动释放,从而避免锁的长期占用。

Redisson 的锁是通过 Redis 的 SET 命令实现的,并且使用了 expire(过期)机制来确保锁在持有时间(leaseTime)过后会自动释放,即使持有锁的线程由于异常退出也能防止死锁。

5. 红锁(RedLock)支持

Redisson 支持 RedLock 算法,这是 Redis 官方推荐的分布式锁方案。RedLock 提供了更高的容错性,尤其是在 Redis 集群中使用时。

RedLock 在多个 Redis 实例上尝试加锁,如果获取到大多数实例的锁,则认为加锁成功。未获取到锁的线程可能因为未能满足大多数锁实例的要求而进入等待状态,或者根据 RedLock 的超时机制放弃加锁。

6. 使用 Lua 脚本保证原子性

Redisson 使用 Redis 的 Lua 脚本来确保锁的原子性操作。在 Lua 脚本中,会判断锁的状态、执行加锁或解锁操作,确保在高并发下锁的获取与释放不会发生竞态条件。未获取到锁的线程在 Lua 脚本的帮助下,可以通过 Redis 的原子性操作避免不必要的等待。

总结:

Redisson 处理未获取到锁的线程时,主要通过以下方式:

  • 等待锁的释放,并设置等待超时时间;
  • 公平锁机制确保线程按顺序获取锁;
  • 可中断锁允许线程在等待锁时被中断;
  • 自动释放机制防止锁长时间被占用;
  • RedLock 算法提高分布式锁的容错性。

这些机制确保了 Redisson 的分布式锁在高并发和分布式环境中的可靠性与高效性。

3/3

您说:

linux的内存管理

ChatGPT 说:

ChatGPT

Linux 内存管理是操作系统中非常重要的一部分,它负责管理系统中的物理内存(RAM),确保每个进程能够安全高效地使用内存资源。Linux 提供了一种灵活、高效的内存管理机制,包括虚拟内存、分页、交换(Swap)等。下面对 Linux 内存管理的几个关键方面进行详细介绍:

1. 虚拟内存

虚拟内存是 Linux 内存管理的核心概念之一,它将物理内存和硬盘上的空间结合在一起,提供了一个更大的内存空间。每个进程在运行时,都有一个独立的虚拟地址空间,操作系统会将这个虚拟内存空间映射到实际的物理内存或磁盘上的交换空间。

  • 好处
    • 使得每个进程可以使用独立的内存空间,避免进程之间的内存冲突。
    • 提供比实际物理内存更大的地址空间,能够支持更大规模的应用。

2. 分页机制

Linux 内存是以“页”(page)为单位进行管理的,页是内存中的最小分配单位。虚拟内存被分为多个固定大小的页(通常为 4KB),物理内存也以页框(page frame)的形式划分。

  • 分页的作用
    • 分页将虚拟内存映射到物理内存,避免了内存碎片化。
    • 当物理内存不足时,未使用的页面可以被换出到磁盘上的交换分区,释放物理内存。
  • 页面表(Page Table): 页面表用于存储虚拟地址与物理地址之间的映射关系。每个进程都有一个独立的页面表,操作系统通过页面表来管理进程的内存使用。

3. 交换空间(Swap)

当系统的物理内存不足时,Linux 会将部分不常用的内存页写入硬盘的交换分区(Swap),从而释放物理内存供其他进程使用。当这些页面再次被访问时,它们会从交换区重新加载到物理内存中。

  • Swap的优势

    • 提供了物理内存不足时的缓冲区,保证系统的稳定性。
    • 支持内存超分配,使系统能够运行超过物理内存容量的任务。
  • Swap的缺点

    • 由于硬盘的速度远远慢于物理内存,频繁使用 Swap 会导致性能下降,出现“交换风暴”(Swap Thrashing)。

4. 内存映射(Memory Mapping)

内存映射是一种将文件或设备直接映射到进程的虚拟内存地址空间的技术,常用于文件 I/O 操作。通过 mmap 系统调用,进程可以将文件的内容映射到内存中,从而直接读取或写入文件而不需要额外的 I/O 操作。

  • 优点
    • 提升文件 I/O 的效率,减少了文件的多次读取和写入操作。
    • 多个进程可以共享映射的内存,提升内存利用率。

5. 缓存和缓冲

Linux 内核会利用未使用的物理内存来缓存磁盘数据,避免频繁的磁盘 I/O 操作。这种缓存分为页缓存(Page Cache)缓冲区缓存(Buffer Cache)

  • 页缓存:缓存文件系统中的文件页,用于加速文件读取和写入。
  • 缓冲区缓存:用于缓存块设备的 I/O 操作,如磁盘块操作。

Linux 内核会智能地管理缓存区,当系统需要更多的内存时,它会自动释放部分缓存,以供应用程序使用。

6. 内存回收(OOM Killer)

在极端情况下,如果物理内存和交换分区都被完全占用,Linux 系统将面临内存耗尽的问题。为了避免系统崩溃,Linux 内核会启动OOM Killer(Out Of Memory Killer),通过选择性地终止某些进程来释放内存。

  • OOM Killer 的触发条件:当系统内存不足时。
  • OOM Killer 的选择标准:内核根据进程的内存使用量、优先级等因素选择要终止的进程,通常是那些消耗大量内存的进程。

7. 内存分配器(slab、slub、buddy等)

Linux 内核使用多种内存分配算法来管理内存碎片和提高分配效率。常用的内存分配器有:

  • Buddy System:用于大块内存的分配。它将内存分为多个大小不同的块,通过合并或分割块来满足内存分配需求。

  • Slab 分配器:主要用于小块内存的分配。它通过缓存常用的数据结构对象,提高内存分配和释放的效率。

  • SLUB 分配器:是 Slab 的改进版本,简化了内存管理,性能更高,特别是在高并发环境中表现优秀。

8. 透明大页(Transparent Huge Pages, THP)

为了减少分页开销,Linux 引入了透明大页(THP),它允许系统自动将多个小页合并为一个大页(通常为 2MB 或更大)。这可以有效减少页面表的大小,提升内存访问效率,特别是对于大内存应用程序。

  • 优点:减少 TLB(Translation Lookaside Buffer)缓存的压力,提高内存访问效率。
  • 缺点:在某些情况下,大页的管理可能会导致内存分配的延迟。

9. 内存分区(NUMA架构支持)

在多处理器系统中,Linux 支持**非一致性内存访问(NUMA, Non-Uniform Memory Access)**架构。NUMA 允许每个 CPU 直接访问自己附近的内存,从而提高内存访问速度。

  • NUMA 的作用:通过优化内存分配策略,让每个 CPU 尽量使用本地

标签:缓存,获取,Redisson,线程,内存,Linux,详解
From: https://blog.csdn.net/m0_68570169/article/details/142456328

相关文章

  • MySQL 之多表设计详解
    在实际应用场景中,我们经常需要处理包含多种数据实体及其之间复杂关系的业务逻辑,例如电商平台的用户、商品、订单,社交网络的用户、帖子、评论等等。如果将所有数据都堆砌在一张表中,不仅会造成数据冗余、难以维护,还会严重影响查询效率。为了解决这些问题,我们需要采用多表设计,即......
  • MySQL 数据类型详解
    在MySQL数据库中,数据类型的选择对性能和存储效率有着至关重要的影响。选择正确的数据类型可以最大限度地利用资源,并提高查询速度。一、数值类型详解数值类型用于存储数字数据,根据数据范围和精度需求,MySQL提供多种整数和浮点数类型。1.整数类型类型大小(字节)范围性能用途......
  • Android页面跳转与返回机制详解
    在Android开发中,页面跳转是实现应用功能交互的重要手段之一。本文将从Activity之间的跳转、Activity与Fragment之间的跳转、Fragment之间的跳转以及页面返回的问题四个方面进行详细解析。一、Activity之间的跳转Activity是Android应用的基本构建块,代表了一个用户界面的单一屏幕......
  • 一文详解几种常见本地大模型个人知识库工具部署、微调及对比选型
    前言近年来,大模型在AI领域崭露头角,成为技术创新的重要驱动力。从AlphaGo的胜利到GPT系列的推出,大模型展现出了强大的语言生成、理解和多任务处理能力,预示着智能化转型的新阶段。然而,要将大模型的潜力转化为实际生产力,需要克服理论到实践的鸿沟,实现从实验室到现实世界的落地......
  • 【HTML|第1期】HTML5视频(Video)元素详解:从起源到应用
    日期:2024年9月9日作者:Commas签名:(ง•_•)ง积跬步以致千里,积小流以成江海……注释:如果您觉在这里插入代码片得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^-^1.01365=37.7834;0.99365=0.02551.02365=1377.4083;0.......
  • python 操作RabbitMq详解
    一、简介:RabbitMq 是实现了高级消息队列协议(AMQP)的开源消息代理中间件。消息队列是一种应用程序对应用程序的通行方式,应用程序通过写消息,将消息传递于队列,由另一应用程序读取完成通信。而作为中间件的RabbitMq无疑是目前最流行的消息队列之一。    RabbitMq......
  • Redis 集合类型详解及应用
    ......
  • Dijkstra算法详解【附算法代码与运行结果】
    算法背景Dijkstra算法是一种用于在加权图中找到单个源点到所有其他顶点的最短路径的算法。这种算法由荷兰计算机科学家艾兹格·戴克斯特拉(EdsgerW.Dijkstra)在1956年提出。它适用于有向图和无向图,并且图中的边权重必须是非负数。基本原理如下图所示,找到一条从v1(节点1)到v6(......
  • 9--苍穹外卖-SpringBoot项目中Redis的介绍及其使用实例 详解
    目录Redis入门Redis简介Redis服务启动与停止服务启动命令Redis数据类型5种常用数据类型介绍各种数据类型的特点Redis常用命令字符串操作命令哈希操作命令列表操作命令集合操作命令有序集合操作命令通用命令在java中操作RedisRedis的Java客户端SpringDataRe......
  • 信号量的秘密:Python中的Semaphore详解
    引言随着计算机硬件的发展,多核处理器已经成为了标准配置。这使得开发人员可以利用并发编程技术来提高应用程序的性能。然而,在并发环境下,资源共享和访问控制成了一个棘手的问题。Semaphore(信号量)就是一种常用的解决此类问题的技术。通过限制对共享资源的同时访问数量,Semapho......