猎头可以做单的网站,wordpress如何设置点击直接下载,网站页面做专题的步骤,企业邮箱注册申请免费注册官网推荐链接#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD… 推荐链接 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoDB】 总结——》【Elasticsearch】 Redis——》死锁 一、死锁场景二、如何避免死锁1、两条命令实现SETNX加锁 EXPIRE过期时间1实现2优点3缺点 2、一条命令实现SET加锁 EXPIRE过期时间1实现2优点3缺点 一、死锁场景
// 加锁
SETNX lock_key 1// 业务逻辑
DO THINGS// 释放锁删除key
DEL lock_key以下情况会导致已经获得锁的客户端一直占用锁其他客户端永远无法获取到锁这就是死锁
程序处理业务逻辑异常没及时释放锁进程挂了没机会释放锁
二、如何避免死锁
方案给锁设置一个过期时间 示例假设操作共享资源的时间不会超过10s那么加锁时给这个key设置10s过期。
1、两条命令实现SETNX加锁 EXPIRE过期时间
1实现
SETNX lock_key 1 // 加锁
EXPIRE lock_key 10 // 10s后自动过期2优点
锁可以被自动释放其它客户端依旧可以拿到锁
3缺点
如果过期时间设置失败依旧发生死锁问题。
原因 加锁、设置过期时间是2条命令这2条命令不能保证是原子操作一起成功有可能只执行了第一条第二条却执行失败
场景
SETNX执行成功执行EXPIRE时由于网络问题执行失败SETNX执行成功Redis异常宕机EXPIRE没有机会执行SETNX执行成功客户端异常崩溃EXPIRE没有机会执行
2、一条命令实现SET加锁 EXPIRE过期时间
在Redis 2.6.12之后Redis扩展了SET命令的参数可以在SET的同时指定EXPIRE时间这条操作是原子的。
1实现
SET lock_key 1 EX 10 NX // 10s后自动过期2优点
解决死锁问题
3缺点
可能发生释放别人的锁参考链接Redis——》锁被别人释放