2013-10-30 10:34:01 +00:00
|
|
|
start_server {tags {"scan"}} {
|
|
|
|
test "SCAN basic" {
|
|
|
|
r flushdb
|
|
|
|
r debug populate 1000
|
|
|
|
|
|
|
|
set cur 0
|
|
|
|
set keys {}
|
|
|
|
while 1 {
|
|
|
|
set res [r scan $cur]
|
|
|
|
set cur [lindex $res 0]
|
|
|
|
set k [lindex $res 1]
|
2013-10-30 10:36:12 +00:00
|
|
|
lappend keys {*}$k
|
2013-10-30 10:34:01 +00:00
|
|
|
if {$cur == 0} break
|
|
|
|
}
|
|
|
|
|
2013-10-30 10:36:12 +00:00
|
|
|
set keys [lsort -unique $keys]
|
2013-10-30 10:34:01 +00:00
|
|
|
assert_equal 1000 [llength $keys]
|
|
|
|
}
|
|
|
|
|
|
|
|
test "SCAN COUNT" {
|
|
|
|
r flushdb
|
|
|
|
r debug populate 1000
|
|
|
|
|
|
|
|
set cur 0
|
|
|
|
set keys {}
|
|
|
|
while 1 {
|
|
|
|
set res [r scan $cur count 5]
|
|
|
|
set cur [lindex $res 0]
|
|
|
|
set k [lindex $res 1]
|
2013-10-30 10:36:12 +00:00
|
|
|
lappend keys {*}$k
|
2013-10-30 10:34:01 +00:00
|
|
|
if {$cur == 0} break
|
|
|
|
}
|
|
|
|
|
2013-10-30 10:36:12 +00:00
|
|
|
set keys [lsort -unique $keys]
|
2013-10-30 10:34:01 +00:00
|
|
|
assert_equal 1000 [llength $keys]
|
|
|
|
}
|
|
|
|
|
|
|
|
test "SCAN MATCH" {
|
|
|
|
r flushdb
|
|
|
|
r debug populate 1000
|
|
|
|
|
|
|
|
set cur 0
|
|
|
|
set keys {}
|
|
|
|
while 1 {
|
|
|
|
set res [r scan $cur match "key:1??"]
|
|
|
|
set cur [lindex $res 0]
|
|
|
|
set k [lindex $res 1]
|
2013-10-30 10:36:12 +00:00
|
|
|
lappend keys {*}$k
|
2013-10-30 10:34:01 +00:00
|
|
|
if {$cur == 0} break
|
|
|
|
}
|
|
|
|
|
2013-10-30 10:36:12 +00:00
|
|
|
set keys [lsort -unique $keys]
|
2013-10-30 10:34:01 +00:00
|
|
|
assert_equal 100 [llength $keys]
|
|
|
|
}
|
2013-10-30 10:58:04 +00:00
|
|
|
|
|
|
|
foreach enc {intset hashtable} {
|
|
|
|
test "SSCAN with encoding $enc" {
|
|
|
|
# Create the Set
|
|
|
|
r del set
|
|
|
|
if {$enc eq {intset}} {
|
|
|
|
set prefix ""
|
|
|
|
} else {
|
|
|
|
set prefix "ele:"
|
|
|
|
}
|
|
|
|
set elements {}
|
|
|
|
for {set j 0} {$j < 100} {incr j} {
|
|
|
|
lappend elements ${prefix}${j}
|
|
|
|
}
|
|
|
|
r sadd set {*}$elements
|
|
|
|
|
|
|
|
# Verify that the encoding matches.
|
|
|
|
assert {[r object encoding set] eq $enc}
|
|
|
|
|
|
|
|
# Test SSCAN
|
|
|
|
set cur 0
|
|
|
|
set keys {}
|
|
|
|
while 1 {
|
|
|
|
set res [r sscan set $cur]
|
|
|
|
set cur [lindex $res 0]
|
|
|
|
set k [lindex $res 1]
|
|
|
|
lappend keys {*}$k
|
|
|
|
if {$cur == 0} break
|
|
|
|
}
|
|
|
|
|
|
|
|
set keys [lsort -unique $keys]
|
|
|
|
assert_equal 100 [llength $keys]
|
|
|
|
}
|
|
|
|
}
|
2013-10-30 15:24:39 +00:00
|
|
|
|
|
|
|
foreach enc {ziplist hashtable} {
|
|
|
|
test "HSCAN with encoding $enc" {
|
|
|
|
# Create the Hash
|
|
|
|
r del hash
|
|
|
|
if {$enc eq {ziplist}} {
|
|
|
|
set count 30
|
|
|
|
} else {
|
|
|
|
set count 1000
|
|
|
|
}
|
|
|
|
set elements {}
|
|
|
|
for {set j 0} {$j < $count} {incr j} {
|
|
|
|
lappend elements key:$j $j
|
|
|
|
}
|
|
|
|
r hmset hash {*}$elements
|
|
|
|
|
|
|
|
# Verify that the encoding matches.
|
|
|
|
assert {[r object encoding hash] eq $enc}
|
|
|
|
|
|
|
|
# Test HSCAN
|
|
|
|
set cur 0
|
|
|
|
set keys {}
|
|
|
|
while 1 {
|
|
|
|
set res [r hscan hash $cur]
|
|
|
|
set cur [lindex $res 0]
|
|
|
|
set k [lindex $res 1]
|
|
|
|
lappend keys {*}$k
|
|
|
|
if {$cur == 0} break
|
|
|
|
}
|
|
|
|
|
|
|
|
set keys2 {}
|
|
|
|
foreach {k v} $keys {
|
|
|
|
assert {$k eq "key:$v"}
|
|
|
|
lappend keys2 $k
|
|
|
|
}
|
|
|
|
|
|
|
|
set keys2 [lsort -unique $keys2]
|
|
|
|
assert_equal $count [llength $keys2]
|
|
|
|
}
|
|
|
|
}
|
2013-10-30 15:25:47 +00:00
|
|
|
|
|
|
|
foreach enc {ziplist skiplist} {
|
|
|
|
test "ZSCAN with encoding $enc" {
|
|
|
|
# Create the Sorted Set
|
|
|
|
r del zset
|
|
|
|
if {$enc eq {ziplist}} {
|
|
|
|
set count 30
|
|
|
|
} else {
|
|
|
|
set count 1000
|
|
|
|
}
|
|
|
|
set elements {}
|
|
|
|
for {set j 0} {$j < $count} {incr j} {
|
|
|
|
lappend elements $j key:$j
|
|
|
|
}
|
|
|
|
r zadd zset {*}$elements
|
|
|
|
|
|
|
|
# Verify that the encoding matches.
|
|
|
|
assert {[r object encoding zset] eq $enc}
|
|
|
|
|
|
|
|
# Test ZSCAN
|
|
|
|
set cur 0
|
|
|
|
set keys {}
|
|
|
|
while 1 {
|
|
|
|
set res [r zscan zset $cur]
|
|
|
|
set cur [lindex $res 0]
|
|
|
|
set k [lindex $res 1]
|
|
|
|
lappend keys {*}$k
|
|
|
|
if {$cur == 0} break
|
|
|
|
}
|
|
|
|
|
|
|
|
set keys2 {}
|
|
|
|
foreach {k v} $keys {
|
|
|
|
assert {$k eq "key:$v"}
|
|
|
|
lappend keys2 $k
|
|
|
|
}
|
|
|
|
|
|
|
|
set keys2 [lsort -unique $keys2]
|
|
|
|
assert_equal $count [llength $keys2]
|
|
|
|
}
|
|
|
|
}
|
2013-10-30 15:50:25 +00:00
|
|
|
|
|
|
|
test "SCAN guarantees check under write load" {
|
|
|
|
r flushdb
|
|
|
|
r debug populate 100
|
|
|
|
|
|
|
|
# We start scanning here, so keys from 0 to 99 should all be
|
|
|
|
# reported at the end of the iteration.
|
|
|
|
set keys {}
|
|
|
|
while 1 {
|
|
|
|
set res [r scan $cur]
|
|
|
|
set cur [lindex $res 0]
|
|
|
|
set k [lindex $res 1]
|
|
|
|
lappend keys {*}$k
|
|
|
|
if {$cur == 0} break
|
|
|
|
# Write 10 random keys at every SCAN iteration.
|
|
|
|
for {set j 0} {$j < 10} {incr j} {
|
|
|
|
r set addedkey:[randomInt 1000] foo
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
set keys2 {}
|
|
|
|
foreach k $keys {
|
|
|
|
if {[string length $k] > 6} continue
|
|
|
|
lappend keys2 $k
|
|
|
|
}
|
|
|
|
|
|
|
|
set keys2 [lsort -unique $keys2]
|
|
|
|
assert_equal 100 [llength $keys2]
|
|
|
|
}
|
2013-10-30 10:34:01 +00:00
|
|
|
}
|