让我们想象一下,我们有 30 万个键,在我们的存储计数器键名中有简单的计数器,例如:
counter1_2014-03-25_00:01
counter2_2014-03-25_00:01
counter3_2014-03-25_00:01
每个计数器收集 1 分钟的数据,因此每分钟一个键:counter1_2014-03-25_00:01、counter1_2014-03-25_00:02、counter1_2014-03-25_00:03 等
每隔一分钟,我必须转储前一分钟的所有计数器并将它们从存储中删除。我当前的实现非常简单,并且使用 Redis 哈希(HINCR、HGETALL、DEL
)。
//递增计数器
$Redis->hincr('counters_2014-03-25_00:02', 'counter1');
//转储和删除
$result = $Redis->multi()
->hgetall('counters_2014-03-25_00:02')//倾销
->del('counters_2014-03-25_00:02')//删除散列
->exec()
Redis 的一切都很好,但是使用 HGETALL
进行转储对于大量计数器来说变得非常非常慢,因为 HGETALL
有 O(N)
复杂性。
现在我正在寻找允许的方法:
- 原子递增的计数器与 Redis 一样快
- 快速转储前一分钟收集的计数器值
- 从存储中删除前一分钟收集的计数器
- 不需要 100% 的坚持,但这将是一个很好的加分项
更新:需要快速转储,因为我需要将所有本地收集的数据从后端服务器传输到主服务器。
最佳答案
一个解决方案是创建简单的 key ,使用 INCR 递增,每次创建 key 时使用 EXPIRE 设置一个到期时间。
关于php - 具有快速转储数据能力的计数器键值存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22626492/