小编这次要给大家分享的是如何实现Redis分布式锁和解决超时问题,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。
成都创新互联公司主要从事成都网站设计、成都网站制作、外贸网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务松江,十载网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18980820575一 前言
redis在分布式应用十分广泛,本篇文章也是互联网面试的重点内容,读者至少需要知道为什么需要分布式锁,分布式锁的实现原理,分布式锁的应用场景,在使用分布式锁时遇到哪些问题?你是如何解决的,如果读者能掌握以上问题,那么关于这道面试题,你也就基本过关了;
二 分布式锁的产生背景
分布式锁对应的是多个应用,每个应用中都可能会处理相同的数据,如果多个应用对用一个操作进行了重复操作,就会出现数据不一致,数据重复问题,于是分布式锁应用而生,通常你可以理解为多线程中的synchronized
三 分布式锁的应用场景
多台机器都能执行某个任务,如果限制任务每次只能被一台机器执行,不能重复执行,就可以用分布式锁来做标记秒杀场景,要求并发量很高,那么同一件商品只能被一个用户抢到,就可以使用分布式锁实现比较敏感的数据比如金额修改,同一时间只能有一个人操作,如果2个人同时修改金额,一个加一个减金额,为了防止同时操作造成数据不一致,就可以使用分布式锁实现
四 分布式锁的实现
4.1 分布式锁的实现方式
- 基于数据库实现分布式锁
- 基于缓存(redis,memcached,tair)实现分布式锁
- 基于Zookeeper实现分布式锁
4.2 分布式锁使用原理
每个应用对敏感数据进行操作时都需要向获取一个锁,持有锁的应用才能对数据进行操作,保证在同一时间内只有一台应用能对数据进行操作;
4.3 分布式锁实现过程
基本实现思路:
redis分布式实现是基于 命令setnx key value , 其意指 若该键不存在则创建键,这就保证了redis中只有一个该键,故应用谁先获得该键,谁就拿到了锁的权限;然后业务逻辑执行完毕则需要使用 del key 删除键,表示释放锁;
出现了问题:
如果一台业务逻辑执行完毕,程序出现异常,则锁会一直存在,没有得到释放,其它应用就会无法获得锁,此时就会造成死锁问题;
改进方式:
拿到锁之后,给锁加上一个过期时间,也就是 expire key seconds 指令;此时避免了死锁问题,但是由于业务逻辑执行的时间不同,过期的时间设置也是一个问题,故通常分布式锁不能应用于业务逻辑执行较长的程序;
出现问题:
由于redis 每条指令都是原子性操作,但由于setnx 和 expire 是2 条指令,如果在执行setnx后程序出现问题expire指令未得到执行就会造成死锁问题;
解决问题:
redis2.8版本之后引入了指令 set key value [EX seconds] [PX milliseconds] [NX|XX] ,该指令可以同时执行 setnx 和 expire ,于是解决了死锁问题;
参数列表解释
- EX seconds: 设定过期时间,单位为秒
- PX milliseconds: 设定过期时间,单位为毫秒
- NX: key不存在时设置值
- XX: key存在时设置值
使用jedis客户端实现分布式锁方式
public boolean lock(Jedis jedis,String key,String val,int expireTime){ String lock = jedis.set(key, val, "NX", "PX", expireTime); return "OK".equals(lock); }
另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
文章标题:如何实现Redis分布式锁和解决超时问题-创新互联
文章地址:http://lswzjz.com/article/pcdeo.html