

Long userid = UserHolder.getUser().getId();
SimpleRedisLock lock = new SimpleRedisLock(StringRedisTemplate, "order:" + userid);
boolean trylock = lock.trylock(5L);
if (!trylock){
Result.fail("不能重复下单!");
}
try {
IVoucherOrderService proxy = (IVoucherOrderService) AopContext.currentProxy();//获取spring代理的类来保证事务的可用
return proxy.createVoucherorder(voucherId);
} finally {
lock.unLock();
}

public interface ILock {
public boolean trylock(Long timeoutSec);
public void unLock();
}
public class SimpleRedisLock implements ILock{
StringRedisTemplate StringRedisTemplate;
String name;
public SimpleRedisLock(org.springframework.data.redis.core.StringRedisTemplate stringRedisTemplate, String name) {
StringRedisTemplate = stringRedisTemplate;
this.name = name;
}
private static final String KEY_PREFIX= "lock:";
private static final String ID_PREFIX= UUID.randomUUID().toString(true)+"-";
@Override
public boolean trylock(Long timeoutSec) {
String id = ID_PREFIX+Thread.currentThread().getId();
Boolean aBoolean = StringRedisTemplate.opsForValue().setIfAbsent(KEY_PREFIX+name,id,timeoutSec, TimeUnit.SECONDS);
return Boolean.TRUE.equals(aBoolean);
}
@Override
public void unLock() {
String threadId = ID_PREFIX + Thread.currentThread().getId();
String id = StringRedisTemplate.opsForValue().get(KEY_PREFIX + name);
if (threadId.equals(id)){
StringRedisTemplate.delete(KEY_PREFIX+name);
}
}
}













总结
