redis悲观锁
Redis加锁命令分有INCR、SETNX、SET
一、INCR锁
key不存在时,key的值会先被初始化为0,其它用户在执行INCR操作进行加一,
如果返回的数大于1,说明这个锁正在被使用当中,通常用在同时只能有一个人可以操作某个行为。
二、SETNX锁
当key不存在时,将key设置为value,如果key已存在,则SETNX不做任何动作。
三、SET锁
设置成功就表示加锁成功,设置失败就是加锁失败。只有一个人持有。
仔细看会发现,都是先设置值,如果成功则表示获取锁成功,然后再执行业务代码,在释放锁。所以都属于悲观锁。
乐观锁:
Redis的乐观锁主要是通过watch()来实现的,watch()的作用是监视键值对,首先是用multi()开启事务,exec()提交事务,提交事务的时候如果发现键值对的值发生变化则会取消事务,
public void watch() {
String watchKeys = "watchKeys";
//初始值 value=1
jedis.set(watchKeys, 1);
//监听key为watchKeys的值
jedis.watch(watchkeys);
//开启事务
Transaction tx = jedis.multi();
//watchKeys自增加一
tx.incr(watchKeys);
//执行事务,如果其他线程对watchKeys中的value进行修改,则该事务将不会执行
//通过redis事务以及watch命令实现乐观锁
List<Object> exec = tx.exec();
if (exec == null) {
System.out.println("事务未执行");
} else {
System.out.println("事务成功执行,watchKeys的value成功修改");
}
}