使用redis实现分布式锁

Posted 再见傅里叶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用redis实现分布式锁相关的知识,希望对你有一定的参考价值。

当高并发访问某个接口的时候,如果这个接口访问的数据库中的资源,并且你的数据库事务级别是可重复读(Repeatable read)的话,确实是没有线程问题的,因为数据库锁的级别就够了;但是如果这个接口需要访问一个静态变量、静态代码块、全局缓存的中的资源或者redis中的资源的时候,就会出现线程安全的问题。

解决办法:

解决1: 学过javase的小伙伴应该都能想到使用synchronized关键字,强行同步。

缺点:
1、我们可以明显的看到速度变慢了,从原来的0.535秒变到了10.956秒,那是因为synchronized放这个方法只允许单线程访问了。
2、synchronized是粗粒度的控制了线程安全,即:如果我这个商品id不一样的线程,理论上是可以同时访问这个方法的,但是加上了synchronized之后,无论商品id是否一样,两个线程都是没法同时访问这个方法的。
解决2: 使用redis分布式锁(主要使用了redis中的setnxgetset方法,这两个方法在redisTemplate分别是setIfAbsentgetAndSet方法)实现线程安全,因为redis是单线程,能保证线程的安全性,而且redis强大的读写能力能提高效率。

 

参考文章https://blog.csdn.net/tuesdayma/article/details/82751790

https://www.sohu.com/a/322226531_661203

https://www.jianshu.com/p/c5048208709c

 

以上是关于使用redis实现分布式锁的主要内容,如果未能解决你的问题,请参考以下文章

真正的 Redis 分布式锁,就该是这样实现的

使用Redis实现分布式锁

使用Redis实现分布式锁

redis 分布式锁

分布式锁Redis分布式锁注解灵活实现

Redis 作者 Antirez 讲如何实现分布式锁?Redis 实现分布式锁天然的缺陷分析&Redis分布式锁的正确使用姿势!...