Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit d9dc2be

Browse files
committed
Count multiple Scan operations as a single request
1 parent 611047f commit d9dc2be

File tree

3 files changed

+88
-44
lines changed

3 files changed

+88
-44
lines changed

src/ServiceStack.Redis/RedisClient.cs

Lines changed: 72 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
using System.Collections.Generic;
1616
using System.Linq;
1717
using System.Text;
18+
using System.Threading;
1819
using ServiceStack.Redis.Generic;
1920
using ServiceStack.Redis.Pipeline;
2021
using ServiceStack.Text;
@@ -974,73 +975,101 @@ public void RemoveByRegex(string pattern)
974975

975976
public IEnumerable<string> ScanAllKeys(string pattern = null, int pageSize = 1000)
976977
{
977-
var ret = new ScanResult();
978-
while (true)
978+
try
979979
{
980-
ret = pattern != null
981-
? base.Scan(ret.Cursor, pageSize, match: pattern)
982-
: base.Scan(ret.Cursor, pageSize);
983-
984-
foreach (var key in ret.Results)
980+
var ret = CreateScanResult();
981+
while (true)
985982
{
986-
yield return key.FromUtf8Bytes();
987-
}
983+
ret = pattern != null
984+
? base.Scan(ret.Cursor, pageSize, match: pattern)
985+
: base.Scan(ret.Cursor, pageSize);
986+
987+
foreach (var key in ret.Results)
988+
{
989+
yield return key.FromUtf8Bytes();
990+
}
988991

989-
if (ret.Cursor == 0) break;
992+
if (ret.Cursor == 0) break;
993+
}
994+
}
995+
finally
996+
{
997+
EndScanResult();
990998
}
991999
}
9921000

9931001
public IEnumerable<string> ScanAllSetItems(string setId, string pattern = null, int pageSize = 1000)
9941002
{
995-
var ret = new ScanResult();
996-
while (true)
1003+
try
9971004
{
998-
ret = pattern != null
999-
? base.SScan(setId, ret.Cursor, pageSize, match: pattern)
1000-
: base.SScan(setId, ret.Cursor, pageSize);
1001-
1002-
foreach (var key in ret.Results)
1005+
var ret = CreateScanResult();
1006+
while (true)
10031007
{
1004-
yield return key.FromUtf8Bytes();
1005-
}
1008+
ret = pattern != null
1009+
? base.SScan(setId, ret.Cursor, pageSize, match: pattern)
1010+
: base.SScan(setId, ret.Cursor, pageSize);
10061011

1007-
if (ret.Cursor == 0) break;
1012+
foreach (var key in ret.Results)
1013+
{
1014+
yield return key.FromUtf8Bytes();
1015+
}
1016+
1017+
if (ret.Cursor == 0) break;
1018+
}
1019+
}
1020+
finally
1021+
{
1022+
EndScanResult();
10081023
}
10091024
}
10101025

10111026
public IEnumerable<KeyValuePair<string, double>> ScanAllSortedSetItems(string setId, string pattern = null, int pageSize = 1000)
10121027
{
1013-
var ret = new ScanResult();
1014-
while (true)
1028+
try
10151029
{
1016-
ret = pattern != null
1017-
? base.ZScan(setId, ret.Cursor, pageSize, match: pattern)
1018-
: base.ZScan(setId, ret.Cursor, pageSize);
1019-
1020-
foreach (var entry in ret.AsItemsWithScores())
1030+
var ret = CreateScanResult();
1031+
while (true)
10211032
{
1022-
yield return entry;
1023-
}
1033+
ret = pattern != null
1034+
? base.ZScan(setId, ret.Cursor, pageSize, match: pattern)
1035+
: base.ZScan(setId, ret.Cursor, pageSize);
10241036

1025-
if (ret.Cursor == 0) break;
1037+
foreach (var entry in ret.AsItemsWithScores())
1038+
{
1039+
yield return entry;
1040+
}
1041+
1042+
if (ret.Cursor == 0) break;
1043+
}
1044+
}
1045+
finally
1046+
{
1047+
EndScanResult();
10261048
}
10271049
}
10281050

10291051
public IEnumerable<KeyValuePair<string, string>> ScanAllHashEntries(string hashId, string pattern = null, int pageSize = 1000)
10301052
{
1031-
var ret = new ScanResult();
1032-
while (true)
1053+
try
10331054
{
1034-
ret = pattern != null
1035-
? base.HScan(hashId, ret.Cursor, pageSize, match: pattern)
1036-
: base.HScan(hashId, ret.Cursor, pageSize);
1037-
1038-
foreach (var entry in ret.AsKeyValues())
1055+
var ret = CreateScanResult();
1056+
while (true)
10391057
{
1040-
yield return entry;
1041-
}
1058+
ret = pattern != null
1059+
? base.HScan(hashId, ret.Cursor, pageSize, match: pattern)
1060+
: base.HScan(hashId, ret.Cursor, pageSize);
1061+
1062+
foreach (var entry in ret.AsKeyValues())
1063+
{
1064+
yield return entry;
1065+
}
10421066

1043-
if (ret.Cursor == 0) break;
1067+
if (ret.Cursor == 0) break;
1068+
}
1069+
}
1070+
finally
1071+
{
1072+
EndScanResult();
10441073
}
10451074
}
10461075

@@ -1065,9 +1094,9 @@ public RedisServerRole GetServerRole()
10651094
{
10661095
var text = base.Role();
10671096
var roleName = text.Children[0].Text;
1068-
return ToServerRole(roleName);
1097+
return ToServerRole(roleName);
10691098
}
1070-
1099+
10711100
string role;
10721101
this.Info.TryGetValue("role", out role);
10731102
return ToServerRole(role);
@@ -1077,7 +1106,7 @@ private static RedisServerRole ToServerRole(string roleName)
10771106
{
10781107
if (string.IsNullOrEmpty(roleName))
10791108
return RedisServerRole.Unknown;
1080-
1109+
10811110
switch (roleName)
10821111
{
10831112
case "master":

src/ServiceStack.Redis/RedisNativeClient.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,8 @@ internal IRedisPipelineShared Pipeline
147147
}
148148
}
149149

150+
private bool IsScan;
151+
150152
internal void EndPipeline()
151153
{
152154
ResetSendBuffer();
@@ -2137,6 +2139,19 @@ public RedisPipelineCommand CreatePipelineCommand()
21372139
return new RedisPipelineCommand(this);
21382140
}
21392141

2142+
protected ScanResult CreateScanResult()
2143+
{
2144+
IsScan = true;
2145+
return new ScanResult();
2146+
}
2147+
2148+
protected void EndScanResult()
2149+
{
2150+
IsScan = false;
2151+
Interlocked.Increment(ref __requestsPerHour);
2152+
}
2153+
2154+
21402155
#endregion
21412156

21422157
internal bool IsDisposed { get; set; }

src/ServiceStack.Redis/RedisNativeClient_Utils.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ private static byte[] GetCmdBytes(char cmdPrefix, int noOfLines)
351351
/// <returns></returns>
352352
protected void WriteCommandToSendBuffer(params byte[][] cmdWithBinaryArgs)
353353
{
354-
if (Pipeline == null && Transaction == null)
354+
if (Pipeline == null && Transaction == null && !IsScan)
355355
{
356356
Interlocked.Increment(ref __requestsPerHour);
357357
if (__requestsPerHour % 20 == 0)

0 commit comments

Comments
 (0)