新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要讲解了Java基于redis实现分布式锁的方法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。
我们提供的服务有:网站建设、成都网站制作、微信公众号开发、网站优化、网站认证、威信ssl等。为近千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的威信网站制作公司为什么会有这个需求:
例如一个简单用户的操作,一个线程去修改用户状态,首先在在内存中读出用户的状态,然后在内存中进行修改,然后在存到数据库中。在单线程中,这是没有问题的。但是在多线程中由于读取,修改,写入是三个操作,不是原子操作(同时成功或失败),因此在多线程中会存在数据的安全性问题。
这个问题的话,就可以用分布式锁在限制程序的并发执行。
实现思路:
就是进来一个先占位,当别的线程进来操作的时候,发现有人占位了,就会放弃或者稍后再试。
占位的实现:
在redis中的setnx命令来实现,redis命令可以参考我这篇博客https://www.cnblogs.com/javazl/p/12657280.html,默认set命令就是存值,当key存在的时候,set就会覆盖key的value值,而setnx则不会。当没有key的时候,setnx就会进来先占位,当key存在了,其他的setnx就进不来了。。等到第一个执行完成后,在del命令释放位子。
代码实现:
public class LockTest { public static void main(String[] args) { Redis redis = new Redis(); redis.execute(jedis->{ Long setnx = jedis.setnx("k1", "v1"); //setnx的返回值为long类型 if (setnx == 1) { //没人占位 jedis.set("name", "zl"); String name = jedis.get("name"); System.out.println(name); //释放资源 jedis.del("k1"); }else{ //有人占位,停止/暂缓 操作 } }); } }
另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。