Commit 06ca9d68 authored by antirez's avatar antirez
Browse files

LFU: Fix LFUDecrAndReturn() to just decrement.

Splitting the popularity in half actually just needs decrementing the
counter because the counter is logarithmic.
parent 9f131c9a
...@@ -335,19 +335,9 @@ uint8_t LFULogIncr(uint8_t counter) { ...@@ -335,19 +335,9 @@ uint8_t LFULogIncr(uint8_t counter) {
unsigned long LFUDecrAndReturn(robj *o) { unsigned long LFUDecrAndReturn(robj *o) {
unsigned long ldt = o->lru >> 8; unsigned long ldt = o->lru >> 8;
unsigned long counter = o->lru & 255; unsigned long counter = o->lru & 255;
long halve_times = server.lfu_decay_time ? LFUTimeElapsed(ldt) / server.lfu_decay_time : 0; unsigned long num_periods = server.lfu_decay_time ? LFUTimeElapsed(ldt) / server.lfu_decay_time : 0;
if (halve_times > 0 && counter) { if (num_periods)
if (halve_times == 1) { counter = (num_periods > counter) ? 0 : counter - num_periods;
if (counter > LFU_INIT_VAL*2) {
counter /= 2;
if (counter < LFU_INIT_VAL*2) counter = LFU_INIT_VAL*2;
} else {
counter--;
}
} else {
counter = counter >> halve_times;
}
}
return counter; return counter;
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment