Redis之分布式锁

背景

分布式应用中,经常会遇到并发问题。熟悉的朋友都知道这个时候就需要加锁。只有原子操作才能保证数据不会混乱。(原子操作是不会被线程调度机制所打断的的操作,一旦开始就会执行到最后,要么做要么不做,不会被打断),分布式锁应运而生。

本质

分布式锁要实现的目标就是在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

  1. lock:asfawf:这是要设置的键名。在这个例子中,键名为 "lock:asfawf"。
  2. true:这是要设置的值。在这个例子中,值是 "true"。
  3. ex 5:这是可选参数,表示键的过期时间。在这个例子中,过期时间是 5 秒。
  4. nx:这是一个条件选项,表示仅当键不存在时,才对键进行设置操作。在这个例子中,如果键 "lock:asfawf" 已经存在,那么命令将不会执行任何操作。
  5. ok:这是一个响应选项,表示如果命令执行成功,返回 "OK"。在这个例子中,如果命令执行成功,将返回 "OK"

分布式锁的奥义便是这个

相关推荐
施嘉伟1 分钟前
KSQL Developer 测试记录
数据库·kingbase
予枫的编程笔记4 分钟前
Elasticsearch聚合分析与大规模数据处理:解锁超越搜索的进阶能力
java·大数据·人工智能·分布式·后端·elasticsearch·全文检索
谱度众合5 分钟前
【蛋白互作研究】邻近标记PL-MS实验指南:如何精准获取目标蛋白的基因序列?
数据库·科技·蛋白质组学·药物靶点·生物科研
sww_102610 分钟前
Kafka和RocketMQ存储模型对比
分布式·kafka·rocketmq
无心水11 分钟前
【分布式利器:腾讯TSF】3、服务注册发现深度解析:构建动态弹性的微服务网络
网络·分布式·微服务·架构·分布式利器·腾讯tsf·分布式利器:腾讯tsf
麦聪聊数据15 分钟前
生成测试数据(三):从建表到 CRUD 的冷启动
数据库·sql
Awkwardx18 分钟前
MySQL数据库—MySQL复合查询
数据库·mysql
2301_8002561119 分钟前
R-Tree创建与遍历,R-Tree在4类空间查询中的应用,实现4类空间查询的各类算法[第8章]
数据库·算法·机器学习·postgresql·r-tree
十月南城19 分钟前
分布式ID选型——雪花、号段、数据库自增与时钟回拨的风险控制
数据库·分布式
老邓计算机毕设19 分钟前
SSM校园快递代取平台32618(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·校园快递代取平台