redis分布式锁问题

今天被面试一个问题,是这样: 为了解决某个并发问题,我写了一个redis分布式锁,并设置了过期时间。面试官反问的问题是,如果服务挂了,如何保证资源不被一直锁住? 嗯…我回答的是,设置了键的过期时间,到了一定时间,会根据redis的过期策略清除掉。 面试官好像不满意,想知道,这样说哪里不对吗?

设置过期时间是为了解决这样一个问题:某个线程得到锁之后突然挂掉了,那么这个锁就不会被释放掉了,这样其他等待的线程就拿不到锁了,程序不就崩了嘛(注意Redis2.6.12版本已经有一个原子命令同时设置key和超时时间了,避免面试采坑:https://redis.io/commands/set)。 但是,单纯设置超时时间还不行。设想这样一个场景:线程1成功得到了锁,并且设置的超时时间是10秒,假如线程1执行的这次操作太慢了,一共花了 11秒,线程1的🔐锁在10秒之后就释放了,这个锁被线程2得到。等到线程1执行完之后就要去释放锁了,但是这个时候锁在线程2那里,为了避免误删除其他线程的锁,我们还要判断当前的锁是不是自己的(可以在加锁的时候把当前的线程ID当做value,并在删除之前验证key对应的value是不是自己线程的ID)。 另外,需要注意这里判断当前锁是不是自己的,需要通过Lua脚本去做保证原子性。

再推荐几篇不错的文章,你可以参考一下: 1.面试被问Redis锁,我哭了qaq...... 2.【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架 3.姗姗来迟的Redis分布式锁 4.Redis分布式锁解决方案

posted @ 2020-04-18 14:15  &小程序&  阅读(564)  评论(0编辑  收藏  举报