1start_server {tags {"expire"}} { 2 test {EXPIRE - set timeouts multiple times} { 3 r set x foobar 4 set v1 [r expire x 5] 5 set v2 [r ttl x] 6 set v3 [r expire x 10] 7 set v4 [r ttl x] 8 r expire x 2 9 list $v1 $v2 $v3 $v4 10 } {1 [45] 1 10} 11 12 test {EXPIRE - It should be still possible to read 'x'} { 13 r get x 14 } {foobar} 15 16 tags {"slow"} { 17 test {EXPIRE - After 2.1 seconds the key should no longer be here} { 18 after 2100 19 list [r get x] [r exists x] 20 } {{} 0} 21 } 22 23 test {EXPIRE - write on expire should work} { 24 r del x 25 r lpush x foo 26 r expire x 1000 27 r lpush x bar 28 r lrange x 0 -1 29 } {bar foo} 30 31 test {EXPIREAT - Check for EXPIRE alike behavior} { 32 r del x 33 r set x foo 34 r expireat x [expr [clock seconds]+15] 35 r ttl x 36 } {1[345]} 37 38 test {SETEX - Set + Expire combo operation. Check for TTL} { 39 r setex x 12 test 40 r ttl x 41 } {1[012]} 42 43 test {SETEX - Check value} { 44 r get x 45 } {test} 46 47 test {SETEX - Overwrite old key} { 48 r setex y 1 foo 49 r get y 50 } {foo} 51 52 tags {"slow"} { 53 test {SETEX - Wait for the key to expire} { 54 after 1100 55 r get y 56 } {} 57 } 58 59 test {SETEX - Wrong time parameter} { 60 catch {r setex z -10 foo} e 61 set _ $e 62 } {*invalid expire*} 63 64 test {PERSIST can undo an EXPIRE} { 65 r set x foo 66 r expire x 50 67 list [r ttl x] [r persist x] [r ttl x] [r get x] 68 } {50 1 -1 foo} 69 70 test {PERSIST returns 0 against non existing or non volatile keys} { 71 r set x foo 72 list [r persist foo] [r persist nokeyatall] 73 } {0 0} 74 75 test {EXPIRE pricision is now the millisecond} { 76 # This test is very likely to do a false positive if the 77 # server is under pressure, so if it does not work give it a few more 78 # chances. 79 for {set j 0} {$j < 3} {incr j} { 80 r del x 81 r setex x 1 somevalue 82 after 900 83 set a [r get x] 84 after 1100 85 set b [r get x] 86 if {$a eq {somevalue} && $b eq {}} break 87 } 88 list $a $b 89 } {somevalue {}} 90 91 test {PEXPIRE/PSETEX/PEXPIREAT can set sub-second expires} { 92 # This test is very likely to do a false positive if the 93 # server is under pressure, so if it does not work give it a few more 94 # chances. 95 for {set j 0} {$j < 3} {incr j} { 96 r del x y z 97 r psetex x 100 somevalue 98 after 80 99 set a [r get x] 100 after 120 101 set b [r get x] 102 103 r set x somevalue 104 r pexpire x 100 105 after 80 106 set c [r get x] 107 after 120 108 set d [r get x] 109 110 r set x somevalue 111 r pexpireat x [expr ([clock seconds]*1000)+100] 112 after 80 113 set e [r get x] 114 after 120 115 set f [r get x] 116 117 if {$a eq {somevalue} && $b eq {} && 118 $c eq {somevalue} && $d eq {} && 119 $e eq {somevalue} && $f eq {}} break 120 } 121 list $a $b 122 } {somevalue {}} 123 124 test {TTL returns tiem to live in seconds} { 125 r del x 126 r setex x 10 somevalue 127 set ttl [r ttl x] 128 assert {$ttl > 8 && $ttl <= 10} 129 } 130 131 test {PTTL returns time to live in milliseconds} { 132 r del x 133 r setex x 1 somevalue 134 set ttl [r pttl x] 135 assert {$ttl > 900 && $ttl <= 1000} 136 } 137 138 test {TTL / PTTL return -1 if key has no expire} { 139 r del x 140 r set x hello 141 list [r ttl x] [r pttl x] 142 } {-1 -1} 143 144 test {TTL / PTTL return -2 if key does not exit} { 145 r del x 146 list [r ttl x] [r pttl x] 147 } {-2 -2} 148 149 test {Redis should actively expire keys incrementally} { 150 r flushdb 151 r psetex key1 500 a 152 r psetex key2 500 a 153 r psetex key3 500 a 154 set size1 [r dbsize] 155 # Redis expires random keys ten times every second so we are 156 # fairly sure that all the three keys should be evicted after 157 # one second. 158 after 1000 159 set size2 [r dbsize] 160 list $size1 $size2 161 } {3 0} 162 163 test {Redis should lazy expire keys} { 164 r flushdb 165 r debug set-active-expire 0 166 r psetex key1 500 a 167 r psetex key2 500 a 168 r psetex key3 500 a 169 set size1 [r dbsize] 170 # Redis expires random keys ten times every second so we are 171 # fairly sure that all the three keys should be evicted after 172 # one second. 173 after 1000 174 set size2 [r dbsize] 175 r mget key1 key2 key3 176 set size3 [r dbsize] 177 r debug set-active-expire 1 178 list $size1 $size2 $size3 179 } {3 3 0} 180 181 test {EXPIRE should not resurrect keys (issue #1026)} { 182 r debug set-active-expire 0 183 r set foo bar 184 r pexpire foo 500 185 after 1000 186 r expire foo 10 187 r debug set-active-expire 1 188 r exists foo 189 } {0} 190 191 test {5 keys in, 5 keys out} { 192 r flushdb 193 r set a c 194 r expire a 5 195 r set t c 196 r set e c 197 r set s c 198 r set foo b 199 lsort [r keys *] 200 } {a e foo s t} 201 202 test {EXPIRE with empty string as TTL should report an error} { 203 r set foo bar 204 catch {r expire foo ""} e 205 set e 206 } {*not an integer*} 207} 208