mirror of
https://github.com/fluencelabs/redis
synced 2025-06-14 17:51:21 +00:00
More incremental active expired keys collection process.
If a large amonut of keys are all expiring about at the same time, the "active" expired keys collection cycle used to block as far as the percentage of already expired keys was >= 25% of the total population of keys with an expire set. This could block the server even for many seconds in order to reclaim memory ASAP. The new algorithm uses at max a small amount of milliseconds per cycle, even if this means reclaiming the memory less promptly it also means a more responsive server.
This commit is contained in:
@ -622,9 +622,10 @@ void updateDictResizePolicy(void) {
|
||||
* keys that can be removed from the keyspace. */
|
||||
void activeExpireCycle(void) {
|
||||
int j;
|
||||
long long start = mstime();
|
||||
|
||||
for (j = 0; j < server.dbnum; j++) {
|
||||
int expired;
|
||||
int expired, iteration = 0;
|
||||
redisDb *db = server.db+j;
|
||||
|
||||
/* Continue to expire if at the end of the cycle more than 25%
|
||||
@ -653,6 +654,12 @@ void activeExpireCycle(void) {
|
||||
server.stat_expiredkeys++;
|
||||
}
|
||||
}
|
||||
/* We can't block forever here even if there are many keys to
|
||||
* expire. So after a given amount of milliseconds return to the
|
||||
* caller waiting for the other active expire cycle. */
|
||||
iteration++;
|
||||
if ((iteration & 0xff) == 0 && /* & 0xff is the same as % 255 */
|
||||
(mstime()-start) > REDIS_EXPIRELOOKUPS_TIME_LIMIT) return;
|
||||
} while (expired > REDIS_EXPIRELOOKUPS_PER_CRON/4);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user