public void LuaScriptPrefixedKeys()
        {
            const string Script   = "redis.call('set', @key, @value)";
            var          prepared = LuaScript.Prepare(Script);
            var          key      = Me();
            var          p        = new { key = (RedisKey)key, value = "hello" };

            // no super clean way to extract this; so just abuse InternalsVisibleTo
            prepared.ExtractParameters(p, "prefix-", out RedisKey[] keys, out RedisValue[] args);
        public static RedisResult DoEvalSetOnLargeString()
        {
            var          db            = GetDatabase();
            const string script        = "redis.call('set', @key, @value)";
            var          uniqueKeyText = Guid.NewGuid().ToString();
            var          prepared      = LuaScript.Prepare(script);

            return(db.ScriptEvaluate(prepared, new { key = (RedisKey)uniqueKeyText, value = ReallyBigString }));
        }
Example #3
0
        public void Simple()
        {
            using (var conn = Create())
            {
                var key = Me();

                var session = new ProfilingSession();

                conn.RegisterProfiler(() => session);

                var dbId = TestConfig.GetDedicatedDB();
                var db   = conn.GetDatabase(dbId);
                db.StringSet(key, "world");
                var result = db.ScriptEvaluate(LuaScript.Prepare("return redis.call('get', @key)"), new { key = (RedisKey)key });
                Assert.Equal("world", result.AsString());
                var val = db.StringGet(key);
                Assert.Equal("world", (string)val);
                var s = (string)db.Execute("ECHO", "fii");
                Assert.Equal("fii", s);

                var cmds = session.FinishProfiling();
                var i    = 0;
                foreach (var cmd in cmds)
                {
                    Log("Command {0} (DB: {1}): {2}", i++, cmd.Db, cmd.ToString().Replace("\n", ", "));
                }

                var all = string.Join(",", cmds.Select(x => x.Command));
                Assert.Equal("SET,EVAL,GET,ECHO", all);
                Log("Checking for SET");
                var set = cmds.SingleOrDefault(cmd => cmd.Command == "SET");
                Assert.NotNull(set);
                Log("Checking for GET");
                var get = cmds.SingleOrDefault(cmd => cmd.Command == "GET");
                Assert.NotNull(get);
                Log("Checking for EVAL");
                var eval = cmds.SingleOrDefault(cmd => cmd.Command == "EVAL");
                Assert.NotNull(eval);
                Log("Checking for ECHO");
                var echo = cmds.SingleOrDefault(cmd => cmd.Command == "ECHO");
                Assert.NotNull(echo);

                Assert.Equal(4, cmds.Count());

                Assert.True(set.CommandCreated <= eval.CommandCreated);
                Assert.True(eval.CommandCreated <= get.CommandCreated);

                AssertProfiledCommandValues(set, conn, dbId);

                AssertProfiledCommandValues(get, conn, dbId);

                AssertProfiledCommandValues(eval, conn, dbId);

                AssertProfiledCommandValues(echo, conn, dbId);
            }
        }
Example #4
0
 public static void ClearKeys(this IRedisDBConnect redis, string keypattern)
 {
     redis.GetDatabase().ScriptEvaluate(LuaScript.Prepare(
                                            " local ks = redis.call('KEYS', @keypattern) " +
                                            " for i=1,#ks,5000 do " +
                                            "     redis.call('del', unpack(ks, i, math.min(i+4999, #ks))) " +
                                            " end " +
                                            " return true "
                                            ), new { keypattern = keypattern });
 }
Example #5
0
        private LoadedLuaScript LoadLuaScriptForGetRule(string scriptUrl)
        {
            string    script    = File.ReadAllText(scriptUrl);
            LuaScript luaScript = LuaScript.Prepare(script);
            var       endpoints = Connection.GetEndPoints();
            var       endpoint  = endpoints[0];
            IServer   server    = Connection.GetServer(endpoint);

            return(luaScript.Load(server));
        }
Example #6
0
        /// <summary>
        /// 模糊查询key的集合
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public string[] ScriptEvaluateKeys(string key)
        {
            var redisResult = database.ScriptEvaluate(LuaScript.Prepare(
                                                          //Redis的keys模糊查询:
                                                          " local res = redis.call('KEYS', @keypattern) " +
                                                          " return res "), new { @keypattern = key });

            string[] preSult = (string[])redisResult;//将返回的结果集转为数组
            return(preSult);
        }
Example #7
0
        /// <summary>
        /// 删除指定通配的所有key
        /// </summary>
        /// <param name="pattern"></param>
        public void RemoveAllByScript(string pattern)
        {
            var keys        = new List <string>();
            var redisResult = _database.ScriptEvaluateAsync(LuaScript.Prepare(@" local res = redis.call('KEYS', @keypattern) " + " return res "), new { @keypattern = pattern + "*" }).GetAwaiter().GetResult();

            if (!redisResult.IsNull)
            {
                _database.KeyDelete((RedisKey[])redisResult);
            }
        }
Example #8
0
        public static bool SetId(string id, double latitude, double longitude)
        {
            ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(ConnectionString);
            IDatabase             db    = redis.GetDatabase();

            var prepared = LuaScript.Prepare(_setScript);
            var result   = db.ScriptEvaluate(prepared, new { key = (RedisKey)_redisKey, value1 = longitude, value2 = latitude, value3 = id });

            return(true);
        }
Example #9
0
 /// <summary> 批量更新 </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="database"></param>
 /// <param name="pattern"></param>
 /// <param name="value"></param>
 /// <returns></returns>
 public static async Task BatchUpdateAsync <T>(this IDatabase database, string pattern, T value)
 {
     await database.ScriptEvaluateAsync(LuaScript.Prepare(
                                            " local ks = redis.call('KEYS', @keypattern) " +
                                            " for i=1,#ks do " +
                                            "     redis.call('set', ks[i], @value) " +
                                            " end " +
                                            " return true "),
                                        new { keypattern = pattern, value = Serialize(value) });
 }
        public void SuccessfulCommandTestWithKey(string value)
        {
            var connectionOptions = new ConfigurationOptions
            {
                AbortOnConnectFail = true,
            };

            connectionOptions.EndPoints.Add(RedisEndPoint);

            using var connection = ConnectionMultiplexer.Connect(connectionOptions);
            var db = connection.GetDatabase();

            db.KeyDelete("key1");

            var activityProcessor = new Mock <BaseProcessor <Activity> >();
            var sampler           = new TestSampler();

            using (Sdk.CreateTracerProviderBuilder()
                   .AddProcessor(activityProcessor.Object)
                   .SetSampler(sampler)
                   .AddRedisInstrumentation(connection, c => c.SetVerboseDatabaseStatements = true)
                   .Build())
            {
                var prepared = LuaScript.Prepare("redis.call('set', @key, @value)");
                db.ScriptEvaluate(prepared, new { key = (RedisKey)"mykey", value = 123 });

                var redisValue = db.StringGet("key1");

                Assert.False(redisValue.HasValue);

                bool set = db.StringSet("key1", value, TimeSpan.FromSeconds(60));

                Assert.True(set);

                redisValue = db.StringGet("key1");

                Assert.True(redisValue.HasValue);
                Assert.Equal(value, redisValue.ToString());
            }

            // Disposing SDK should flush the Redis profiling session immediately.

            Assert.Equal(11, activityProcessor.Invocations.Count);

            var scriptActivity = (Activity)activityProcessor.Invocations[1].Arguments[0];

            Assert.Equal("EVAL", scriptActivity.DisplayName);
            Assert.Equal("EVAL redis.call('set', ARGV[1], ARGV[2])", scriptActivity.GetTagValue(SemanticConventions.AttributeDbStatement));

            VerifyActivityData((Activity)activityProcessor.Invocations[3].Arguments[0], false, connection.GetEndPoints()[0], true);
            VerifyActivityData((Activity)activityProcessor.Invocations[5].Arguments[0], true, connection.GetEndPoints()[0], true);
            VerifyActivityData((Activity)activityProcessor.Invocations[7].Arguments[0], false, connection.GetEndPoints()[0], true);
            VerifySamplingParameters(sampler.LatestSamplingParameters);
        }
 /// <summary>
 /// 使用lua脚本模糊查询key后批量删除
 /// </summary>
 /// <param name="pattern"></param>
 public static void DeleteKeys(string pattern)
 {
     db.ScriptEvaluate(LuaScript.Prepare(
                           //Redis的keys模糊查询:
                           " local ks = redis.call('KEYS', @keypattern) " +                  //local ks为定义一个局部变量,其中用于存储获取到的keys
                           " for i=1,#ks,5000 do " +                                         //#ks为ks集合的个数, 语句的意思: for(int i = 1; i <= ks.Count; i+=5000)
                           "     redis.call('del', unpack(ks, i, math.min(i+4999, #ks))) " + //Lua集合索引值从1为起始,unpack为解包,获取ks集合中的数据,每次5000,然后执行删除
                           " end " +
                           " return true "),
                       new { keypattern = pattern + "*" });
 }
Example #12
0
        public string[] GetAllJSONKeysBySlideId(string value)
        {
            string script = "local data = redis.call('keys', '*" + value + "') " +
                            "local result = {} " +
                            "for i, item in ipairs(data) do " +
                            "result[i] = redis.call('json.get', data[i])  end " +
                            "return result ";
            LuaScript prepared = LuaScript.Prepare(script);

            return((string[])this.m_DataBase.ScriptEvaluate(prepared));
        }
Example #13
0
        private async Task CreateScriptsOnAllServers()
        {
            var luaScript = LuaScript.Prepare(Lua.PublishLatest);

            foreach (var endpoint in _connection.GetEndPoints())
            {
                var hostname = GetServerHostnameAndPort(endpoint);
                var server   = _connection.GetServer(hostname);
                _publishLatestScript = await luaScript.LoadAsync(server).ConfigureAwait(false);
            }
        }
Example #14
0
        public string[] GetAllStrings()
        {
            string script = "local data = redis.call('keys', '*') " +
                            "local result = {} " +
                            "for i, item in ipairs(data) do " +
                            "result[i] = data[i] .. ' ' .. redis.call('Get', data[i]) " +
                            "end " +
                            "return result ";
            LuaScript prepared = LuaScript.Prepare(script);

            return((string[])this.m_DataBase.ScriptEvaluate(prepared));
        }
Example #15
0
        public RedisResult[] GetAllHashes()
        {
            string script = "local data = redis.call('keys', '*') " +
                            "local result = {} " +
                            "for i, item in ipairs(data) do " +
                            "result[i] = redis.call('HGetAll', data[i]) " +
                            "end " +
                            "return result ";
            LuaScript prepared = LuaScript.Prepare(script);

            return((RedisResult[])this.m_DataBase.ScriptEvaluate(prepared));
        }
Example #16
0
        /// <summary>
        /// 获取指定通配的所有key
        /// </summary>
        /// <param name="pattern"></param>
        /// <returns></returns>
        public IList <string> GetAllKeysByScript(string pattern)
        {
            var keys        = new List <string>();
            var redisResult = _database.ScriptEvaluateAsync(LuaScript.Prepare(@" local res = redis.call('KEYS', @keypattern) " + " return res "), new { @keypattern = pattern + "*" }).GetAwaiter().GetResult();

            if (!redisResult.IsNull)
            {
                keys.AddRange((string[])redisResult);
            }

            return(keys);
        }
Example #17
0
        /// <summary>
        /// 模糊搜索Keys
        /// </summary>
        /// <param name="keyPattern"></param>
        /// <returns></returns>
        internal string[] KeySearch(string keyPattern)
        {
            var script      = "return redis.call('keys',@pattern)";
            var prepared    = LuaScript.Prepare(script);
            var redisResult = _db.ScriptEvaluate(prepared, new { pattern = keyPattern });

            if (redisResult.IsNull)
            {
                return(new string[0]);
            }
            return((string[])redisResult);
        }
Example #18
0
 /// <summary>
 /// 判断是否存在包含keyPattern的key
 /// </summary>
 /// <param name="keyPattern"></param>
 /// <returns></returns>
 public void ExistPatternKey(string keyPattern)
 {
     RedisHelper.Manager.GetDatabase().ScriptEvaluate(LuaScript.Prepare(
                                                          //Redis的keys模糊查询:
                                                          " local ks = redis.call('KEYS', @keypattern) " +                  //local ks为定义一个局部变量,其中用于存储获取到的keys
                                                          " for i=1,#ks,5000 do " +                                         //#ks为ks集合的个数, 语句的意思: for(int i = 1; i <= ks.Count; i+=5000)
                                                          "     redis.call('del', unpack(ks, i, math.min(i+4999, #ks))) " + //Lua集合索引值从1为起始,unpack为解包,获取ks集合中的数据,每次5000,然后执行删除
                                                          " end " +
                                                          " return true "
                                                          ),
                                                      new { keypattern = keyPattern });
 }
Example #19
0
        public async Task <List <string> > GetKeysAsync(string likeKey)
        {
            if (likeKey.IsNullOrEmpty())
            {
                throw new QKException("Redis Key 不能为空");
            }
            const string Script   = "return redis.call('KEYS', @key)";
            var          prepared = LuaScript.Prepare(Script);
            var          result   = (string[])await Db.ScriptEvaluateAsync(prepared, new { key = likeKey + "*" });

            return(result.ToList());
        }
        /// <inheritdoc />
        public async Task Init(CancellationToken cancellationToken)
        {
            var timer = Stopwatch.StartNew();

            try
            {
                if (_logger.IsEnabled(LogLevel.Debug))
                {
                    var initMsg = string.Format("Init: Name={0} ServiceId={1} DatabaseNumber={2} UseJson={3} DeleteOnClear={4}",
                                                _name, _serviceId, _options.DatabaseNumber, _options.UseJson, _options.DeleteOnClear);
                    _logger.LogDebug($"RedisGrainStorage {_name} is initializing: {initMsg}");
                }

                _redisOptions = ConfigurationOptions.Parse(_options.ConnectionString);
                _connection   = await ConnectionMultiplexer.ConnectAsync(_redisOptions);

                if (_options.DatabaseNumber.HasValue)
                {
                    _db = _connection.GetDatabase(_options.DatabaseNumber.Value);
                }
                else
                {
                    _db = _connection.GetDatabase();
                }

                _preparedWriteScript = LuaScript.Prepare(_writeScript);

                var loadTasks = new Task[_redisOptions.EndPoints.Count];
                for (int i = 0; i < _redisOptions.EndPoints.Count; i++)
                {
                    var endpoint = _redisOptions.EndPoints.ElementAt(i);
                    var server   = _connection.GetServer(endpoint);

                    loadTasks[i] = _preparedWriteScript.LoadAsync(server);
                }
                await Task.WhenAll(loadTasks);

                if (_logger.IsEnabled(LogLevel.Debug))
                {
                    timer.Stop();
                    _logger.LogDebug("Init: Name={0} ServiceId={1}, initialized in {2} ms",
                                     _name, _serviceId, timer.Elapsed.TotalMilliseconds.ToString("0.00"));
                }
            }
            catch (Exception ex)
            {
                timer.Stop();
                _logger.LogError(ex, "Init: Name={0} ServiceId={1}, errored in {2} ms. Error message: {3}",
                                 _name, _serviceId, timer.Elapsed.TotalMilliseconds.ToString("0.00"), ex.Message);
                throw ex;
            }
        }
Example #21
0
        /// <summary>
        /// Prepares the scripts.
        /// </summary>
        /// <param name="server">The server.</param>
        /// <exception cref="System.ArgumentNullException">server</exception>
        private void PrepareScripts(IServer server)
        {
            if (server == null)
            {
                throw new ArgumentNullException("server");
            }

            const string deleteKeyPrefixScript = "local keys = redis.call('keys', ARGV[1]) for i=1,#keys,5000 do redis.call('del', unpack(keys, i, math.min(i+4999, #keys))) end return keys";

            LuaScript deleteKeyPrefixPreparedScript = LuaScript.Prepare(deleteKeyPrefixScript);

            _deleteKeyPrefixScript = deleteKeyPrefixPreparedScript.Load(server);
        }
Example #22
0
        public void PurgeLuaScriptCache()
        {
            const string Script    = "redis.call('set', @PurgeLuaScriptCacheKey, @PurgeLuaScriptCacheValue)";
            var          first     = LuaScript.Prepare(Script);
            var          fromCache = LuaScript.Prepare(Script);

            Assert.IsTrue(object.ReferenceEquals(first, fromCache));

            LuaScript.PurgeCache();
            var shouldBeNew = LuaScript.Prepare(Script);

            Assert.IsFalse(object.ReferenceEquals(first, shouldBeNew));
        }
Example #23
0
        public void SimpleLua()
        {
            // ARRANGe
            const string Script   = "redis.call('set', @key, @value)";
            var          prepared = LuaScript.Prepare(Script);

            // ACT
            db.ScriptEvaluate(prepared, new { key = (RedisKey)"mykey", value = 123 });
            // ASSERT
            var value = db.StringGet("mykey");

            Assert.AreEqual("123", value.ToString());
        }
Example #24
0
 /// <summary>
 /// 模糊删除key
 /// </summary>
 /// <param name="pattern"></param>
 public static RedisResult KeyBatchDelete(string pattern)
 {
     pattern = MergeKey(pattern);
     return(GetDatabase().ScriptEvaluate(LuaScript.Prepare(
                                             //Redis的keys模糊查询:
                                             " local ks = redis.call('KEYS', @keypattern) " +                  //local ks为定义一个局部变量,其中用于存储获取到的keys
                                             " for i=1,#ks,5000 do " +                                         //#ks为ks集合的个数, 语句的意思: for(int i = 1; i <= ks.Count; i+=5000)
                                             "     redis.call('del', unpack(ks, i, math.min(i+4999, #ks))) " + //Lua集合索引值从1为起始,unpack为解包,获取ks集合中的数据,每次5000,然后执行删除
                                             " end " +
                                             " return true "
                                             ),
                                         new { keypattern = pattern }));//mykey*
 }
Example #25
0
 /// <summary> 批量删除 </summary>
 /// <param name="database"></param>
 /// <param name="pattern"></param>
 /// <param name="batch">批次</param>
 /// <returns></returns>
 public static async Task BatchDeleteAsync(this IDatabase database, string pattern, int batch = 5000)
 {
     await database.ScriptEvaluateAsync(LuaScript.Prepare(
                                            " local ks = redis.call('KEYS', @keypattern) " +
                                            " for i=1,#ks,@batch do " +
                                            "     redis.call('del', unpack(ks, i, math.min(i+@batch-1, #ks))) " + //Lua集合索引值从1为起始,unpack为解包,获取ks集合中的数据,每次5000,然后执行删除
                                            " end " +
                                            " return true "), new
     {
         keypattern = pattern,
         batch
     });
 }
Example #26
0
        public void SimpleLoadedLuaScript()
        {
            const string Script = "return @ident";

            using (var conn = Create(allowAdmin: true))
            {
                Skip.IfMissingFeature(conn, nameof(RedisFeatures.Scripting), f => f.Scripting);
                var server = conn.GetServer(TestConfig.Current.PrimaryServerAndPort);
                server.ScriptFlush();

                var prepared = LuaScript.Prepare(Script);
                var loaded   = prepared.Load(server);

                var db = conn.GetDatabase();

                {
                    var val = loaded.Evaluate(db, new { ident = "hello" });
                    Assert.Equal("hello", (string)val);
                }

                {
                    var val = loaded.Evaluate(db, new { ident = 123 });
                    Assert.Equal(123, (int)val);
                }

                {
                    var val = loaded.Evaluate(db, new { ident = 123L });
                    Assert.Equal(123L, (long)val);
                }

                {
                    var val = loaded.Evaluate(db, new { ident = 1.1 });
                    Assert.Equal(1.1, (double)val);
                }

                {
                    var val = loaded.Evaluate(db, new { ident = true });
                    Assert.True((bool)val);
                }

                {
                    var val = loaded.Evaluate(db, new { ident = new byte[] { 4, 5, 6 } });
                    Assert.True(new byte[] { 4, 5, 6 }.SequenceEqual((byte[])val));
                }

                {
                    var val = loaded.Evaluate(db, new { ident = new ReadOnlyMemory <byte>(new byte[] { 4, 5, 6 }) });
                    Assert.True(new byte[] { 4, 5, 6 }.SequenceEqual((byte[])val));
                }
            }
        }
Example #27
0
        internal Consumer(RingBuffer queue, ConsumerOptions options = null)
        {
            Queue = queue;

            if (options == null)
            {
                options = new ConsumerOptions();
            }

            _options = options;
            _subscriptionPositionKey = Queue.DbKey.GetSubscriptionKey(_options.SubscriptionId);

            _script = LuaScript.Prepare(ScriptPreprocessor(File.ReadAllText("Scripts/consume.lua"))).Load(Queue.Server);
        }
        private LoadedLuaScript LoadScript(string script)
        {
            var             preparedScript = LuaScript.Prepare(script);
            LoadedLuaScript loadedScript   = null;

            // load script on all servers
            // note: only need to store single instance of loaded script as it is a wrapper around the original prepared script
            foreach (var server in _redis.Value.GetEndPoints().Select(x => _redis.Value.GetServer(x)))
            {
                loadedScript = preparedScript.Load(server);
            }

            return(loadedScript);
        }
Example #29
0
        /// <summary>
        /// 查百科
        /// </summary>
        /// <param name="question">关键词</param>
        /// <returns></returns>
        public void GetWiki(string question, IMessageBuilder builder)
        {
            try
            {
                if (_db.KeyType(question).Equals(RedisType.String))
                {
                    builder.AddPlainMessage(_db.StringGet(question));
                }
                else if (_db.KeyType(question).Equals(RedisType.Hash))
                {
                    RedisValue[] kv = _db.HashValues(question);
                    foreach (var item in kv)
                    {
                        var answer = JsonConvert.DeserializeObject <MsgModel>(item);
                        if (answer.type == PlainMessage.MsgType)
                        {
                            builder.AddPlainMessage(answer.content);
                        }
                        else if (answer.type == ImageMessage.MsgType)
                        {
                            builder.AddImageMessage(url: answer.content);
                        }
                    }
                }
                else
                {
                    //未找到的提示信息
                    builder.AddPlainMessage(string.Format(_command["WikiCommand:NotFound"], _command["WikiCommand:Add"]) + "\r\n");

                    #region 相似词汇提醒
                    //redis模糊查询, redis-cli:keys *{question}*
                    var redisResult = _db.ScriptEvaluate(LuaScript.Prepare(
                                                             //Redis的keys模糊查询:
                                                             " local res = redis.call('KEYS', @keypattern) return res "), new { @keypattern = $"*{question}*" });
                    if (!redisResult.IsNull)
                    {
                        builder.AddPlainMessage("===以下为相似关键词===\r\n");
                        foreach (var dic in (string[])redisResult)
                        {
                            builder.AddPlainMessage($" {dic}\r\n");
                        }
                    }
                    #endregion
                }
            }
            catch
            {
            }
        }
        public List <string> SetScan(string key, int cursor, string pattern, int count)
        {
            List <string> list   = new List <string>();
            var           result = db.ScriptEvaluate(LuaScript.Prepare("return redis.call('SSCAN',@key,@cursor,'MATCH',@pattern,'COUNT',@count)"), new { key = key, cursor = cursor, pattern = pattern, count = count });

            if (!result.IsNull)
            {
                var vals = ((StackExchange.Redis.RedisResult[])((StackExchange.Redis.RedisResult[])result)[1]);
                foreach (var item in vals)
                {
                    list.Add(item.ToString());
                }
            }
            return(list);
        }