簡體   English   中英

PHP Redis 會話鎖定內部結構

[英]PHP Redis Session Locking Internals

phpredis會話鎖定如何在內部工作? 它是否在內部存儲一個值並不斷檢查它? 如果我有一個很高的redis.session.lock_retries ,如果需要 10 秒才能獲得鎖定並且必須嘗試數千次,這是否會給服務器帶來負載?

下面是配置參數。

; Should the locking be enabled? Defaults to: 0.
redis.session.locking_enabled = 1
; How long should the lock live (in seconds)? Defaults to: value of max_execution_time.
redis.session.lock_expire = 60
; How long to wait between attempts to acquire lock, in microseconds (µs)?. Defaults to: 2000
redis.session.lock_wait_time = 50000
; Maximum number of times to retry (-1 means infinite). Defaults to: 10
redis.session.lock_retries = 10

看起來這是一個熱循環:

static int lock_acquire(RedisSock *redis_sock, redis_session_lock_status *lock_status)
{
  ...
  for (i = 0; retries == -1 || i <= retries; i++) {
      set_lock_key_result = set_session_lock_key(redis_sock, cmd, cmd_len);
      ...
      /* Sleep unless we're done making attempts */
      if (retries == -1 || i < retries) {
        usleep(lock_wait_time);
      }

對於長時間阻塞的請求,沒有指數回退或其他緩解措施。 如果您有一個高點差(例如有時是即時鎖定獲取,有時是 1s,有時是 10s 等),那么我建議將鎖定嘗試長度設置得相當低,然后編寫您自己的熱循環,使回退更符合您預計的等待時間。 如果您有一個相當穩定的預期等待時間(例如總是大約 10 秒),那么只需將等待時間設置得相當高。

添加這個的提交 在這里

這似乎暗示它使用了 Redis 文檔中描述的鎖定方法。

總的來說,這個秘籍依賴於原子地嘗試設置一個不存在的鍵(這是鎖),如果它已經存在則失敗。 這意味着每次嘗試都是對 Redis 服務器的命令,該命令本身非常快,但是如果您的 Redis 服務器是遠程托管的,則存在網絡往返的開銷

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM