最好的建站公司,南昌做网站kaiu,磁力吧最佳搜索引擎,品牌网站建设有那两种模式Redis实战精讲-13小时彻底学会Redis 一、什么是分布式锁#xff1f; 要介绍分布式锁#xff0c;首先要提到与分布式锁相对应的是线程锁、进程锁。
l 线程锁#xff1a;主要用来给方法、代码块加锁。当某个方法或代码使用锁#xff0c;在同一时刻仅有一个线程执行该方法或该…Redis实战精讲-13小时彻底学会Redis 一、什么是分布式锁 要介绍分布式锁首先要提到与分布式锁相对应的是线程锁、进程锁。
l 线程锁主要用来给方法、代码块加锁。当某个方法或代码使用锁在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效果因为线程锁的实现在根本上是依靠线程之间共享内存实现的比如synchronized是共享对象头显示锁Lock是共享某个变量state。
l 进程锁为了控制同一操作系统中多个进程访问某个共享资源因为进程具有独立性各个进程无法访问其他进程的资源因此无法通过synchronized等线程锁实现进程锁。
l 分布式锁当多个进程不在同一个系统中用分布式锁控制多个进程对资源的访问。
二、分布式锁的使用场景。 线程间并发问题和进程间并发问题都是可以通过分布式锁解决的但是强烈不建议这样做因为采用分布式锁解决这些小问题是非常消耗资源的分布式锁应该用来解决分布式情况下的多进程并发问题才是最合适的。有这样一个情境线程A和线程B都共享某个变量X。
如果是单机情况下单JVM线程之间共享内存只要使用线程锁就可以解决并发问题。
如果是分布式情况下多JVM线程A和线程B很可能不是在同一JVM中这样线程锁就无法起到作用了这时候就要用到分布式锁来解决。
三、分布式锁的实现 分布式锁实现的关键是在分布式的应用服务器外搭建一个存储服务器存储锁信息这时候我们很容易就想到了Redis。首先我们要搭建一个Redis服务器用Redis服务器来存储锁信息。
在实现的时候要注意的几个关键点
锁信息必须是会过期超时的不能让一个线程长期占有一个锁而导致死锁同一时刻只能有一个线程获取到锁。
几个要用到的redis命令
setnx(key, value)“set if not exits”若该key-value不存在则成功加入缓存并且返回1否则返回0。
get(key)获得key对应的value值若不存在则返回nil。
getset(key, value)先获取key对应的value值若不存在则返回nil然后将旧的value更新为新的value。
expire(key, seconds)设置key-value的有效期为seconds秒。
分布式锁的三种实现方式
数据库乐观锁基于Redis的分布式锁基于ZooKeeper的分布式锁。