首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP Redis会话锁定内部机制

问PHP Redis会话锁定内部机制
EN

Stack Overflow用户
提问于 2019-12-20 22:06:15
回答 2查看 2K关注 0票数 4

phpredis会话锁定在内部是如何工作的?它会在内部存储一个值并不断检查它吗?如果我有一个高redis.session.lock_retries,如果需要10秒才能获得一个锁,并必须尝试数千次,会不会给服务器带来负载?

以下是配置参数。

代码语言:javascript
复制
; 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
EN

回答 2

Stack Overflow用户

发布于 2019-12-20 22:23:40

Looks like it's a hot loop:

代码语言:javascript
复制
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秒左右),那么就把等待时间设置得相当高。

票数 3
EN

Stack Overflow用户

发布于 2019-12-20 22:30:37

添加这个的提交是here。

这似乎暗示着它使用了锁定配方described in the Redis docs。

总的来说,这个方法依赖于原子地尝试设置一个键,如果它不存在(这就是锁),如果它已经存在,则失败。这意味着每次尝试都是对Redis服务器的一个命令,该命令本身非常快,但是如果您的Redis服务器是远程托管的,则存在网络往返的开销

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59426550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档