Spring cloud项目扩展(三)项目集成redis分布式锁

​上一篇中,我们在springcloud项目中集成了redis,这一篇通过redis来实现分布式锁。锁的基本概念可以自行百度,最通俗的意思是,在一条路上安装一个门,这个门同时只允许一个线程通过,每个线程通过的时候都在这个门上加一把锁,线程结束解锁后才允许处理别的线程。springcloud项目一般都是采用多节点部署,当两个又互斥性的操作同时进行时,就需要加锁来保证数据的准确性,类似于数据的事务。通过锁保证read和write是一个原子性的操作,不允许在read和write的过程中有其他对数据的操作。话不多说,直接开始。

1,启动我们的redis,测试启动成功。

Spring cloud项目扩展(三)项目集成redis分布式锁

2,依旧以我们的example-service项目为例。创建lock包和实现包impl,并创建接口Lock和接口实现LockImpl,目录结构如图。

Spring cloud项目扩展(三)项目集成redis分布式锁

3,项目中引入jar包

Spring cloud项目扩展(三)项目集成redis分布式锁

4,写锁的接口。加锁,解锁和自旋锁。所谓的自旋锁就是再未获得锁的时候循环直到获取锁为止。

Spring cloud项目扩展(三)项目集成redis分布式锁

5,下面是对锁的实现。

Spring cloud项目扩展(三)项目集成redis分布式锁

Spring cloud项目扩展(三)项目集成redis分布式锁

Spring cloud项目扩展(三)项目集成redis分布式锁

Spring cloud项目扩展(三)项目集成redis分布式锁

6,在controller中创建两个方法用来测试。

Spring cloud项目扩展(三)项目集成redis分布式锁

Spring cloud项目扩展(三)项目集成redis分布式锁

7,使用postman创建两个请求进行测试。

Spring cloud项目扩展(三)项目集成redis分布式锁

Spring cloud项目扩展(三)项目集成redis分布式锁

8,看日志输出结果,证明锁的存在。

Spring cloud项目扩展(三)项目集成redis分布式锁

Spring cloud项目扩展(三)项目集成redis分布式锁

在写这个锁的时候遇到一些问题。在测试的时候发现,如果在单元测试中启动线程进行测试,则会报与redis server连接超时。网上解释说是由于springboot2.x 客户端使用的lettuce实现导致的。到最后依然没有解决这个问题。 使用dedisclient不会出现这个问题。代码和测试方式在example-web中有实现。

公众号回复springcloud获取git地址,可以进行下载全部代码。