1start_server {tags {"maxmemory"}} { 2 test "Without maxmemory small integers are shared" { 3 r config set maxmemory 0 4 r set a 1 5 assert {[r object refcount a] > 1} 6 } 7 8 test "With maxmemory and non-LRU policy integers are still shared" { 9 r config set maxmemory 1073741824 10 r config set maxmemory-policy allkeys-random 11 r set a 1 12 assert {[r object refcount a] > 1} 13 } 14 15 test "With maxmemory and LRU policy integers are not shared" { 16 r config set maxmemory 1073741824 17 r config set maxmemory-policy allkeys-lru 18 r set a 1 19 r config set maxmemory-policy volatile-lru 20 r set b 1 21 assert {[r object refcount a] == 1} 22 assert {[r object refcount b] == 1} 23 r config set maxmemory 0 24 } 25 26 foreach policy { 27 allkeys-random allkeys-lru volatile-lru volatile-random volatile-ttl 28 } { 29 test "maxmemory - is the memory limit honoured? (policy $policy)" { 30 # make sure to start with a blank instance 31 r flushall 32 # Get the current memory limit and calculate a new limit. 33 # We just add 100k to the current memory size so that it is 34 # fast for us to reach that limit. 35 set used [s used_memory] 36 set limit [expr {$used+100*1024}] 37 r config set maxmemory $limit 38 r config set maxmemory-policy $policy 39 # Now add keys until the limit is almost reached. 40 set numkeys 0 41 while 1 { 42 r setex [randomKey] 10000 x 43 incr numkeys 44 if {[s used_memory]+4096 > $limit} { 45 assert {$numkeys > 10} 46 break 47 } 48 } 49 # If we add the same number of keys already added again, we 50 # should still be under the limit. 51 for {set j 0} {$j < $numkeys} {incr j} { 52 r setex [randomKey] 10000 x 53 } 54 assert {[s used_memory] < ($limit+4096)} 55 } 56 } 57 58 foreach policy { 59 allkeys-random allkeys-lru volatile-lru volatile-random volatile-ttl 60 } { 61 test "maxmemory - only allkeys-* should remove non-volatile keys ($policy)" { 62 # make sure to start with a blank instance 63 r flushall 64 # Get the current memory limit and calculate a new limit. 65 # We just add 100k to the current memory size so that it is 66 # fast for us to reach that limit. 67 set used [s used_memory] 68 set limit [expr {$used+100*1024}] 69 r config set maxmemory $limit 70 r config set maxmemory-policy $policy 71 # Now add keys until the limit is almost reached. 72 set numkeys 0 73 while 1 { 74 r set [randomKey] x 75 incr numkeys 76 if {[s used_memory]+4096 > $limit} { 77 assert {$numkeys > 10} 78 break 79 } 80 } 81 # If we add the same number of keys already added again and 82 # the policy is allkeys-* we should still be under the limit. 83 # Otherwise we should see an error reported by Redis. 84 set err 0 85 for {set j 0} {$j < $numkeys} {incr j} { 86 if {[catch {r set [randomKey] x} e]} { 87 if {[string match {*used memory*} $e]} { 88 set err 1 89 } 90 } 91 } 92 if {[string match allkeys-* $policy]} { 93 assert {[s used_memory] < ($limit+4096)} 94 } else { 95 assert {$err == 1} 96 } 97 } 98 } 99 100 foreach policy { 101 volatile-lru volatile-random volatile-ttl 102 } { 103 test "maxmemory - policy $policy should only remove volatile keys." { 104 # make sure to start with a blank instance 105 r flushall 106 # Get the current memory limit and calculate a new limit. 107 # We just add 100k to the current memory size so that it is 108 # fast for us to reach that limit. 109 set used [s used_memory] 110 set limit [expr {$used+100*1024}] 111 r config set maxmemory $limit 112 r config set maxmemory-policy $policy 113 # Now add keys until the limit is almost reached. 114 set numkeys 0 115 while 1 { 116 # Odd keys are volatile 117 # Even keys are non volatile 118 if {$numkeys % 2} { 119 r setex "key:$numkeys" 10000 x 120 } else { 121 r set "key:$numkeys" x 122 } 123 if {[s used_memory]+4096 > $limit} { 124 assert {$numkeys > 10} 125 break 126 } 127 incr numkeys 128 } 129 # Now we add the same number of volatile keys already added. 130 # We expect Redis to evict only volatile keys in order to make 131 # space. 132 set err 0 133 for {set j 0} {$j < $numkeys} {incr j} { 134 catch {r setex "foo:$j" 10000 x} 135 } 136 # We should still be under the limit. 137 assert {[s used_memory] < ($limit+4096)} 138 # However all our non volatile keys should be here. 139 for {set j 0} {$j < $numkeys} {incr j 2} { 140 assert {[r exists "key:$j"]} 141 } 142 } 143 } 144} 145