1 # TODO # test pipelining
9 proc test
{name code okpattern
} {
10 puts -nonewline [format "%-70s " $name]
12 set retval
[uplevel 1 $code]
13 if {$okpattern eq
$retval ||
[string match
$okpattern $retval]} {
17 puts "!! ERROR expected\n'$okpattern'\nbut got\n'$retval'"
22 proc randstring
{min max
{type
binary}} {
23 set len
[expr {$min+int
(rand
()*($max-$min+1))}]
25 if {$type eq
{binary}} {
28 } elseif
{$type eq
{alpha
}} {
31 } elseif
{$type eq
{compr
}} {
36 append output
[format "%c" [expr {$minval+int
(rand
()*($maxval-$minval+1))}]]
42 # Useful for some test
43 proc zlistAlikeSort
{a b
} {
44 if {[lindex $a 0] > [lindex $b 0]} {return 1}
45 if {[lindex $a 0] < [lindex $b 0]} {return -1}
46 string compare
[lindex $a 1] [lindex $b 1]
49 proc main
{server port
} {
50 set r
[redis
$server $port]
54 # The following AUTH test should be enabled only when requirepass
55 # <PASSWORD> is set in redis.conf and redis-server was started with
56 # redis.conf as the first argument.
58 #test {AUTH with requirepass in redis.conf} {
62 test
{DEL all keys to start with a clean DB
} {
63 foreach key
[$r keys
*] {$r del
$key}
67 test
{SET and GET an item
} {
72 test
{DEL against a single item
} {
81 list [$r del foo1 foo2 foo3 foo4
] [$r mget foo1 foo2 foo3
]
84 test
{KEYS with pattern
} {
85 foreach key
{key_x key_y key_z foo_a foo_b foo_c
} {
91 test
{KEYS to get all keys
} {
93 } {foo_a foo_b foo_c key_x key_y key_z
}
100 foreach key
[$r keys
*] {$r del
$key}
104 test
{Very big payload in GET
/SET
} {
105 set buf
[string repeat
"abcd" 1000000]
108 } [string repeat
"abcd" 1000000]
110 test
{SET
10000 numeric keys and access all them in reverse order
} {
111 for {set x
0} {$x < 10000} {incr x
} {
115 for {set x
9999} {$x >= 0} {incr x
-1} {
121 test
{DBSIZE should be
10001 now
} {
125 test
{INCR against non existing key
} {
127 append res
[$r incr novar
]
128 append res
[$r get novar
]
131 test
{INCR against key created by
incr itself
} {
135 test
{INCR against key originally
set with SET
} {
140 test
{INCR over
32bit value
} {
141 $r set novar
17179869184
145 test
{INCRBY over
32bit value with over
32bit increment
} {
146 $r set novar
17179869184
147 $r incrby novar
17179869184
150 test
{DECRBY over
32bit value with over
32bit increment
, negative res
} {
151 $r set novar
17179869184
152 $r decrby novar
17179869185
155 test
{SETNX target key missing
} {
156 $r setnx novar2 foobared
160 test
{SETNX target key exists
} {
161 $r setnx novar2 blabla
168 append res
[$r exists newkey
]
170 append res
[$r exists newkey
]
173 test
{Zero length value in key. SET
/GET
/EXISTS
} {
175 set res
[$r get emptykey
]
176 append res
[$r exists emptykey
]
178 append res
[$r exists emptykey
]
181 test
{Commands pipelining
} {
183 puts -nonewline $fd "SET k1 4\r\nxyzk\r\nGET k1\r\nPING\r\n"
186 append res
[string match OK
* [::redis::redis_read_reply $fd]]
187 append res
[::redis::redis_read_reply $fd]
188 append res
[string match PONG
* [::redis::redis_read_reply $fd]]
192 test
{Non existing command
} {
193 catch {$r foobaredcommand
} err
194 string match ERR
* $err
197 test
{Basic LPUSH
, RPUSH
, LLENGTH
, LINDEX
} {
201 set res
[$r llen mylist
]
202 append res
[$r lindex mylist
0]
203 append res
[$r lindex mylist
1]
204 append res
[$r lindex mylist
2]
212 test
{Create a long
list and check every single element with LINDEX
} {
214 for {set i
0} {$i < 1000} {incr i
} {
217 for {set i
0} {$i < 1000} {incr i
} {
218 if {[$r lindex mylist
$i] eq
$i} {incr ok
}
219 if {[$r lindex mylist
[expr (-$i)-1]] eq
[expr 999-$i]} {
226 test
{Test elements with LINDEX in random access
} {
228 for {set i
0} {$i < 1000} {incr i
} {
229 set rint
[expr int
(rand
()*1000)]
230 if {[$r lindex mylist
$rint] eq
$rint} {incr ok
}
231 if {[$r lindex mylist
[expr (-$rint)-1]] eq
[expr 999-$rint]} {
238 test
{Check
if the
list is still ok
after a DEBUG RELOAD
} {
241 for {set i
0} {$i < 1000} {incr i
} {
242 set rint
[expr int
(rand
()*1000)]
243 if {[$r lindex mylist
$rint] eq
$rint} {incr ok
}
244 if {[$r lindex mylist
[expr (-$rint)-1]] eq
[expr 999-$rint]} {
251 test
{LLEN against non-list value
error} {
254 catch {$r llen mylist
} err
258 test
{LINDEX against non-list value
error} {
259 catch {$r lindex mylist
0} err
263 test
{LPUSH against non-list value
error} {
264 catch {$r lpush mylist
0} err
268 test
{RPUSH against non-list value
error} {
269 catch {$r rpush mylist
0} err
273 test
{RPOPLPUSH base case
} {
279 set v1
[$r rpoplpush mylist newlist
]
280 set v2
[$r rpoplpush mylist newlist
]
281 set l1
[$r lrange mylist
0 -1]
282 set l2
[$r lrange newlist
0 -1]
286 test
{RPOPLPUSH with the same
list as src and dst
} {
291 set l1
[$r lrange mylist
0 -1]
292 set v
[$r rpoplpush mylist mylist
]
293 set l2
[$r lrange mylist
0 -1]
295 } {{a b c
} c
{c a b
}}
297 test
{RPOPLPUSH target
list already exists
} {
305 set v1
[$r rpoplpush mylist newlist
]
306 set v2
[$r rpoplpush mylist newlist
]
307 set l1
[$r lrange mylist
0 -1]
308 set l2
[$r lrange newlist
0 -1]
310 } {d c
{a b
} {c d x
}}
312 test
{RPOPLPUSH against non existing key
} {
315 set v1
[$r rpoplpush mylist newlist
]
316 list $v1 [$r exists mylist
] [$r exists newlist
]
319 test
{RPOPLPUSH against non
list src key
} {
323 catch {$r rpoplpush mylist newlist
} err
324 list [$r type mylist
] [$r exists newlist
] [string range
$err 0 2]
327 test
{RPOPLPUSH against non
list dst key
} {
335 catch {$r rpoplpush mylist newlist
} err
336 list [$r lrange mylist
0 -1] [$r type newlist
] [string range
$err 0 2]
337 } {{a b c d
} string ERR
}
339 test
{RENAME basic usage
} {
341 $r rename mykey mykey1
342 $r rename mykey1 mykey2
346 test
{RENAME
source key should no longer exist
} {
350 test
{RENAME against already existing key
} {
353 $r rename mykey2 mykey
354 set res
[$r get mykey
]
355 append res
[$r exists mykey2
]
358 test
{RENAMENX basic usage
} {
362 $r renamenx mykey mykey2
363 set res
[$r get mykey2
]
364 append res
[$r exists mykey
]
367 test
{RENAMENX against already existing key
} {
370 $r renamenx mykey mykey2
373 test
{RENAMENX against already existing key
(2)} {
374 set res
[$r get mykey
]
375 append res
[$r get mykey2
]
378 test
{RENAME against non existing
source key
} {
379 catch {$r rename nokey foobar
} err
383 test
{RENAME where
source and dest key is the same
} {
384 catch {$r rename mykey mykey
} err
388 test
{DEL all keys again
(DB
0)} {
389 foreach key
[$r keys
*] {
395 test
{DEL all keys again
(DB
1)} {
397 foreach key
[$r keys
*] {
405 test
{MOVE basic usage
} {
409 lappend res
[$r exists mykey
]
410 lappend res
[$r dbsize
]
412 lappend res
[$r get mykey
]
413 lappend res
[$r dbsize
]
416 } [list 0 0 foobar
1]
418 test
{MOVE against key existing in the target DB
} {
423 test
{SET
/GET keys in different DBs
} {
431 lappend res
[$r get a
]
432 lappend res
[$r get b
]
434 lappend res
[$r get a
]
435 lappend res
[$r get b
]
438 } {hello world foo bared
}
440 test
{Basic LPOP
/RPOP
} {
445 list [$r lpop mylist
] [$r rpop mylist
] [$r lpop mylist
] [$r llen mylist
]
448 test
{LPOP
/RPOP against empty
list} {
452 test
{LPOP against non
list value
} {
454 catch {$r lpop notalist
} err
458 test
{Mass LPUSH
/LPOP
} {
460 for {set i
0} {$i < 1000} {incr i
} {
465 for {set i
0} {$i < 500} {incr i
} {
466 incr sum2
[$r lpop mylist
]
467 incr sum2
[$r rpop mylist
]
472 test
{LRANGE basics
} {
473 for {set i
0} {$i < 10} {incr i
} {
476 list [$r lrange mylist
1 -2] \
477 [$r lrange mylist
-3 -1] \
478 [$r lrange mylist
4 4]
479 } {{1 2 3 4 5 6 7 8} {7 8 9} 4}
481 test
{LRANGE inverted indexes
} {
485 test
{LRANGE out of range indexes including the full
list} {
486 $r lrange mylist
-1000 1000
487 } {0 1 2 3 4 5 6 7 8 9}
489 test
{LRANGE against non existing key
} {
490 $r lrange nosuchkey
0 1
493 test
{LTRIM basics
} {
495 for {set i
0} {$i < 100} {incr i
} {
499 $r lrange mylist
0 -1
504 $r lset mylist
-1 bar
505 $r lrange mylist
0 -1
508 test
{LSET out of range index
} {
509 catch {$r lset mylist
10 foo
} err
513 test
{LSET against non existing key
} {
514 catch {$r lset nosuchkey
10 foo
} err
518 test
{LSET against non
list value
} {
520 catch {$r lset nolist
0 foo
} err
524 test
{SADD
, SCARD
, SISMEMBER
, SMEMBERS basics
} {
527 list [$r scard myset
] [$r sismember myset foo
] \
528 [$r sismember myset bar
] [$r sismember myset bla
] \
529 [lsort [$r smembers myset
]]
530 } {2 1 1 0 {bar foo
}}
532 test
{SADD adding the same element multiple times
} {
539 test
{SADD against non
set} {
540 catch {$r sadd mylist foo
} err
547 lsort [$r smembers myset
]
550 test
{Mass SADD and SINTER with two sets
} {
551 for {set i
0} {$i < 1000} {incr i
} {
553 $r sadd set2
[expr $i+995]
555 lsort [$r sinter set1 set2
]
556 } {995 996 997 998 999}
558 test
{SUNION with two sets
} {
559 lsort [$r sunion set1 set2
]
560 } [lsort -uniq "[$r smembers set1] [$r smembers set2]"]
562 test
{SINTERSTORE with two sets
} {
563 $r sinterstore setres set1 set2
564 lsort [$r smembers setres
]
565 } {995 996 997 998 999}
567 test
{SINTERSTORE with two sets
, after a DEBUG RELOAD
} {
569 $r sinterstore setres set1 set2
570 lsort [$r smembers setres
]
571 } {995 996 997 998 999}
573 test
{SUNIONSTORE with two sets
} {
574 $r sunionstore setres set1 set2
575 lsort [$r smembers setres
]
576 } [lsort -uniq "[$r smembers set1] [$r smembers set2]"]
578 test
{SINTER against three sets
} {
583 lsort [$r sinter set1 set2 set3
]
586 test
{SINTERSTORE with three sets
} {
587 $r sinterstore setres set1 set2 set3
588 lsort [$r smembers setres
]
591 test
{SUNION with non existing keys
} {
592 lsort [$r sunion nokey1 set1 set2 nokey2
]
593 } [lsort -uniq "[$r smembers set1] [$r smembers set2]"]
595 test
{SDIFF with two sets
} {
596 for {set i
5} {$i < 1000} {incr i
} {
599 lsort [$r sdiff set1 set4
]
602 test
{SDIFF with three sets
} {
604 lsort [$r sdiff set1 set4 set5
]
607 test
{SDIFFSTORE with three sets
} {
608 $r sdiffstore sres set1 set4 set5
609 lsort [$r smembers sres
]
617 list [lsort [list [$r spop myset
] [$r spop myset
] [$r spop myset
]]] [$r scard myset
]
620 test
{SAVE
- make sure there are all the types as values
} {
621 # Wait for a background saving in progress to terminate
624 if {[string match
{*bgsave_in_progress
:1*} $i]} {
625 puts -nonewline "\nWaiting for background save to finish... "
632 $r lpush mysavelist hello
633 $r lpush mysavelist world
635 $r set mynormalkey
{blablablba
}
636 $r zadd mytestzset a
10
637 $r zadd mytestzset b
20
638 $r zadd mytestzset c
30
647 unset -nocomplain myset
649 for {set i
0} {$i < 100} {incr i
} {
650 set myset
([$r srandmember myset
]) 1
652 lsort [array names myset
]
655 test
{Create a random
list} {
657 array set seenrand
{}
658 for {set i
0} {$i < 10000} {incr i
} {
660 # Make sure all the weights are different because
661 # Redis does not use a stable sort but Tcl does.
662 set rint
[expr int
(rand
()*1000000)]
663 if {![info exists seenrand
($rint)]} break
665 set seenrand
($rint) x
667 $r set weight_
$i $rint
668 lappend tosort
[list $i $rint]
670 set sorted
[lsort -index 1 -real $tosort]
672 for {set i
0} {$i < 10000} {incr i
} {
673 lappend res
[lindex $sorted $i 0]
678 test
{SORT with BY against the newly created
list} {
679 $r sort tosort
{BY weight_
*}
682 test
{SORT direct
, numeric
, against the newly created
list} {
684 } [lsort -integer $res]
686 test
{SORT decreasing sort
} {
687 $r sort tosort
{DESC
}
688 } [lsort -decreasing -integer $res]
690 test
{SORT speed
, sorting
10000 elements
list using BY
, 100 times
} {
691 set start
[clock clicks
-milliseconds]
692 for {set i
0} {$i < 100} {incr i
} {
693 set sorted
[$r sort tosort
{BY weight_
* LIMIT
0 10}]
695 set elapsed
[expr [clock clicks
-milliseconds]-$start]
696 puts -nonewline "\n Average time to sort: [expr double($elapsed)/100] milliseconds "
701 test
{SORT speed
, sorting
10000 elements
list directly
, 100 times
} {
702 set start
[clock clicks
-milliseconds]
703 for {set i
0} {$i < 100} {incr i
} {
704 set sorted
[$r sort tosort
{LIMIT
0 10}]
706 set elapsed
[expr [clock clicks
-milliseconds]-$start]
707 puts -nonewline "\n Average time to sort: [expr double($elapsed)/100] milliseconds "
712 test
{SORT speed
, pseudo-sorting
10000 elements
list, BY
<const
>, 100 times
} {
713 set start
[clock clicks
-milliseconds]
714 for {set i
0} {$i < 100} {incr i
} {
715 set sorted
[$r sort tosort
{BY nokey LIMIT
0 10}]
717 set elapsed
[expr [clock clicks
-milliseconds]-$start]
718 puts -nonewline "\n Average time to sort: [expr double($elapsed)/100] milliseconds "
723 test
{SORT regression
for issue
#19, sorting floats} {
725 foreach x
{1.1 5.10 3.10 7.44 2.1 5.75 6.12 0.25 1.15} {
729 } [lsort -real {1.1 5.10 3.10 7.44 2.1 5.75 6.12 0.25 1.15}]
731 test
{SORT with GET
#} {
736 $r mset weight_1
10 weight_2
5 weight_3
30
737 $r sort mylist BY weight_
* GET
#
740 test
{LREM
, remove all the occurrences
} {
744 $r rpush mylist foobar
745 $r rpush mylist foobared
750 set res
[$r lrem mylist
0 bar
]
751 list [$r lrange mylist
0 -1] $res
752 } {{foo foobar foobared zap test foo
} 2}
754 test
{LREM
, remove the first occurrence
} {
755 set res
[$r lrem mylist
1 foo
]
756 list [$r lrange mylist
0 -1] $res
757 } {{foobar foobared zap test foo
} 1}
759 test
{LREM
, remove non existing element
} {
760 set res
[$r lrem mylist
1 nosuchelement
]
761 list [$r lrange mylist
0 -1] $res
762 } {{foobar foobared zap test foo
} 0}
764 test
{LREM
, starting from tail with negative count
} {
768 $r rpush mylist foobar
769 $r rpush mylist foobared
775 set res
[$r lrem mylist
-1 bar
]
776 list [$r lrange mylist
0 -1] $res
777 } {{foo bar foobar foobared zap test foo foo
} 1}
779 test
{LREM
, starting from tail with negative count
(2)} {
780 set res
[$r lrem mylist
-2 foo
]
781 list [$r lrange mylist
0 -1] $res
782 } {{foo bar foobar foobared zap test
} 2}
784 test
{LREM
, deleting objects that may be encoded as integers
} {
785 $r lpush myotherlist
1
786 $r lpush myotherlist
2
787 $r lpush myotherlist
3
788 $r lrem myotherlist
1 2
799 test
{MGET against non existing key
} {
800 $r mget foo baazz bar
803 test
{MGET against non-string key
} {
806 $r mget foo baazz bar myset
815 for {set i
0} {$i < 100} {incr i
} {
816 set rkey
[$r randomkey
]
817 if {$rkey eq
{foo
}} {
820 if {$rkey eq
{bar
}} {
824 list $foo_seen $bar_seen
827 test
{RANDOMKEY against empty DB
} {
832 test
{RANDOMKEY regression
1} {
839 test
{GETSET
(set new value
)} {
840 list [$r getset foo xyz
] [$r get foo
]
843 test
{GETSET
(replace old value
)} {
845 list [$r getset foo xyz
] [$r get foo
]
848 test
{SMOVE basics
} {
855 $r smove myset1 myset2 a
856 list [lsort [$r smembers myset2
]] [lsort [$r smembers myset1
]]
859 test
{SMOVE non existing key
} {
860 list [$r smove myset1 myset2 foo
] [lsort [$r smembers myset2
]] [lsort [$r smembers myset1
]]
861 } {0 {a x y z
} {b c
}}
863 test
{SMOVE non existing src
set} {
864 list [$r smove noset myset2 foo
] [lsort [$r smembers myset2
]]
867 test
{SMOVE non existing dst
set} {
868 list [$r smove myset2 myset3 y
] [lsort [$r smembers myset2
]] [lsort [$r smembers myset3
]]
871 test
{SMOVE wrong src key type
} {
873 catch {$r smove x myset2 foo
} err
877 test
{SMOVE wrong dst key type
} {
879 catch {$r smove myset2 x foo
} err
883 test
{MSET base case
} {
884 $r mset x
10 y
"foo bar" z
"x x x x x x x\n\n\r\n"
886 } [list 10 {foo bar
} "x x x x x x x\n\n\r\n"]
888 test
{MSET wrong number of args
} {
889 catch {$r mset x
10 y
"foo bar" z
} err
893 test
{MSETNX with already existent key
} {
894 list [$r msetnx x1 xxx y2 yyy x
20] [$r exists x1
] [$r exists y2
]
897 test
{MSETNX with not existing keys
} {
898 list [$r msetnx x1 xxx y2 yyy
] [$r get x1
] [$r get y2
]
901 test
{ZSET basic ZADD and score
update} {
905 set aux1
[$r zrange ztmp
0 -1]
907 set aux2
[$r zrange ztmp
0 -1]
914 for {set i
0} {$i < 1000} {incr i
} {
915 set score
[expr rand
()]
917 $r zadd zscoretest
$score $i
919 for {set i
0} {$i < 1000} {incr i
} {
920 if {[$r zscore zscoretest
$i] != [lindex $aux $i]} {
921 set err
"Expected score was [lindex $aux $i] but got [$r zscore zscoretest $i] for element $i"
928 test
{ZSCORE
after a DEBUG RELOAD
} {
932 for {set i
0} {$i < 1000} {incr i
} {
933 set score
[expr rand
()]
935 $r zadd zscoretest
$score $i
938 for {set i
0} {$i < 1000} {incr i
} {
939 if {[$r zscore zscoretest
$i] != [lindex $aux $i]} {
940 set err
"Expected score was [lindex $aux $i] but got [$r zscore zscoretest $i] for element $i"
947 test
{ZRANGE and ZREVRANGE
} {
948 list [$r zrange ztmp
0 -1] [$r zrevrange ztmp
0 -1]
951 test
{ZSETs stress tester
- sorting is working well?
} {
953 for {set test
0} {$test < 2} {incr test
} {
954 unset -nocomplain auxarray
955 array set auxarray
{}
958 for {set i
0} {$i < 1000} {incr i
} {
960 set score
[expr rand
()]
962 set score
[expr int
(rand
()*10)]
964 set auxarray
($i) $score
965 $r zadd myzset
$score $i
967 if {[expr rand
()] < .2} {
968 set j
[expr int
(rand
()*1000)]
970 set score
[expr rand
()]
972 set score
[expr int
(rand
()*10)]
974 set auxarray
($j) $score
975 $r zadd myzset
$score $j
978 foreach {item score
} [array get auxarray
] {
979 lappend auxlist
[list $score $item]
981 set sorted
[lsort -command zlistAlikeSort
$auxlist]
984 lappend auxlist
[lindex $x 1]
986 set fromredis
[$r zrange myzset
0 -1]
988 for {set i
0} {$i < [llength $fromredis]} {incr i
} {
989 if {[lindex $fromredis $i] != [lindex $auxlist $i]} {
997 test
{ZINCRBY
- can create a new sorted
set} {
999 $r zincrby zset
1 foo
1000 list [$r zrange zset
0 -1] [$r zscore zset foo
]
1003 test
{ZINCRBY
- increment and decrement
} {
1004 $r zincrby zset
2 foo
1005 $r zincrby zset
1 bar
1006 set v1
[$r zrange zset
0 -1]
1007 $r zincrby zset
10 bar
1008 $r zincrby zset
-5 foo
1009 $r zincrby zset
-5 bar
1010 set v2
[$r zrange zset
0 -1]
1011 list $v1 $v2 [$r zscore zset foo
] [$r zscore zset bar
]
1012 } {{bar foo
} {foo bar
} -2 6}
1014 test
{EXPIRE
- don't
set timeouts multiple times
} {
1016 set v1
[$r expire x
5]
1018 set v3
[$r expire x
10]
1020 list $v1 $v2 $v3 $v4
1023 test
{EXPIRE
- It should be still possible to
read 'x'
} {
1027 test
{EXPIRE
- After
6 seconds the key should no longer be here
} {
1029 list [$r get x
] [$r exists x
]
1032 test
{EXPIRE
- Delete on write policy
} {
1040 test
{EXPIREAT
- Check
for EXPIRE alike behavior
} {
1043 $r expireat x
[expr [clock seconds
]+15]
1047 test
{ZSETs skiplist implementation backlink consistency test
} {
1050 for {set j
0} {$j < $elements} {incr j
} {
1051 $r zadd myzset
[expr rand
()] "Element-$j"
1052 $r zrem myzset
"Element-[expr int(rand()*$elements)]"
1054 set l1
[$r zrange myzset
0 -1]
1055 set l2
[$r zrevrange myzset
0 -1]
1056 for {set j
0} {$j < [llength $l1]} {incr j
} {
1057 if {[lindex $l1 $j] ne
[lindex $l2 end-
$j]} {
1064 foreach fuzztype
{binary alpha compr
} {
1065 test
"FUZZ stresser with data model $fuzztype" {
1067 for {set i
0} {$i < 10000} {incr i
} {
1068 set fuzz
[randstring
0 512 $fuzztype]
1070 set got
[$r get foo
]
1071 if {$got ne
$fuzz} {
1072 set err
[list $fuzz $got]
1080 # Leave the user with a clean DB before to exit
1085 lappend aux
[$r dbsize
]
1088 lappend aux
[$r dbsize
]
1091 test
{Perform a final SAVE to leave a clean DB on disk
} {
1095 puts "\n[expr $::passed+$::failed] tests, $::passed passed, $::failed failed"
1096 if {$::failed > 0} {
1097 puts "\n*** WARNING!!! $::failed FAILED TESTS ***\n"
1107 set randkey
[expr int
(rand
()*10000)]
1108 set randval
[expr int
(rand
()*10000)]
1109 set randidx0
[expr int
(rand
()*10)]
1110 set randidx1
[expr int
(rand
()*10)]
1111 set cmd
[expr int
(rand
()*20)]
1113 if {$cmd == 0} {$r set $randkey $randval}
1114 if {$cmd == 1} {$r get
$randkey}
1115 if {$cmd == 2} {$r incr $randkey}
1116 if {$cmd == 3} {$r lpush
$randkey $randval}
1117 if {$cmd == 4} {$r rpop
$randkey}
1118 if {$cmd == 5} {$r del
$randkey}
1119 if {$cmd == 6} {$r llen
$randkey}
1120 if {$cmd == 7} {$r lrange $randkey $randidx0 $randidx1}
1121 if {$cmd == 8} {$r ltrim
$randkey $randidx0 $randidx1}
1122 if {$cmd == 9} {$r lindex $randkey $randidx0}
1123 if {$cmd == 10} {$r lset $randkey $randidx0 $randval}
1124 if {$cmd == 11} {$r sadd
$randkey $randval}
1125 if {$cmd == 12} {$r srem
$randkey $randval}
1126 if {$cmd == 13} {$r smove
$randkey $randval}
1127 if {$cmd == 14} {$r scard
$randkey}
1128 if {$cmd == 15} {$r expire
$randkey [expr $randval%60]}
1136 # Before to run the test check if DB 9 and DB 10 are empty
1139 set db9size
[$r dbsize
]
1141 set db10size
[$r dbsize
]
1142 if {$db9size != 0 ||
$db10size != 0} {
1143 puts "Can't run the tests against DB 9 and 10: DBs are not empty."
1151 if {[llength $argv] == 0} {
1153 } elseif
{[llength $argv] == 1 && [lindex $argv 0] eq
{stress
}} {
1156 main
[lindex $argv 0] [lindex $argv 1]