1
1
using System ;
2
2
using System . Collections . Generic ;
3
3
using System . Linq ;
4
+ using System . Threading . Tasks ;
4
5
using ServiceStack . Redis ;
5
6
using StackExchange . Redis ;
6
7
@@ -66,9 +67,9 @@ private static void RunStackExchange(string prefix)
66
67
prefix += "StackExchange.Redis." ;
67
68
68
69
Console . WriteLine ( $ "Testing StackExchange.Redis { prefix } ") ;
69
- using ( var redis = ConnectionMultiplexer . Connect ( "localhost" ) )
70
+ using ( var redis = ConnectionMultiplexer . Connect ( "localhost,allowAdmin=true " ) )
70
71
{
71
- var db = redis . GetDatabase ( ) ;
72
+ var db = redis . GetDatabase ( 1 ) ;
72
73
73
74
db . StringSet ( $ "{ prefix } INCR", "0" ) ;
74
75
@@ -83,13 +84,188 @@ private static void RunStackExchange(string prefix)
83
84
{ "GET" , ( ) => db . StringGet ( $ "{ prefix } INCR") } ,
84
85
{ "TIME" , ( ) => db . Execute ( "TIME" ) } ,
85
86
} ) ;
87
+
88
+
89
+ var batch = db . CreateBatch ( ) ;
90
+ var batchPending = RunStackExchangeAsync ( prefix + "Batch." , batch ) ;
91
+ batch . Execute ( ) ;
92
+ foreach ( var item in batchPending )
93
+ {
94
+ try
95
+ {
96
+ Console . WriteLine ( $ "{ item . Item1 } : { TaskResult ( item . Item2 ) } ") ;
97
+ }
98
+ catch ( Exception e )
99
+ {
100
+ while ( e . InnerException != null )
101
+ {
102
+ e = e . InnerException ;
103
+ }
104
+ Console . WriteLine ( $ "{ item . Item1 } : { e . Message } ") ;
105
+ }
106
+ }
107
+
108
+ try
109
+ {
110
+ redis . GetServer ( "localhost:6379" ) . FlushDatabase ( 1 ) ;
111
+ }
112
+ catch
113
+ {
114
+ }
115
+ }
116
+ }
117
+
118
+ private static TupleList < string , Task > RunStackExchangeAsync ( string prefix , IDatabaseAsync db )
119
+ {
120
+ var tasks = new TupleList < string , Func < Task > > ( )
121
+ {
122
+ { "DebugObjectAsync" , ( ) => db . DebugObjectAsync ( $ "{ prefix } DebugObjectAsync") } ,
123
+ { "ExecuteAsync" , ( ) => db . ExecuteAsync ( "DDCUSTOM" , "COMMAND" ) } ,
124
+ { "GeoAddAsync" , ( ) => db . GeoAddAsync ( $ "{ prefix } GeoAddAsync", new GeoEntry ( 1.5 , 2.5 , "member" ) ) } ,
125
+ { "GeoDistanceAsync" , ( ) => db . GeoDistanceAsync ( $ "{ prefix } GeoDistanceAsync", "member1" , "member2" ) } ,
126
+ { "GeoHashAsync" , ( ) => db . GeoHashAsync ( $ "{ prefix } GeoHashAsync", "member" ) } ,
127
+ { "GeoPositionAsync" , ( ) => db . GeoPositionAsync ( $ "{ prefix } GeoPositionAsync", "member" ) } ,
128
+ { "GeoRadiusAsync" , ( ) => db . GeoRadiusAsync ( $ "{ prefix } GeoRadiusAsync", "member" , 2.3 ) } ,
129
+ { "GeoRemoveAsync" , ( ) => db . GeoRemoveAsync ( $ "{ prefix } GeoRemoveAsync", "member" ) } ,
130
+ { "HashDecrementAsync" , ( ) => db . HashDecrementAsync ( $ "{ prefix } HashDecrementAsync", "hashfield" , 4.5 ) } ,
131
+ { "HashDeleteAsync" , ( ) => db . HashDeleteAsync ( $ "{ prefix } HashDeleteAsync", "hashfield" ) } ,
132
+ { "HashExistsAsync" , ( ) => db . HashExistsAsync ( $ "{ prefix } HashExistsAsync", "hashfield" ) } ,
133
+ { "HashGetAllAsync" , ( ) => db . HashGetAllAsync ( $ "{ prefix } HashGetAllAsync") } ,
134
+ { "HashIncrementAsync" , ( ) => db . HashIncrementAsync ( $ "{ prefix } HashIncrementAsync", "hashfield" , 1.5 ) } ,
135
+ { "HashKeysAsync" , ( ) => db . HashKeysAsync ( $ "{ prefix } HashKeysAsync") } ,
136
+ { "HashLengthAsync" , ( ) => db . HashLengthAsync ( $ "{ prefix } HashLengthAsync") } ,
137
+ { "HashSetAsync" , ( ) => db . HashSetAsync ( $ "{ prefix } HashSetAsync", new HashEntry [ ] { new HashEntry ( "x" , "y" ) } ) } ,
138
+ { "HashValuesAsync" , ( ) => db . HashValuesAsync ( $ "{ prefix } HashValuesAsync") } ,
139
+ { "HyperLogLogAddAsync" , ( ) => db . HyperLogLogAddAsync ( $ "{ prefix } HyperLogLogAddAsync", "value" ) } ,
140
+ { "HyperLogLogLengthAsync" , ( ) => db . HyperLogLogLengthAsync ( $ "{ prefix } HyperLogLogLengthAsync") } ,
141
+ { "HyperLogLogMergeAsync" , ( ) => db . HyperLogLogMergeAsync ( $ "{ prefix } HyperLogLogMergeAsync", new RedisKey [ ] { "key1" , "key2" } ) } ,
142
+ { "IdentifyEndpointAsync" , ( ) => db . IdentifyEndpointAsync ( ) } ,
143
+ { "KeyDeleteAsync" , ( ) => db . KeyDeleteAsync ( "key" ) } ,
144
+ { "KeyDumpAsync" , ( ) => db . KeyDumpAsync ( "key" ) } ,
145
+ { "KeyExistsAsync" , ( ) => db . KeyExistsAsync ( "key" ) } ,
146
+ { "KeyExpireAsync" , ( ) => db . KeyExpireAsync ( "key" , DateTime . Now ) } ,
147
+ // () => db.KeyMigrateAsync("key", ???)
148
+ { "KeyMoveAsync" , ( ) => db . KeyMoveAsync ( "key" , 1 ) } ,
149
+ { "KeyPersistAsync" , ( ) => db . KeyPersistAsync ( "key" ) } ,
150
+ { "KeyRandomAsync" , ( ) => db . KeyRandomAsync ( ) } ,
151
+ { "KeyRenameAsync" , ( ) => db . KeyRenameAsync ( "key1" , "key2" ) } ,
152
+ { "KeyRestoreAsync" , ( ) => db . KeyRestoreAsync ( "key" , new byte [ ] { 0 , 1 , 2 , 3 , 4 } ) } ,
153
+ { "KeyTimeToLiveAsync" , ( ) => db . KeyTimeToLiveAsync ( "key" ) } ,
154
+ { "KeyTypeAsync" , ( ) => db . KeyTypeAsync ( "key" ) } ,
155
+ { "ListGetByIndexAsync" , ( ) => db . ListGetByIndexAsync ( "listkey" , 0 ) } ,
156
+ { "ListInsertAfterAsync" , ( ) => db . ListInsertAfterAsync ( "listkey" , "value1" , "value2" ) } ,
157
+ { "ListInsertBeforeAsync" , ( ) => db . ListInsertBeforeAsync ( "listkey" , "value1" , "value2" ) } ,
158
+ { "ListLeftPopAsync" , ( ) => db . ListLeftPopAsync ( "listkey" ) } ,
159
+ { "ListLeftPushAsync" , ( ) => db . ListLeftPushAsync ( "listkey" , new RedisValue [ ] { "value3" , "value4" } ) } ,
160
+ { "ListLengthAsync" , ( ) => db . ListLengthAsync ( "listkey" ) } ,
161
+ { "ListRangeAsync" , ( ) => db . ListRangeAsync ( "listkey" ) } ,
162
+ { "ListRemoveAsync" , ( ) => db . ListRemoveAsync ( "listkey" , "value3" ) } ,
163
+ { "ListRightPopAsync" , ( ) => db . ListRightPopAsync ( "listkey" ) } ,
164
+ { "ListRightPopLeftPushAsync" , ( ) => db . ListRightPopLeftPushAsync ( "listkey" , "listkey2" ) } ,
165
+ { "ListRightPushAsync" , ( ) => db . ListRightPushAsync ( "listkey" , new RedisValue [ ] { "value5" , "value6" } ) } ,
166
+ { "ListSetByIndexAsync" , ( ) => db . ListSetByIndexAsync ( "listkey" , 0 , "value7" ) } ,
167
+ { "ListTrimAsync" , ( ) => db . ListTrimAsync ( "listkey" , 0 , 1 ) } ,
168
+ { "LockExtendAsync" , ( ) => db . LockExtendAsync ( "listkey" , "value7" , new TimeSpan ( 0 , 0 , 10 ) ) } ,
169
+ { "LockQueryAsync" , ( ) => db . LockQueryAsync ( "listkey" ) } ,
170
+ { "LockReleaseAsync" , ( ) => db . LockReleaseAsync ( "listkey" , "value7" ) } ,
171
+ { "LockTakeAsync" , ( ) => db . LockTakeAsync ( "listkey" , "value8" , new TimeSpan ( 0 , 0 , 10 ) ) } ,
172
+ { "PublishAsync" , ( ) => db . PublishAsync ( new RedisChannel ( "channel" , RedisChannel . PatternMode . Auto ) , "somemessage" ) } ,
173
+ // { "ScriptEvaluateAsync", () => db.ScriptEvaluateAsync(}
174
+ { "SetAddAsync" , ( ) => db . SetAddAsync ( "setkey" , "value1" ) } ,
175
+ { "SetCombineAndStoreAsync" , ( ) => db . SetCombineAndStoreAsync ( SetOperation . Union , "setkey" , new RedisKey [ ] { "value2" } ) } ,
176
+ { "SetCombineAsync" , ( ) => db . SetCombineAsync ( SetOperation . Union , new RedisKey [ ] { "setkey1" , "setkey2" } ) } ,
177
+ { "SetContainsAsync" , ( ) => db . SetContainsAsync ( "setkey" , "value1" ) } ,
178
+ { "SetLengthAsync" , ( ) => db . SetLengthAsync ( "setkey" ) } ,
179
+ { "SetMembersAsync" , ( ) => db . SetMembersAsync ( "setkey" ) } ,
180
+ { "SetMoveAsync" , ( ) => db . SetMoveAsync ( "setkey1" , "setkey2" , "value2" ) } ,
181
+ { "SetPopAsync" , ( ) => db . SetPopAsync ( "setkey1" ) } ,
182
+ { "SetRandomMemberAsync" , ( ) => db . SetRandomMemberAsync ( "setkey" ) } ,
183
+ { "SetRandomMembersAsync" , ( ) => db . SetRandomMembersAsync ( "setkey" , 2 ) } ,
184
+ { "SetRemoveAsync" , ( ) => db . SetRemoveAsync ( "setkey" , "value2" ) } ,
185
+ { "SortAndStoreAsync" , ( ) => db . SortAndStoreAsync ( "setkey2" , "setkey" ) } ,
186
+ { "SortAsync" , ( ) => db . SortAsync ( "setkey" ) } ,
187
+ { "SortedSetAddAsync" , ( ) => db . SortedSetAddAsync ( "ssetkey" , new SortedSetEntry [ ] { new SortedSetEntry ( "value1" , 1.5 ) , new SortedSetEntry ( "value2" , 2.5 ) } ) } ,
188
+ { "SortedSetCombineAndStoreAsync" , ( ) => db . SortedSetCombineAndStoreAsync ( SetOperation . Union , "ssetkey1" , "ssetkey2" , "ssetkey3" ) } ,
189
+ { "SortedSetDecrementAsync" , ( ) => db . SortedSetDecrementAsync ( "ssetkey" , "value1" , 1 ) } ,
190
+ { "SortedSetIncrementAsync" , ( ) => db . SortedSetIncrementAsync ( "ssetkey" , "value2" , 1 ) } ,
191
+ { "SortedSetLengthAsync" , ( ) => db . SortedSetLengthAsync ( "ssetkey" ) } ,
192
+ { "SortedSetLengthByValueAsync" , ( ) => db . SortedSetLengthByValueAsync ( "ssetkey" , "value1" , "value2" ) } ,
193
+ { "SortedSetRangeByRankAsync" , ( ) => db . SortedSetRangeByRankAsync ( "ssetkey" ) } ,
194
+ { "SortedSetRangeByRankWithScoresAsync" , ( ) => db . SortedSetRangeByRankWithScoresAsync ( "ssetkey" ) } ,
195
+ { "SortedSetRangeByScoreAsync" , ( ) => db . SortedSetRangeByScoreAsync ( "ssetkey" ) } ,
196
+ { "SortedSetRangeByScoreWithScoresAsync" , ( ) => db . SortedSetRangeByScoreWithScoresAsync ( "ssetkey" ) } ,
197
+ { "SortedSetRangeByValueAsync" , ( ) => db . SortedSetRangeByValueAsync ( "ssetkey" ) } ,
198
+ { "SortedSetRankAsync" , ( ) => db . SortedSetRankAsync ( "ssetkey" , "value1" ) } ,
199
+ { "SortedSetRemoveAsync" , ( ) => db . SortedSetRemoveAsync ( "ssetkey" , "value1" ) } ,
200
+ { "SortedSetRemoveRangeByRankAsync" , ( ) => db . SortedSetRemoveRangeByRankAsync ( "ssetkey" , 0 , 1 ) } ,
201
+ { "SortedSetRemoveRangeByScoreAsync" , ( ) => db . SortedSetRemoveRangeByScoreAsync ( "ssetkey" , 0 , 1 ) } ,
202
+ { "SortedSetRemoveRangeByValueAsync" , ( ) => db . SortedSetRemoveRangeByValueAsync ( "ssetkey" , "value1" , "value2" ) } ,
203
+ { "SortedSetScoreAsync" , ( ) => db . SortedSetScoreAsync ( "ssestkey" , "value1" ) } ,
204
+ { "StringAppendAsync" , ( ) => db . StringAppendAsync ( "ssetkey" , "value1" ) } ,
205
+ { "StringBitCountAsync" , ( ) => db . StringBitCountAsync ( "ssetkey" ) } ,
206
+ { "StringBitOperationAsync" , ( ) => db . StringBitOperationAsync ( Bitwise . And , "ssetkey1" , new RedisKey [ ] { "ssetkey2" , "ssetkey3" } ) } ,
207
+ { "StringBitPositionAsync" , ( ) => db . StringBitPositionAsync ( "ssetkey1" , true ) } ,
208
+ { "StringDecrementAsync" , ( ) => db . StringDecrementAsync ( "key" , 1.45 ) } ,
209
+ { "StringGetAsync" , ( ) => db . StringGetAsync ( "key" ) } ,
210
+ { "StringGetBitAsync" , ( ) => db . StringGetBitAsync ( "key" , 3 ) } ,
211
+ { "StringGetRangeAsync" , ( ) => db . StringGetRangeAsync ( "key" , 0 , 1 ) } ,
212
+ { "StringGetSetAsync" , ( ) => db . StringGetSetAsync ( "key" , "value" ) } ,
213
+ { "StringGetWithExpiryAsync" , ( ) => db . StringGetWithExpiryAsync ( "key" ) } ,
214
+ { "StringIncrementAsync" , ( ) => db . StringIncrementAsync ( "key" , 1 ) } ,
215
+ { "StringLengthAsync" , ( ) => db . StringLengthAsync ( "key" ) } ,
216
+ { "StringSetAsync" , ( ) => db . StringSetAsync ( new KeyValuePair < RedisKey , RedisValue > [ ] { new KeyValuePair < RedisKey , RedisValue > ( "key" , "value" ) } ) } ,
217
+ { "StringSetBitAsync" , ( ) => db . StringSetBitAsync ( "key" , 0 , true ) } ,
218
+ { "StringSetRangeAsync" , ( ) => db . StringSetRangeAsync ( "key" , 3 , "value" ) } ,
219
+ } ;
220
+
221
+ var pending = new TupleList < string , Task > ( ) ;
222
+ foreach ( var item in tasks )
223
+ {
224
+ try
225
+ {
226
+ pending . Add ( item . Item1 , item . Item2 ( ) ) ;
227
+ }
228
+ catch ( Exception e )
229
+ {
230
+ while ( e . InnerException != null )
231
+ {
232
+ e = e . InnerException ;
233
+ }
234
+ Console . WriteLine ( $ "{ e . Message } ") ;
235
+ }
236
+ }
237
+
238
+ return pending ;
239
+ }
240
+
241
+ private static object TaskResult ( Task task )
242
+ {
243
+ var taskType = task . GetType ( ) ;
244
+
245
+ bool isTaskOfT =
246
+ taskType . IsGenericType
247
+ && taskType . GetGenericTypeDefinition ( ) == typeof ( Task < > ) ;
248
+
249
+ if ( isTaskOfT )
250
+ {
251
+ return taskType . GetProperty ( "Result" ) . GetValue ( task ) ;
252
+ }
253
+ else
254
+ {
255
+ task . Wait ( ) ;
256
+ return null ;
86
257
}
87
258
}
88
259
89
260
private static void RunCommands ( TupleList < string , Func < object > > commands )
90
261
{
91
262
foreach ( var cmd in commands )
92
263
{
264
+ if ( cmd . Item2 == null )
265
+ {
266
+ continue ;
267
+ }
268
+
93
269
object result ;
94
270
try
95
271
{
0 commit comments