具有快速转储数据能力的计数器的键值存储

时间:2014-03-25 05:56:10

标签: php redis storage counter key-value

让我们想象一下,我们的存储计数器密钥名称中有300K密钥和简单计数器,例如: 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 etc.

每隔一分钟,我必须转储前一分钟的所有计数器并将其从存储中删除。我当前的实现非常简单并使用Redis哈希(HINCR, HGETALL, DEL)。

//incrementing counter $Redis->hincr('counters_2014-03-25_00:02', 'counter1');

//dumping and removing $result = $Redis->multi() ->hgetall('counters_2014-03-25_00:02') //dumping ->del('counters_2014-03-25_00:02') //removing hash ->exec()

Redis的一切都很好,但由于HGETALL具有HGETALL复杂度,因此使用O(N)进行转储的速度非常缓慢,因为{{1}}具有{{1}}复杂度。

现在我正在寻找允许的方法:

  • 原子递增计数器的速度与Redis一样快
  • 快速转储前一分钟收集的计数器值
  • 删除从存储中收集的前一分钟的计数器
  • 不需要100%持久性,但这将是一个很好的加分

更新:需要快速转储,因为我需要将所有本地收集的数据从后端服务器传输到主服务器。

1 个答案:

答案 0 :(得分:1)

一种解决方案可以是创建简单的密钥,使用INCR递增,每次使用EXPIRE创建密钥集时,都会使用EXPIRE。