redis悲观锁
Redis加锁命令分有INCR、SETNX、SET
一、INCR锁
key不存在时,key的值会先被初始化为0,其它用户在执行INCR操作进行加一,
如果返回的数大于1,说明这个锁正在被使用当中,通常用在同时只能有一个人可以操作某个行为。
二、SETNX锁
当key不存在时,将key设置为value,如果key已存在,则SETNX不做任何动作。
三、SET锁
设置成功就表示加锁成功,设置失败就是加锁失败。只有一个人持有。
仔细看会发现,都是先设置值,如果成功则表示获取锁成功,然后再执行业务代码,在释放锁。所以都属于悲观锁。
乐观锁:
Redis的乐观锁主要是通过watch()来实现的,watch()的作用是监视键值对,首先是用multi()开启事务,exec()提交事务,提交事务的时候如果发现键值对的值发生变化则会取消事务,
Transaction transaction = jedis.multi();
try {
// 在事务中执行多个命令
transaction.set("key1", "value1");
transaction.set("key2", "value2");
// 提交事务
transaction.exec();
} catch (JedisDataException e) {
// 处理事务中的异常
System.out.println("Transaction aborted: " + e.getMessage());
} finally {
// 关闭事务
if (transaction != null) {
transaction.close();
}
}
这个事务的使用主要是用来执行多个命令,其实也就是同时指定多个命令。
缺点就是:如果报错了,是不能回滚的。这也就是缺乏:原子性和一致性。