让我们想象一下,我们的存储计数器密钥名称中有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}}复杂度。
现在我正在寻找允许的方法:
更新:需要快速转储,因为我需要将所有本地收集的数据从后端服务器传输到主服务器。
答案 0 :(得分:1)
一种解决方案可以是创建简单的密钥,使用INCR递增,每次使用EXPIRE创建密钥集时,都会使用EXPIRE。