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