redis采用单线程,在一些处理上速度快,效率高.
在一些购物平台上,比如秒杀某个物品,都是需要锁来进行资源的锁定,某个用户秒杀到了,就得确保别的用户不能抢,至于用户付款还是取消那就是别的事情了.
既然我们用redis,那就看看一些基本
Redis命令介绍
使用Redis实现分布式锁,有两个重要函数需要介绍
SETNX命令(SET if Not eXists)
语法:
SETNX key value
功能:
当且仅当 key 不存在,将 key 的值设为 value ,并返回1;若给定的 key 已经存在,则 SETNX 不做任何动作,并返回0。
GETSET命令
语法:
GETSET key value
功能:
将给定 key 的值设为 value ,并返回 key 的旧值 (old value),当 key 存在但不是字符串类型时,返回一个错误,当key不存在时,返回nil。
GET命令
语法:
GET key
功能:
返回 key 所关联的字符串值,如果 key 不存在那么返回特殊值 nil 。
DEL命令
语法:
DEL key [KEY …]
功能:
删除给定的一个或多个 key ,不存在的 key 会被忽略。
最好是设置一个超时的key 避免不必要的浪费嘛 下面我就贴代码了
public boolean acquireLock(String lock) {
boolean success = false;
Jedis jedis = jedisPool.getResource();
long value = System.currentTimeMillis() + getExpire() + 1;
System.out.println(value);
long acquired = jedis.setnx(lock, String.valueOf(value));
//SETNX成功,则成功获取一个锁
if (acquired == 1){
jedis.expire(lock, 5*60);
success = true;
//SETNX失败,说明锁仍然被其他对象保持,检查其是否已经超时
}else {
long oldValue = Long.valueOf(jedis.get(lock));
//超时
if (oldValue < System.currentTimeMillis()) {
String getValue = jedis.getSet(lock, String.valueOf(value));
// 获取锁成功
if (Long.valueOf(getValue) == oldValue)
success = true;
// 已被其他进程捷足先登了
else
success = false;
}
//未超时,则直接返回失败
else
success = false;
}
jedisPool.returnResource(jedis);
return success;
}
在秒杀的时候 我们枷锁最好是个数量 或者某个商品编号 最后我们在
try 的finally中unlock
public static void unLock(String key) {
Jedis jedis = jedisPool.getResource();
jedis.del(key);
jedisPool.returnResource(jedis);
}
至此就结束了.
有问题可以联系