redis使用jedis和redisssion实现分布式锁

使用redis 缓存实现分布式锁,主要分为两种
1.使用jedis客户端操作redis,实现分布式锁
2.使用redission框架操作redis,实现分布式锁
这两种方式其原理是一致的,都是使用lua脚本进行redis操作
加锁的本质是将key-value键值对存入redis,如果redis已经有了则加锁失败;如果没有则新增一个key-value则加锁成功。
释放锁的本质的将加锁时存入redis的key-value进行删除。

但是redisson框架实现了java的Lock,操作更加简单且功能更加强大。
使用jedis时必须将SETNX 和 SETEXPIRE一起执行(保证原子性)

在实现分布式锁时,必须考虑的一些异常情况:
Jedis 加入的过期时间设置,到达这个时间后,jedis会自动删除key.保证了系统宕机后,能正常释放锁,保证一定时间后其他线程可以获取到锁。但是如果到达过期时间后,业务还没有执行完,锁自动释放(所以锁的过期时间通常设置为业务代码执行锁需要的时间再长一点)。导致线程2获取锁后执行业务,这个时候线程1 执行结束后释放了锁2,这是就会产生问题。针对与这种情况,jedis加锁方法还有一个requestId的参数(可以UUID生成,为了区分该锁时哪一个请求的),这个时候就解决了上述问题。即实现了解铃还须系铃人(谁上锁谁解锁)

你可能感兴趣的:(redis,nosql)