gpt4 book ai didi

php - Redis 和大量的键

转载 作者:可可西里 更新时间:2023-11-01 11:47:33 26 4
gpt4 key购买 nike

我需要加速我的应用程序(用 PHP 编写,简单的 GET 服务),我决定将它从 RDBMS 方法转移到 Redis。花了一周的时间研究如何做到这一点,并考虑到我的关系数据库中有很多表和很多字段,我在 redis 中制作了这样的结构:{nameOfTable:clientID:itemID},例如

SET clientSubjects:1:1 bigJSONStringHere1
SET clientSubjects:1:2 bigJSONStringHere2
SET clientSubjects:1:3 bigJSONStringHere3

SET clientSubjects:2:1 bigJSONStringHere4
SET clientSubjects:2:2 bigJSONStringHere5
SET clientSubjects:2:3 bigJSONStringHere6

等等

我有大约 2000 万个客户,每个客户大约有 4-10 个主题,所以大约有 1.5 亿个 key 。为了找到所有客户的主题,我每次收到某个客户的请求时都必须使用 SCAN。我遇到了一个问题,当我完成将所有客户端加载到 Redis 时,命令

扫描 0 匹配 clientSubjects:{someID}:* count 100 返回:

1) "7241728"
2) (empty list or set)

然后...我的决定是找到 redis 存储中的键总数并将其用作 COUNT 参数。

这看起来像:

local keyspace = redis.call("info", "keyspace")
local keysCount = keyspace:match("keys=(%d+),")
local result = redis.call("SCAN", 0, "match", "clientSubjects:" .. ARGV[1] .. ":*", "count", keysCount) --ARGV means I pass clientID to lua script

所以一切正常,除了它需要大约 3 秒才能执行!但我需要大约几毫秒...我能做什么?

最佳答案

如果有 2000 万条记录,您将需要大量内存来存储所有数据结构和不同的查询方式。

例如,要查找所有客户的主题,我会有一个名为 clientSubjects:{clientID} 的集合或列表,其中包含主题 ID 的值。

你应该有不同的数据结构来适应你不同的查询,并避免使用像 SCAN 这样的东西,因为这不是最佳的。

在我看来,具有一些放置良好的索引的关系数据库更适合这种情况,它会为您节省大量时间和金钱,因为索引通常保存在内存中并且可以回退到磁盘。

请记住,Redis 要求您将所有数据存储在内存中,因此随着您添加更多数据结构来解决不同的查询类型,这将变得更加昂贵。

关于php - Redis 和大量的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41038553/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com