Redis实现乐观锁
一、什么是锁
锁一般是用于锁定一些公共的资源,防止由于高并发而出现“超库存”的情况(例如抢票、秒杀系统)
锁可以分为两种:
- 乐观锁
乐观锁认为无论什么时候都不会出现问题,所以不会上锁,只是在更新数据的时候,会去比对某个字段(版本号),查询在这期间是否有人操作过这个数据 - 悲观锁
悲观锁任务,无论什么时候都会出现问题,所以无论做什么操作都会上锁。上锁虽然保障了安全性,但是性能上会大打折扣
二、Redis实现乐观锁
Redis是通过watch的方式来实现乐观锁的
示例:通过两个终端连接redis
终端1:
127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> watch money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incrby money 20
QUEUED
127.0.0.1:6379> decrby consume 20
QUEUED
终端2:
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 20
QUEUED
127.0.0.1:6379> exec
此时,终端1才提交事务
127.0.0.1:6379> exec
(nil) -- 执行失败
当执行失败的时候,先执行unwatch取消监视,再重复之前的操作再开一个事务即可