明白微服务下分布式锁的正确姿势
副问题[/!--empirenews.page--]
将key的值设为value ,当且仅当key不存在。若给定的key已经存在,则SETNX不做任何举措。setnx:当key存在,不做任何操纵,key不存在,才配置 加锁:SET orderId driverId NX PX 30000 上面的呼吁假如执行乐成,则客户端乐成获取到了锁,接下来就可以会见共享资源了;而假如上面的呼吁执行失败,则声名获取锁失败。 开释锁:要害,判定是不是本身加的锁。 GrabService :public interface GrabService {
/** * 商品抢单 * @param orderId * @param driverId * @return */ public ResponseResult grabOrder(int orderId, int driverId); } GrabRedisLockServiceImpl :@Service("grabRedisLockService") public class GrabRedisLockServiceImpl implements GrabService {
@Autowired StringRedisTemplate stringRedisTemplate;
@Autowired OrderService orderService;
@Override public ResponseResult grabOrder(int orderId , int driverId){ //天生key String lock = "order_"+(orderId+""); /* * 环境一,假如锁没执行到开释,好比营业逻辑执行一半,运维重启处事,或 处事器挂了,没走 finally,怎么办? * 加超时时刻 */ // boolean lockStatus = stringRedisTemplate.opsForValue().setIfAbsent(lock.intern(), driverId+""); // if(!lockStatus) { // return null; // }
/* * 环境二:加超时时刻,会有加不上的环境,运维重启 */ // boolean lockStatus = stringRedisTemplate.opsForValue().setIfAbsent(lock.intern(), driverId+""); // stringRedisTemplate.expire(lock.intern(), 30L, TimeUnit.SECONDS); // if(!lockStatus) { // return null; // }
/* * 环境三:超时时刻应该一次加,不该该分2行代码, * */ boolean lockStatus = stringRedisTemplate.opsForValue().setIfAbsent(lock.intern(), driverId+"", 30L, TimeUnit.SECONDS); if(!lockStatus) { return null; }
try { (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |