redis学习-30- Redis分布式锁应用实现

33.分布式锁应用实现

  • 在分布式系统中,当不同进程或线程一起访问共享资源时,会造成资源争抢,如果不加以控制的话,就会引发程序错乱。此时使用分布式锁能够非常有效的解决这个问题,它采用了一种互斥机制来防止线程或进程间相互干扰,从而保证了数据的一致性。对分布式系统这一概念不清楚,可参考百度百科分布式系统,简而言之,它是一种架构、一种模式。
33.1 Redis分布式锁
  • 分布式锁并非是 Redis 独有,比如 MySQL 关系型数据库,以及 Zookeeper 分布式服务应用,它们都实现分布式锁,只不过 Redis 是基于缓存实现的。

  • Redis 分布式锁有很对应用场景,举个简单的例子,比如节假日时,需要在 订购热门景点的门票,但 Redis 数据库中只剩一张票了,此时有多个用户来预订购买,那么这张票会被谁抢走呢?Redis 服务器又是如何处理这种情景的呢?在这个过程中就需要使用分布式锁。

  • Redis 分布式锁主要有以下特点:

    • 第一:互斥性是分布式锁的重要特点,在任意时刻,只有一个线程能够持有锁;
    • 第二:锁的超时时间,一个线程在持锁期间挂掉了而没主动释放锁,此时通过超时时间来保证该线程在超时后可以释放锁,这样其他线程才可以继续获取锁;
    • 第三:加锁和解锁必须是由同一个线程来设置;
    • 第四:Redis 是缓存型数据库,拥有很高的性能,因此加锁和释放锁开销较小,并且能够很轻易地实现分布式锁。

注意:一个线程代表一个客户端。

33.2 Redis分布式锁命令
  • 分布式锁的本质其实就是要在 Redis 里面占一个锁,当别的进程也要来占时,发现已经有人锁了,就只好放弃或者稍做等待。这个锁同一时刻只允许被一个客户端占据,也就是本着“先来先占”的原则。

  • Redis 分布式锁常用命令如下所示:

    • SETNX key val:仅当key不存在时,设置一个 key 为 value 的字符串,返回1;若 key 存在,设置失败,返回 0;
    • Expire key timeout:为 key 设置一个超时时间,以 second 秒为单位,超过这个时间锁会自动释放,避免死锁;
    • DEL key:删除 key。
  • 上述 SETNX 命令相当于加锁操作,EXPIRE 是为避免出现意外用来设置锁的过期时间,也就是说到了指定的过期时间,该客户端必须让出锁,让其他客户端去持有。

  • 还有一种情况,如果在 SETNX 和 EXPIRE 之间服务器进程突然挂掉,也就是还未设置过期时间,这样就会导致 EXPIRE 执行不了,因此还是会造成“死锁”的问题。为了避免这个问题,Redis 作者在 2.6.12 版本后,对 SET 命令参数做了扩展,使它可以同时执行 SETNX 和 EXPIRE 命令,从而解决了死锁的问题。直接使用 SET 命令实现,语法格式如下:

SET key value [expiration EX seconds|PX milliseconds] [NX|XX]  
    • EX second:设置键的过期时间为 second 秒。 SET key value EX second 效果等同于 SETEX key second value 。
    • PX millisecond:设置键的过期时间为毫秒。SET key value PX millisecond 效果等同于 PSETEX key millisecond value 。
    • NX:只在键不存在时,才对键进行设置操作。 SET key value NX 效果等同于 SETNX key value 。
    • XX:只在键已经存在时,才对键进行设置操作。
  • 下面进行简单的命令演示:

remote:0>setnx name tony
"1"
remote:0>expire name 60
"1"
remote:0>get name
"tony"
remote:0>ttl name
"44"
remote:0>get name
"tony"
remote:0>ttl name
"23"

remote:0>set title "hello redis!" ex 60 nx
"OK"
#超时释放
remote:0>get name
null
remote:0>ttl title
"42"
下一篇:redis学习-31- Redis三种缓存问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值