网站大全网站免费,免费ppt模板可编辑,网页界面设计教案,竭诚网络网站建设公司背景
分布式应用中#xff0c;经常会遇到并发问题。熟悉的朋友都知道这个时候就需要加锁。只有原子操作才能保证数据不会混乱。#xff08;原子操作是不会被线程调度机制所打断的的操作#xff0c;一旦开始就会执行到最后#xff0c;要么做要么不做#xff0c;不会被打断… 背景
分布式应用中经常会遇到并发问题。熟悉的朋友都知道这个时候就需要加锁。只有原子操作才能保证数据不会混乱。原子操作是不会被线程调度机制所打断的的操作一旦开始就会执行到最后要么做要么不做不会被打断分布式锁应运而生。
本质
分布式锁要实现的目标就是在Redis中占一个格子当其他进程也要进来的时候发现已经被占领了就只好放弃或者等待。
一般用于占格子的命令是 setnx(set if not exists) 如setnx lock:asfagas true 很好记忆如果没有就设置先来先占用完之后del指令释放格子。 所以流程是先占格子做事情再释放如果事情做到一半出现异常了那么是不是就是del不了了就会一直占用成为所谓的死锁。
解决方案
我们可以在占格子的时候设置一个定时如果超过这个时间事情还没做完异常会自动释放那么就解决了可能会出现死锁的问题。 expire 锁名字 秒数 如 expire lock:asfas 5 代表五秒之后解锁 我们是先setnx设置锁expire设置过期时间看起来天衣无缝但是如果这两条命令之间出现问题了怎么办。
所以在2.8版本中作者加入了set扩展参数使得它俩一起执行成为原子操作就真的天衣无缝了 set lock:asfawf true ex 5 nx ok lock:asfawf这是要设置的键名。在这个例子中键名为 lock:asfawf。true这是要设置的值。在这个例子中值是 true。ex 5这是可选参数表示键的过期时间。在这个例子中过期时间是 5 秒。nx这是一个条件选项表示仅当键不存在时才对键进行设置操作。在这个例子中如果键 lock:asfawf 已经存在那么命令将不会执行任何操作。ok这是一个响应选项表示如果命令执行成功返回 OK。在这个例子中如果命令执行成功将返回 OK 分布式锁的奥义便是这个