【发布时间】:2019-07-05 13:31:22
【问题描述】:
我正在开发一个 Web 应用程序 (Nginx+PHP7.3),它将使用 Redis 数据库来存储一些数据(主要是为了计算事物),我必须决定如何存储数据。在我的案例中,重要的是速度和性能,同时还要保持较低的每秒操作数,以便能够处理与 Web 应用程序的许多并发连接。
选项 1:将 JSON 数据存储在单个键上
为了保存数据,我将使用单个 SET 操作,即:
$redis->set("MyKey-UserID", '{"clicks":123,"downloads":1234,"views":123}');
然后更新数据我会使用两个操作(GET + SET),即:
$array = json_decode($redis->get("MyKey-UserID"), true);
$array['clicks']++;
$array['downloads']++;
$array['views']++;
$redis->set("MyKey-UserID", json_encode($array));
选项 2:具有单个值的多个键
为了保存数据,我会使用多个 SET 操作,即:
$redis->set("MyKey-UserID-Clicks", 123);
$redis->set("MyKey-UserID-Downloads", 1234);
$redis->set("MyKey-UserID-Views", 123);
然后要更新数据,我会使用多个 INCR 操作,即:
$redis->incr("MyKey-UserID-Clicks");
$redis->incr("MyKey-UserID-Downloads");
$redis->incr("MyKey-UserID-Views");
我选择的选项 + 问题
我个人会使用选项 1,您的意见是什么?
你认为使用 GET + SET 仍然会像使用 INCR 一样快吗?
您如何看待选项 2?
选项 1 的优点/缺点
选项 1 优点:
- 更好的数据库组织,因为每个用户只有一个密钥
- 通过一次 GET 操作,我将获得所有 JSON 数据
- 要更新所有 JSON 字段,我将只使用两个操作 (GET + SET)
- 数据库的文件会变小
选项 1 缺点:
- 要增加“点击次数”,我需要两个操作 (GET + SET) 而不是一个 INCR
- 也许选项 1 过程 (GET+SET) 比选项 2 中的多个 INCR 慢?
一些有用的答案
@Samveen (Link)
如果同时修改 JSON,选项 1 不是一个好主意 有效载荷是预期的(非原子的经典问题 读-修改-写)
我们有很多并发连接,所以也许选项 2 是赢家。
【问题讨论】:
-
你考虑过使用oss.redislabs.com/rejson吗?
-
是的,但如果可能的话,我宁愿不要使用额外的 Redis 模块。