在高负载上与 PHP+Redis 的并发连接


Concurrent connections with PHP+Redis on highload

是否有一些机制来处理高并发数据?

首先,我们使用了mongodb,它具有解决问题的原子更新。但是更新频率高达大约 1000''秒,我们设置 Redis 来帮助 mongo 并在它们之间写入同步。它工作得很好,但我们在 redis 方面存在一致性问题。

例如:

  1. 第一个请求在 0.01ms 时出现 - 进程在 0.04ms 时退出
  2. 第二个请求在 0.02ms 时出现,在 0.03 秒时退出。

两个请求都得到相同的对象? 更改其数据并在退出时保存。

当我们使用 mongodb 时 - 我们可以做 - 对对象进行部分更新,但使用 redis - 我们不能。

是否可以同时使用来自多个进程的相同对象(数据)进行操作,而不是覆盖整个 - 仅覆盖部分?

我找到的唯一方法 - 创建锁定机制并在它存在时等待进程,然后再第二次获取它。

Redis 还没有你想要的机制(部分更新),但作为替代方案,您可以编写 Lua 脚本来避免并发问题。

在剧本中,您可以先读取一个值,根据需要对其进行操作,最后再次存储该值。Redis 确保脚本以原子方式执行,这样,在这种情况下您就不需要任何锁定机制。(*)