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发布于 2019-12-20 22:23:40
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秒左右),那么就把等待时间设置得相当高。
发布于 2019-12-20 22:30:37
添加这个的提交是here。
这似乎暗示着它使用了锁定配方described in the Redis docs。
总的来说,这个方法依赖于原子地尝试设置一个键,如果它不存在(这就是锁),如果它已经存在,则失败。这意味着每次尝试都是对Redis服务器的一个命令,该命令本身非常快,但是如果您的Redis服务器是远程托管的,则存在网络往返的开销
https://stackoverflow.com/questions/59426550
复制相似问题