StackExchange.Redis用LuaScript执行代参命令
Redis在查询上提供给.net的api方法,只有StringGet、StringGetBit、StringGetRange。如果想做模糊查询,该怎么办?Redis Client那么强大,api不可能只限于此,查了查Redis官网,果然有大招,那就是LuaScript.
我们来先认识一下LuaScript,它是一个EVAL脚本。Redis2.6.0有内置的Lua编译器,EVAL就是用来在Lua编译器里执行脚本的。
LuaScript的源生使用
使用之前我们先来瞄一眼EVAL原貌,下图是命令示例:
1.EVAL 的第一个参数是Lua 5.1的脚本。脚本不需要定义Lua方法体(也不需要
),它只是一个即将运行在Redis服务器上下文中的Lua程序
2.第二个参数是跟在脚本之后的指示Redis键名的个数,键可访问脚本中下标以1为基数的KEYS[n]变量。
3.其他的参数以ARGV 来命名
示例返回结果:
1) "key1"
2) "key2"
3) "first"
4) "second"
以Lua脚本去调用Redis命令可以从用下两个不同的Lua函数,区别于出错处理方式:
redis.call() 抛出错误给调用者
redis.pcall() 以Lua表的形式返回结果
C#中使用LuaScript
言归正传,回到代码中来,Redis如何使用LuaScript呢?直接上代码实菜吧,写一个模糊查询key的方法,这里我已经实例好了一个cache单例,直接使用:
/// <summary>
/// 判断是否存在包含keyPattern的key
/// </summary>
/// <param name="keyPattern"></param>
/// <returns></returns>
public bool ExistPatternKey(string keyPattern)
{
var script = "return redis.call('keys',@pattern)";
var prepared = LuaScript.Prepare(script);
var cacheResult= cache.ScriptEvaluate(prepared, new { pattern = keyPattern });
if (cacheResult.IsNull)
{
return false;
}
return ((string[])cacheResult).Length > 0;
}