diff --git a/redis.conf b/redis.conf index bb30dcae60fb65a357b9dff1939da05d505337e0..5ec2d0295dd373c957a5c862782d9a4d2d0bb3cb 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 772ac764ed986052ddcc1359b4174b0bb2aa5628..ad60cced36affb06772c45b07cdfe781af66d262 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 67bdc3ad9f2040b7b16188d2e341433d88dd6206..fe656de9b0c941565980dd0cc32aa99b0431fd8b 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 30c88f405b0969c523495ace949f41ededed9b9d..087002bf72fe44e8ccdb9494270ec1595b1b197c 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)))