From 5402c4262e6bd6d2e8082dd2a948f28ea453b060 Mon Sep 17 00:00:00 2001 From: antirez Date: Mon, 8 Nov 2010 16:12:16 +0100 Subject: [PATCH] added noeviction policy to redis maxmemory. ZSCORE removed from the list of commands that can't be called when we are low on memory, this command was added in the past for a stupid error. --- redis.conf | 12 ++++++++++++ src/config.c | 5 +++++ src/redis.c | 4 +++- src/redis.h | 1 + 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/redis.conf b/redis.conf index bb30dcae..5ec2d029 100644 --- a/redis.conf +++ b/redis.conf @@ -191,6 +191,18 @@ slave-serve-stale-data yes # volatile-random -> remove a random key with an expire set # allkeys->random -> remove a random key, any key # volatile-ttl -> remove the key with the nearest expire time (minor TTL) +# noeviction -> don't expire at all, just return an error on write operations +# +# Note: with all the kind of policies, Redis will return an error on write +# operations, when there are not suitable keys for eviction. +# +# At the date of writing this commands are: set setnx setex append +# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd +# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby +# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby +# getset mset msetnx exec sort +# +# The default is: # # maxmemory-policy volatile-lru diff --git a/src/config.c b/src/config.c index 772ac764..ad60cced 100644 --- a/src/config.c +++ b/src/config.c @@ -136,6 +136,8 @@ void loadServerConfig(char *filename) { server.maxmemory_policy = REDIS_MAXMEMORY_ALLKEYS_LRU; } else if (!strcasecmp(argv[1],"allkeys-random")) { server.maxmemory_policy = REDIS_MAXMEMORY_ALLKEYS_RANDOM; + } else if (!strcasecmp(argv[1],"noeviction")) { + server.maxmemory_policy = REDIS_MAXMEMORY_NO_EVICTION; } else { err = "Invalid maxmemory policy"; goto loaderr; @@ -307,6 +309,8 @@ void configSetCommand(redisClient *c) { server.maxmemory_policy = REDIS_MAXMEMORY_ALLKEYS_LRU; } else if (!strcasecmp(o->ptr,"allkeys-random")) { server.maxmemory_policy = REDIS_MAXMEMORY_ALLKEYS_RANDOM; + } else if (!strcasecmp(o->ptr,"noeviction")) { + server.maxmemory_policy = REDIS_MAXMEMORY_NO_EVICTION; } else { goto badfmt; } @@ -440,6 +444,7 @@ void configGetCommand(redisClient *c) { case REDIS_MAXMEMORY_VOLATILE_RANDOM: s = "volatile-random"; break; case REDIS_MAXMEMORY_ALLKEYS_LRU: s = "allkeys-lru"; break; case REDIS_MAXMEMORY_ALLKEYS_RANDOM: s = "allkeys-random"; break; + case REDIS_MAXMEMORY_NO_EVICTION: s = "noeviction"; break; default: s = "unknown"; break; /* too harmless to panic */ } addReplyBulkCString(c,"maxmemory-policy"); diff --git a/src/redis.c b/src/redis.c index 67bdc3ad..fe656de9 100644 --- a/src/redis.c +++ b/src/redis.c @@ -124,7 +124,7 @@ struct redisCommand readonlyCommandTable[] = { {"zcount",zcountCommand,4,0,NULL,1,1,1}, {"zrevrange",zrevrangeCommand,-4,0,NULL,1,1,1}, {"zcard",zcardCommand,2,0,NULL,1,1,1}, - {"zscore",zscoreCommand,3,REDIS_CMD_DENYOOM,NULL,1,1,1}, + {"zscore",zscoreCommand,3,0,NULL,1,1,1}, {"zrank",zrankCommand,3,0,NULL,1,1,1}, {"zrevrank",zrevrankCommand,3,0,NULL,1,1,1}, {"hset",hsetCommand,4,REDIS_CMD_DENYOOM,NULL,1,1,1}, @@ -1332,6 +1332,8 @@ void monitorCommand(redisClient *c) { void freeMemoryIfNeeded(void) { /* Remove keys accordingly to the active policy as long as we are * over the memory limit. */ + if (server.maxmemory_policy == REDIS_MAXMEMORY_NO_EVICTION) return; + while (server.maxmemory && zmalloc_used_memory() > server.maxmemory) { int j, k, freed = 0; diff --git a/src/redis.h b/src/redis.h index 30c88f40..087002bf 100644 --- a/src/redis.h +++ b/src/redis.h @@ -209,6 +209,7 @@ #define REDIS_MAXMEMORY_VOLATILE_RANDOM 2 #define REDIS_MAXMEMORY_ALLKEYS_LRU 3 #define REDIS_MAXMEMORY_ALLKEYS_RANDOM 4 +#define REDIS_MAXMEMORY_NO_EVICTION 5 /* We can print the stacktrace, so our assert is defined this way: */ #define redisAssert(_e) ((_e)?(void)0 : (_redisAssert(#_e,__FILE__,__LINE__),_exit(1))) -- 2.45.2