Redisson是架设在Redis基础上实现Java驻内存数据网格的综合中间件。之所以被称为“综合中间件”,是因为Redisson所提供的功能特性以及实际项目中所起的作用远远多于原生的redis。
作为一款诸多高性能特性的中间件,其设计初衷是促进实施者对Redis的关注进行分离,让实施者更多的精力在业务过程中开发。
本章将整合核心配置文件以及自定义注入Bean操作组件,并且介绍常见的 分布式对象, 分布式集合等,重点介绍 Redisson提供不同类型分布式锁的实现方式,作用以及各自的性能对比
概述
Redisson内置了一系列的分布式对象,分布式集合,分布式锁,分布式服务等诸多功能特性,是一款基于Redis实现,拥有一系列分布式系统功能特性的工具包,是实现分布式系统架构中缓存中间件的最佳选择。
简介与作用
既然是一款基于Redis的工具包,肯定对key-value的数据类型以及基于内存数据库所提供的一系列优势,使得原本的协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发的能力,并且置了一系列的分布式对象,分布式集合,分布式锁,分布式服务等诸多功能特性,简化了分布式环境中程序相互之间的协作。
功能特性
典型应用场景之布隆过滤器与主题
首先介绍的业务是去重,从一个集合中判断元素是否在集合中,一般是采用jdk提供的hasdSet的contains方法,判断元素是否在集合中,但是hashSet时基于内存的,如果是在高并发的情况下,这种方法比较捉襟见肘。
为此Redisson提供一个叫做布隆过滤器的组件,这个组件用来过滤掉已经重复的值,跟hashSet有异曲同工之处,只是不需要将数据列表加载到内存中。
布隆过滤器在实际项目中主要用于判断一个元素是否存在于大数量的集合中,其底层有两个核心步骤
初始化:首先需要设计K个哈希函数以及容量大小为N的,并且值都为0的数组。
判断元素是否存在:将集合中的元素经过K个哈希函数的计算得到K个序列值,然后将数组下标为K的元素设置成1。然后将要判断的元素经过同样的步骤,经过K个哈希函数,得到数组的下标,如果为1则说明大概率存在,如果为0,就肯定不存在了。
消息通信这个主要是通过Redisson分布式对象其中的一个组件“发布-订阅”功能实现的,其执行流程如下
这里跟RabbitMQ有点不一样,这里发布消息是将相应的消息或者数据以主题的形式进行发布,而消费者只需要订阅相应的主题即可实现自动监听消费主张,消息、从而执行相应的业务逻辑。
典型应用场景之介绍延迟队列与分布式锁
延迟队列
这里Redisson并没有像死信队列一样,而是采用阻塞式队列,就是说进入到Redisson队列中的消息将发生阻塞的现象,如果设置了TTL,那就消息就会在队列中暂时存留一段时间,直到TTL已过,才前往下一个中转站,进入真正的队列中。
这个阻塞式队列就相当于RabbitMQ的死信队列,主要是做一个暂存、缓冲的作用,当设置的TTL经过时间后,才进入真正的队列,等待被消费者监听。
分布式锁
Redis的SETNX和EXPIRE两个命令 ,EXPIRE需要对不同的业务设置时间,这就带来了一个“不可重入性”的问题,锁只有一个,并不是像Zookeeper一样是重入性的,每一个线程都会执行,而不是打回。
Redisson的分布式锁很好的解决了上述问题,以下为Redisson分布式锁控制多线程对共享资源的并发访问。
Redisson的分布式锁,有多种类型,比如一次性锁,可重入锁,联锁,红锁以及读写锁,应用最多的是一次性锁,可重入锁。
可重入锁:指的是当前线程如果没有获取锁,就会等待一段时间重新入获取这个锁,在调用tryLock的方法时指定。
一次性锁:“成者为王败者为寇”,要么获取锁成功,要么获取锁失败。Redisson主要是通过lock方法获取锁。
其实Redisson能实现的业务并不是仅仅上述这些,可以访问Redisson的官网。
Springboot整合Redisson
<!--redisson-->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.10.6</version>
</dependency>
package com.learn.boot.config;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.config.TransportMode;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* zlx
* Redissond的配置类
*/
@Configuration
public class RedissonConfig {
@Bean(name = "redissonClient")
public RedissonClient config() {
Config config = new Config();
//config.setTransportMode(TransportMode.EPOLL);
config.useSingleServer()
.setAddress("redis://127.0.0.1:6379")
.setKeepAlive(true);
return Redisson.create(config);
}
}
// 测试代码
@Autowired
private RedissonClient redissonClient;
@Test
public void test1() throws Exception{
log.info("redisson的配置信息:{}",redissonClient.getConfig().toJSON());
}