@@ -290,20 +290,18 @@ impl RedisClient {
290
290
let can_continue = value. has_more ( ) ;
291
291
let mut scanned_keys = value. take_results ( ) . unwrap_or_default ( ) ;
292
292
293
- // Record scanned count.
294
- let scanned_keys_len = scanned_keys. len ( ) as u32 ;
295
- scanned_count. fetch_add ( scanned_keys_len, Ordering :: Relaxed ) ;
296
-
297
293
// Append
298
294
keys. append ( & mut scanned_keys) ;
299
295
296
+ // Record scanned count.
297
+ // Use keys.len() to use the `.with_capacity` related functionality.
298
+ scanned_count. fetch_add ( keys. len ( ) as u32 , Ordering :: Relaxed ) ;
299
+
300
300
// If we scanned enough items
301
301
// or cannot scan anymore.
302
302
let scanned_count_raw = scanned_count. load ( Ordering :: Relaxed ) ;
303
303
let scanned_enough = scanned_count_raw >= needed_count || !can_continue;
304
304
if scanned_enough {
305
- scanned_count. fetch_and ( keys. len ( ) as u32 , Ordering :: Relaxed ) ;
306
-
307
305
sx. send ( Ok ( RedisScannerResult { keys, can_continue } ) )
308
306
. unwrap ( ) ;
309
307
sent = true ;
@@ -373,11 +371,27 @@ impl RedisClient {
373
371
& mut self ,
374
372
pattern : String ,
375
373
iter_count : u32 ,
376
- needed_count : u32 ,
374
+ offset : Option < u32 > ,
377
375
r#type : Option < ScanType > ,
378
376
) -> Result < RedisScannerResult > {
379
- self . _invoke_new_scan ( pattern, iter_count. max ( needed_count) , needed_count, r#type)
380
- . await ?;
377
+ let needed_count = if self . scanner . is_some ( ) {
378
+ self . scanner
379
+ . as_ref ( )
380
+ . unwrap ( )
381
+ . scanned_count
382
+ . load ( Ordering :: Relaxed )
383
+ } else {
384
+ iter_count
385
+ } ;
386
+
387
+ self . _invoke_new_scan (
388
+ pattern,
389
+ iter_count,
390
+ // Add offset until reaching the maximum num.
391
+ needed_count. saturating_add ( offset. unwrap_or_default ( ) ) ,
392
+ r#type,
393
+ )
394
+ . await ?;
381
395
382
396
// Continue scan.
383
397
let scanner = self . scanner . as_mut ( ) . unwrap ( ) ;
0 commit comments