Redis实现的分布式锁和分布式限流

随着现在分布式越来越普遍,分布式锁也十分常用,这篇文章解释了使用zookeeper实现分布式锁,本次咱们说一下如何用Redis实现分布式锁和分布限流。

Redis有个事务锁,就是如下的命令,这个命令的含义是将一个value设置到一个key中,如果不存在将会赋值并且设置超时时间为30秒,如何这个key已经存在了,则不进行设置。

SETkeyvalueNXPX30000

这个事务锁很好的解决了两个单独的命令,一个设置setkeyvaluenx,即该key不存在的话将对其进行设置,另一个是expirekeyseconds,设置该key的超时时间。

我们可以想一下,如果这两个命令用程序单独使用会存在什么问题:

如果一个setkey的命令设置了key,然后程序异常了,expire时间没有设置,那么这个key会一直锁住。

如果一个setkey时出现了异常,但是直接执行了expire,过了一会儿之后另一个进行setkey,还没怎么执行代码,结果key过期了,别的线程也进入了锁。

还有很多出问题的可能点,这里我们就不讨论了,下面咱们来看看如何实现吧。

本文使用的SpringBoot2。

x+Springdataredis+Swagger+lombok+AOP+lua脚本。

在实现的过程中遇到了很多问题,都一一解决实现了。


0