繁体   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