X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/ef59a8bc9ef426f9d24e701e9b73a6a03ddd3d0f..339b9dc2d2e7d319e29581b367a1027365186cc3:/src/object.c diff --git a/src/object.c b/src/object.c index e7fa3742..b1eae963 100644 --- a/src/object.c +++ b/src/object.c @@ -245,8 +245,12 @@ robj *tryObjectEncoding(robj *o) { * range and if this is the main thread, since when VM is enabled we * have the constraint that I/O thread should only handle non-shared * objects, in order to avoid race conditions (we don't have per-object - * locking). */ - if (value >= 0 && value < REDIS_SHARED_INTEGERS && + * locking). + * + * Note that we also avoid using shared integers when maxmemory is used + * because very object needs to have a private LRU field for the LRU + * algorithm to work well. */ + if (server.maxmemory == 0 && value >= 0 && value < REDIS_SHARED_INTEGERS && pthread_equal(pthread_self(),server.mainthread)) { decrRefCount(o); incrRefCount(shared.integers[value]); @@ -443,8 +447,9 @@ char *strEncoding(int encoding) { * requested, using an approximated LRU algorithm. */ unsigned long estimateObjectIdleTime(robj *o) { if (server.lruclock >= o->lru) { - return (server.lruclock - o->lru) * 60; + return (server.lruclock - o->lru) * REDIS_LRU_CLOCK_RESOLUTION; } else { - return ((REDIS_LRU_CLOCK_MAX - o->lru) + server.lruclock) * 60; + return ((REDIS_LRU_CLOCK_MAX - o->lru) + server.lruclock) * + REDIS_LRU_CLOCK_RESOLUTION; } }