一、原子操作
1、单命令原子操作
如果是数据简单的增减,可以用Redis提供的单命令原子操作:
- INCR:数据增值+1
- DECR:数据减值-1
2、多个命令lua脚本原子性的方式执行
如果执行的命令不卡有简单的数据增减逻辑,还有各种判断逻辑,那就需要使用lua脚本,Redis会把整个lua脚本做为一个整体执行,从而保证lua脚本中操作的原子性。
假如我们编写的lua脚本为:lua.script,使用Redis的eval来执行,脚本所需要的参数可以通过命令中的keys,args进行传递:
redis-cli --eval lua.script keys, args
二、分布式锁
Redis是一个共享存储系统,读写性能很高,可以做为多个客户端保存分布式锁变量。
1、使用SETNX,DEL命令组合来实现加锁和释放锁
- SETNX:当key不存在时,创建key并设置值;当key存在时,不做任何操作
- DEL:删除key,相当于释放锁
SETNX lock_key 1 //加锁
//业务逻辑
Do THINGS
DEL lock_key //释放锁
这种方式存在的风险:
(1)客户端扩行SETNX加锁成功后,出现业务异常,未能释放锁
解决办法:可以通过设