码迷,mamicode.com
首页 > 其他好文 > 详细

使用redis实现分布式锁

时间:2020-03-04 20:51:55      阅读:53      评论:0      收藏:0      [点我收藏+]

标签:解决办法   redist   分布   style   提高   级别   访问   details   允许   

当高并发访问某个接口的时候,如果这个接口访问的数据库中的资源,并且你的数据库事务级别是可重复读(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实现分布式锁

标签:解决办法   redist   分布   style   提高   级别   访问   details   允许   

原文地址:https://www.cnblogs.com/gouhaiping/p/12412008.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!