【Redisson】源码预读准备工作
1 前言
微服务常见的就是服务和服务之间的协同了,那么 Redisson 就是我们常用的一种协同工具了,所以想看看它的源码,只有了解它的原理,才能更好的正确使用它。
2 准备工作
既然要看是不是得先知道的它的源码地址呢?地址:Redisson 源码
有了源码,是不是还需要一份文档呢?没文档的话怎么知道它的组成成分呢?每个组件和组件之间的关系呢?是不是:官方中文文档奉上,打开慢? gitee地址奉上
我找了找关于 Redisson 的书籍,因为我喜欢边看源码边看书,因为书讲的很全很细,能从头给我们讲它的由来,它的发展过程,但是没找到一本专门讲 Redisson 的书籍(大多都是官网文档的东西),有小伙伴知道的话,还望告下我。
3 概览
从整个目录结构看下来,大概分这些内容:
从配置到使用,以及夹杂着各种数据结构和对象,以及服务和服务之间的协同,再到框架的整合。
配置、框架整合:告诉我们要使用 Redisson 应该怎么引入,并且怎么配置
调用方式:主要分同步和异步以及异步流式调用(响应式框架使用比如阿里的gateway网关里使用)
序列化:讲究的就是我们存取数据时,肯定是要先序列化和反序列化对象的哈,默认的也是 spring里的默认的 jackson (这里延申一下,我们平时常用的json方式有哪些呢?是不是就是 jackson、fastjson、gson三个,至于哪个好,唉,没细细研究过,我做过的项目那家伙五花八门的啥也用)
数据分片:主要就是大对象的拆分,降低单节点的负载
分布式对象:主要包含了一些高级对象,布隆过滤器呀、基数统计呀、原子型对象、限流器对象等
分布式集合:队列、Set、Zset、映射等
分布式服务:这个有点牛皮了,可以通过它进行服务的注册和调用,以及一些高级用法
分布式锁:提供各种锁,来协同各个服务(可以是某个服务下的多个实例、也可以是不同服务之间的协同,在我们 Java 里本质就是协同多个JVM进程)
命令对象关系:主要是串联 Redis中的操作,在 Redisson中对应的操作关系
其他:就剩 Redisson 给我们的一些其他高级功能、以及工具哈。
4 简单尝试
那看了一下整体的大概,我们动手尝试尝试:
首先引入依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.15.0</version> </dependency>
创建 Redisson 的 Bean:
/** * @author kuku */ @Configuration @EnableConfigurationProperties({RedisProperties.class}) public class RedissonConfig { @Autowired private RedisProperties redisProperties; @Bean public RedissonClient redissonClient(){ Config config = new Config(); SingleServerConfig singleServerConfig = config.useSingleServer(); singleServerConfig.setAddress("redis://"+redisProperties.getHost()+":"+redisProperties.getPort()); singleServerConfig.setDatabase(redisProperties.getDatabase()); if(StringUtils.isNotBlank(redisProperties.getPassword())) { singleServerConfig.setPassword(redisProperties.getPassword()); } return Redisson.create(config); } }
共享变量的安全递增:
/** * @author kuku */ @RestController @RequestMapping("/user/") public class UserController { private int num = 0; @Autowired private RedissonClient redissonClient; @GetMapping("/testRedisson") public String testRedisson() { RLock lock = redissonClient.getLock("numFlag"); lock.lock(); try { num++; } finally { lock.unlock(); } return String.valueOf(num); } }
5 小结
好啦,本节就看到这里,剩下的要开始一点点详细的去扣细节了,有理解不对的地方欢迎指正哈。