mirror of
https://github.com/fluencelabs/redis
synced 2025-06-16 18:51:20 +00:00
Object approximated LRU algorithm enhanced / fixed / refactored. This is used for the VM currently but will soon be used for maxmemory expiring.
This commit is contained in:
31
src/object.c
31
src/object.c
@ -19,14 +19,19 @@ robj *createObject(int type, void *ptr) {
|
||||
o->encoding = REDIS_ENCODING_RAW;
|
||||
o->ptr = ptr;
|
||||
o->refcount = 1;
|
||||
if (server.vm_enabled) {
|
||||
/* Note that this code may run in the context of an I/O thread
|
||||
* and accessing server.lruclock in theory is an error
|
||||
* (no locks). But in practice this is safe, and even if we read
|
||||
* garbage Redis will not fail. */
|
||||
o->lru = server.lruclock;
|
||||
o->storage = REDIS_VM_MEMORY;
|
||||
}
|
||||
/* Set the LRU to the current lruclock (minutes resolution).
|
||||
* We do this regardless of the fact VM is active as LRU is also
|
||||
* used for the maxmemory directive when Redis is used as cache.
|
||||
*
|
||||
* Note that this code may run in the context of an I/O thread
|
||||
* and accessing server.lruclock in theory is an error
|
||||
* (no locks). But in practice this is safe, and even if we read
|
||||
* garbage Redis will not fail. */
|
||||
o->lru = server.lruclock;
|
||||
/* The following is only needed if VM is active, but since the conditional
|
||||
* is probably more costly than initializing the field it's better to
|
||||
* have every field properly initialized anyway. */
|
||||
o->storage = REDIS_VM_MEMORY;
|
||||
return o;
|
||||
}
|
||||
|
||||
@ -433,3 +438,13 @@ char *strEncoding(int encoding) {
|
||||
default: return "unknown";
|
||||
}
|
||||
}
|
||||
|
||||
/* Given an object returns the min number of seconds the object was never
|
||||
* requested, using an approximated LRU algorithm. */
|
||||
unsigned long estimateObjectIdleTime(robj *o) {
|
||||
if (server.lruclock >= o->lru) {
|
||||
return (server.lruclock - o->lru) * 60;
|
||||
} else {
|
||||
return ((REDIS_LRU_CLOCK_MAX - o->lru) + server.lruclock) * 60;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user