当前位置:  首页>> 技术小册>> Redis面试指南

答案:

Redis可以通过setnx(SET if Not eXists)命令和expire命令实现分布式锁。

使用setnx命令尝试获取锁,如果返回值为1,则表示获取到了锁。

如果获取到了锁,就需要设置一个过期时间,以免锁被长时间占用。

如果获取锁失败,则需要等待一段时间后重新尝试获取锁,可以使用睡眠函数进行等待。

释放锁时需要使用del命令将锁删除。

以下是一个示例代码:

  1. def acquire_lock(conn, lockname, acquire_timeout=10, lock_timeout=10):
  2. identifier = str(uuid.uuid4())
  3. lock_key = 'lock:' + lockname
  4. end = time.time() + acquire_timeout
  5. while time.time() < end:
  6. if conn.setnx(lock_key, identifier):
  7. conn.expire(lock_key, lock_timeout)
  8. return identifier
  9. elif not conn.ttl(lock_key):
  10. conn.expire(lock_key, lock_timeout)
  11. time.sleep(0.001)
  12. return False
  13. def release_lock(conn, lockname, identifier):
  14. lock_key = 'lock:' + lockname
  15. while True:
  16. conn.watch(lock_key)
  17. if conn.get(lock_key) == identifier:
  18. conn.multi()
  19. conn.delete(lock_key)
  20. if conn.execute():
  21. return True
  22. conn.unwatch()
  23. break
  24. return False

注意点:

为了避免误删其他线程获取的锁,释放锁时需要检查锁的值是否为自己的标识符。

在设置锁的过期时间时,需要保证锁的过期时间大于锁的执行时间,以避免锁被意外释放。

为了避免死锁,需要设置获取锁的超时时间,超时后自动放弃获取锁。


该分类下的相关小册推荐: