波斯马BOSSMA Information Technology

NServiceKit.Redis不支持SCAN的解决方法

发布时间:2015年1月10日 / 分类:DOTNET, Redis / 6,039 次浏览 / 评论

NServiceKit.Redis这个名字可能听说过的不多,但是在.NET平台使用redis的人一般都接触过ServiceStack.Redis,ServiceStack.Redis从v4开始收费了,NServiceKit.Redis是这个程序的免费开源版本,其源码与ServiceStack.Redis v3基本相同,但是它们好像都不支持SCAN命令(也许是我没发现),尝试用执行Lua Script的ExecLuaAsList等方法也不能返回两个值,所以只好修改了源代码实现这个功能。

SCAN介绍

SCAN cursor [MATCH pattern] [COUNT count]

支持三个参数:

cursor  类似于数据库查询中的游标,表示开始扫描的位置

MATACH 表示key的匹配模式,全部就是*

COUNT 表示要扫描的数目,返回的数据条数

SCAN执行后每次都返回一个新的cursor,然后用cursor执行下一次SCAN,直到cursor等于0,表示完整迭代完毕。

迭代过程示例:

20150110153119

NServiceKit.Redis修改

在NServiceKit.Redis内部其实已经支持返回多个值,RedisClient中的Slowlog就是一个例子,其内部数据结构是一个嵌套数组,方便组装多级多种不同的返回值。

打开NServiceKit.Redis项目中的RedisNativeClient_Utils.cs文件,找到方法:SendExpectDeeplyNestedMultiData:

其中又调用了ReadDeeplyNestedMultiData:

其中又调用了ReadDeeplyNestedMultiDataItem,这是个关键的方法:

通过上边这个方法SCAN命令的返回值就全取到了,下一步就要利用这个方法来实现SCAN命令。

1、修改NServiceKit.Interfaces项目中的IRedisClient接口,增加一个ScanKeys方法。

三个参数对应SCAN命令的三个参数,cursor是ref的,可以返回下一步迭代的cursor。

返回值是查询到的key数组。

2、修改NServiceKit.Redis项目中的RedisNativeClient类,增加一个Scan方法。

这是一个底层方法,对返回值不做加工,其中调用了前边提到的SendExpectDeeplyNestedMultiData方法。

NServiceKit.Redis中本没有Scan命令,这里还在Commands类中增加了一个字段Scan:

3、修改NServiceKit.Redis项目中的RedisClient类,增加一个ScanKeys方法,实现IRedisClient接口中新增的ScanKeys:

到此NServiceKit.Redis就支持SCAN命令了。

有兴趣的可以改一下试试,或者直接下载我编译的dll:NServiceKit.Redis

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自波斯马,原文地址《NServiceKit.Redis不支持SCAN的解决方法

关键字:

建议订阅本站,及时阅读最新文章!
【上一篇】 【下一篇】

发表评论