# Redisson

# 功能

# RMap

基于 Redis 的分布式集合中的数据结构"Map",在 Redisson 中提供了另一种高性能功能组件,成为"RMap"。

RMap 实现了 Java 中 java.util.concurrent.ConcurrentMapjava.util.Map接口,不仅拥有 Map 和 ConcurrentMap 相应的操作方法,同时自身 也提供了丰富的 Redisson 特有的操作方法,而且几乎每种方法还提供了多种不同的操作方式。

RMap 特殊功能特性:

  • Eviction 元素淘汰:允许针对一个映射中每个元素设定有效时间和最长闲置时间
  • LocalCache 本地缓存:
    • 指的是将部分数据保存在本地内存里,将数据读取速度提高最多 45 倍。
    • 所有同名的本地缓存公用一个订阅-发布话题,所有更新和过期的消息都将通过该话题共享
  • Sharding 数据分片:
    • 仅适用于 Redis 的集群环境,该映射结构也叫集群分布式映射
    • 该数据结构利用了分库的原理,将单一的映射结构切分为若干个小的映射,并均匀地分布在集群中的各个节点
    • 可以使得打单一的映射机构突破 Redis 自身的容量限制,让其容量随集群的扩大而增长。在扩容的同时,还能够使读写性能和元素淘汰处理能力呈线性增长。

# RSet

保证集合中的元素的唯一性

  • SortedSet 有序集合
  • ScoredSortedSet 计分排序集合
  • LexSortedSet 字典排序集合

# RQueue

队列

  • 双端队列(Deque)
  • 阻塞队列(Blocking Queue)
  • 有界阻塞队列(Bounded Blocking Queue)
  • 阻塞双端队列(Blocking Queue)
  • 阻塞公平队列(Blocking Fair Queue)
  • 。。。

# 延迟队列

Redisson 的延迟队列不仅可以实现延迟发送、接收消息的作用,还可以根据不同 TTL 决定消息 被真正消费的先后顺序,而这一点也正好解决了 RabbitMQ 的死信队列在处理不同 TTL 的消息时产生的缺陷。

# 分布式锁

  • 可重入所(Reentrant Lock)
  • 公平锁(Fair Lock)
  • 读写锁(ReadWriteLock)
  • 闭锁(CountDownLatch)
  • 信号量(Semaphore)
  • 。。。

# 一次性锁

分布式锁的一次性,指的是高并发产生多线程时,如果当前线程可以获取到分布式锁,则成功获取之,如果获取不到,当前线程将永远的被“抛弃”。这对于该线程而言,相当于有一道天然屏障一样,永远阻隔了该线程与共享资源“见面”。

分布式锁的一次性适用于那些在同一时刻而且是在很长的一段时间内,仍然只允许只有一个线程访问共享资源的场景,如果用户注册、重复提交、抢红包等业务场景。在 Redisson 中,主要是通过lock.lock()方法实现。

# 可重入锁

分布式锁的可重入,指的是当高并发产生多线程时,如果当前线程不能获取到分布式锁,它并不会立即被“抛弃“,而是会等待一定时间,重新尝试去获取分布式锁。如果可以获取成功,则执行后续操作共享资源的步骤;如果不能获取锁,而且重试的时间达到了上限,则意味着该线程将被”抛弃“。对于该线程而言,这一过程相当于”虽彼时为咸鱼,但经过多次努力奋斗与尝试,终有可能可以成为鲨鱼“。

分布式锁的可重入方式适用于那些在同一时刻并发产生多线程时,虽然在某一时刻不能获取到分布式锁,但是允许隔一定时间重新获取到分布式锁并操作共享资源的场景。典型的应用场景当属商城平台高并发抢购商品的业务。

lock.tryLock()

RLock lock = redissonClient.getLock("anyLock");

// 尝试加锁,最多等待 100 秒,上锁以后 10 秒自动解锁
boolean res = lock.tryLock(100,10,TimeUnit.SECONDS);