redis悲观锁和乐观锁

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成功修改");
	}
}

你可能感兴趣的:(redis,数据库,缓存)