Github源码:
实现原理:
1.setnx
Redis的setnx指令(文档参考),setnx意为SET if Not eXists,命令格式:setnx $key $value
如果此key不存在,则设置值为value,返回值为1;如果此key存在,则不设置,返回值为0。如下图:
127.0.0.1:6379[1]>setnx key v
(integer)1
127.0.0.1:6379[1]>setnx key v2
(integer)0
redis是单线程的,是线程安全的,setnx指令由于上述的特性能够满足高并发情况下的对于锁的需求。
2.SpringData-redis
springData-redis是向Redis发送命令以及接受数据的高层次抽象的模版方法,简单理解为“使用java向redis发送命令以及接受数据的客户端”(文档参考)
V1
说明:
最简单的最粗糙的锁实现,实现了2个方法。
方法1:获取锁,public UUID acquire(String lockKey, long acquireTimeoutInMillis, long lockExpiryInMillis)
参数说明:lockKey为锁的key;acquireTimeoutInMillis为获取锁的等待时间,如果超过此时间就放弃锁;lockExpiryInMillis为锁的过期时间。
返回值:锁对应的值,就是命令中“setnx key value”的value。<