コード例 #1
0
        /// <summary>
        /// Retrieves a range of elements from the specified stream
        /// </summary>
        /// <param name="streamName">Name of the stream</param>
        /// <param name="start">The identifier or timestamp in ms of the range start</param>
        /// <param name="end">The identifier or timestamp in ms of the range end</param>
        /// <returns></returns>
        public List <RedisStreamEntry> XRange(RedisValue streamName, RedisValue?start, RedisValue?end)
        {
            if (!start.HasValue && !end.HasValue)
            {
                //Return all results
                start = "-";
                end   = "+";
            }
            //If only a single value is provided, assume they are targeting a single record
            else if (start.HasValue && !end.HasValue)
            {
                end = start;
            }
            else if (!start.HasValue)
            {
                start = end;
            }

            List <RedisStreamEntry> entries = new List <RedisStreamEntry>();
            var res = _redisDb.Execute("XRANGE", streamName, start, end);

            foreach (RedisResult[] item in (RedisResult[])res)
            {
                var keyValue = (RedisResult[])item[1];
                entries.Add(new RedisStreamEntry
                {
                    Id    = item[0],
                    Key   = keyValue[0],
                    Value = keyValue[1]
                });
            }

            return(entries);
        }
コード例 #2
0
        /// <inheritdoc />
        public async Task <object?> GetHashFieldAsync(string hashKey, string fieldKey)
        {
            RedisValue?value = await ExecuteRedisCommandAsync(() =>
            {
                IDatabase db = GetRedisDatabase();
                return(db.HashGetAsync(hashKey, fieldKey));
            });

            if ((value == null) || value.Value.IsNullOrEmpty || string.IsNullOrWhiteSpace(value.Value.ToString()))
            {
                return(null);
            }
            else
            {
                if (value.Value.TryParse(out long lngval))
                {
                    return(lngval);
                }
                else if (value.Value.TryParse(out double dblval))
                {
                    return(dblval);
                }
                else
                {
                    return(value.Value.ToString());
                }
            }
        }
コード例 #3
0
        /// <summary>
        /// Appends an element to the specified stream
        /// </summary>
        /// <param name="streamName">Name of the stream</param>
        /// <param name="id">Explicit identifier and instance number for the entry in the stream (ie:1523598632996-0) </param>
        /// <param name="key">The key for the entry</param>
        /// <param name="value">The value for the entry</param>
        /// <returns>The identifier of the element that was appended to the stream</returns>
        public RedisResult XAdd(RedisValue streamName, RedisValue?id, RedisValue key, RedisValue value)
        {
            if (!id.HasValue)
            {
                id = "*"; //Auto assign id
            }
            Debug.Assert(id != null, nameof(id) + " != null");

            return(_redisDb.Execute("XADD", streamName, id.Value, key, value));
        }
コード例 #4
0
 public ListCondition(RedisKey key, long index, bool expectedResult, RedisValue?expectedValue)
 {
     if (key.IsNull)
     {
         throw new ArgumentException(nameof(key));
     }
     this.key            = key;
     this.index          = index;
     this.expectedResult = expectedResult;
     this.expectedValue  = expectedValue;
 }
コード例 #5
0
        private static async Task ReceiveEvents(IDatabase db, CancellationToken cancel)
        {
            const int  STEPS  = 40;
            const char FILLER = ' ';

            var SPACING      = new string(' ', 50);
            var FULLY_FILLED = new string(FILLER, STEPS) + FILLER;

            await Task.Run(async() =>
            {
                RedisValue?minID = null;
                while (!cancel.IsCancellationRequested)
                {
                    // return next N elements, depending on order and minID
                    var processed = 0;
                    foreach (var entry in await db.StreamRangeAsync(STREAM_NAME, minID, null, 10))
                    {
                        // extract and format the data
                        var cpu = -1;
                        var sb  = new StringBuilder();
                        sb.AppendFormat("{0}:", entry.Id);
                        foreach (var value in entry.Values)
                        {
                            sb.AppendFormat(" {0} = {1} ", value.Name, value.Value);
                            if (value.Name.Equals("CPU"))
                            {
                                int.TryParse(value.Value, out cpu);
                            }
                        }

                        // first print the CPU graph, then write the textual data line
                        if (cpu >= 0)
                        {
                            var count = (int)(1.0 * cpu *STEPS / 100.0);
                            Console.Write("{0}|{1}|{2,3} %\r", SPACING, FULLY_FILLED, cpu);
                            Console.Write("{0}|{1}*\r", SPACING, new string(FILLER, count));
                        }
                        Console.WriteLine(sb.ToString());

                        // increment to get the next entry
                        minID = entry.Id + "1";
                        ++processed;
                    }

                    // nbo data, so trim the stream and wait for more
                    if (processed == 0)
                    {
                        await db.StreamTrimAsync(STREAM_NAME, 32);
                        await Task.Delay(200);
                    }
                }
            }, cancel);
        }
コード例 #6
0
        private RedisValue Increment(RedisValue?position)
        {
            if (position == null || position == StreamPosition.Beginning)
            {
                return(StreamPosition.Beginning);
            }

            var key   = position.ToString().Split("-");
            int count = int.Parse(key[1]);

            count++;
            return(key[0] + "-" + count.ToString());
        }
コード例 #7
0
ファイル: RedisUtils.cs プロジェクト: bw2015/SP.StudioCore
        public static IEnumerable <HashEntry> ToHash <T>(this T obj) where T : struct
        {
            IEnumerable <FieldInfo> fields = obj.GetType().GetFields();

            foreach (FieldInfo field in fields.Where(t => t.IsPublic))
            {
                RedisValue?value = field.GetValue(obj)?.GetRedisValue();
                if (value == null)
                {
                    continue;
                }
                yield return(new HashEntry(field.Name, value.Value));
            }
        }
コード例 #8
0
        /// <inheritdoc />
        public async Task <string> GetListElementAtIndexAsync(string key, long index)
        {
            RedisValue?val = await ExecuteRedisCommandAsync(() =>
            {
                IDatabase db = GetRedisDatabase();
                return(db.ListGetByIndexAsync(key, index));
            });

            if ((val == null) || val.Value.IsNullOrEmpty || string.IsNullOrWhiteSpace(val.Value.ToString()))
            {
                throw new ArgumentException($"No element found at index {index}");
            }
            else
            {
                return(val.Value.ToString());
            }
        }
コード例 #9
0
        private async static Task CheckPendingMessages(CancellationToken cancel)
        {
            Console.WriteLine("Checking pending messages ...");
            const int ALLOWED_IDLE_MSEC = 1 * 60 * 1000;

            bool       bMoreData = true;
            RedisValue?nextMsg   = null;

            while (bMoreData)
            {
                bMoreData = false;
                foreach (var msg in await db.StreamPendingMessagesAsync(STREAM_NAME, Group, 10, RedisValue.Null, nextMsg))
                {
                    LastConsumedMsgID = msg.MessageId;
                    nextMsg           = LastConsumedMsgID + "1"; // continue with next one
                    bMoreData         = true;
                    Console.Write('.');

                    // try to claim it, checking against ALLOWED_IDLE_MSEC
                    var entries = await db.StreamClaimAsync(STREAM_NAME, Group, Consumer, ALLOWED_IDLE_MSEC, new RedisValue[1] {
                        LastConsumedMsgID.Value
                    });

                    foreach (var entry in entries)
                    {
                        if (!entry.IsNull)  // something to process
                        {
                            Console.Write('\r');
                            await ProcessMessageAsync(entry, cancel);
                        }
                        else
                        {
                            Console.WriteLine("\r- {0} left pending", LastConsumedMsgID.Value);
                        }
                    }
                }
            }
        }
コード例 #10
0
        private void AssertConversionEqual <T>(RedisTypeConverter converter, T value,
                                               RedisValue?expectedRedisValue = null)
        {
            // check from(to(V)) == V (explicit type version)
            var rv1 = converter.GetToRedisValueFunc <T>()(value);
            var nv1 = converter.GetFromRedisValueFunc <T>()(rv1);

            Assert.Equal(value, nv1);

            // check from(to(V)) == V (object type version)
            var rv2 = converter.GetToRedisValueFunc(typeof(T))(value);
            var nv2 = converter.GetFromRedisValueFunc(typeof(T))(rv2);

            Assert.Equal(value, nv2);

            // check to1(V) == to2(V)
            Assert.Equal(rv1, rv2);

            if (expectedRedisValue != null)
            {
                Assert.Equal(expectedRedisValue.Value, rv1);
            }
        }
コード例 #11
0
 StreamPendingMessageInfo[] IDatabase.StreamPendingMessages(RedisKey key, RedisValue groupName, int count, RedisValue consumerName, RedisValue?minId, RedisValue?maxId, CommandFlags flags)
 => Multiplexer.Wait(((IDatabaseAsync)this).StreamPendingMessagesAsync(key, groupName, count, consumerName, minId, maxId, flags));
コード例 #12
0
 public RedisStreamEntry[] StreamRange(RedisKey key, RedisValue?minId = null, RedisValue?maxId = null, int?count = null, Order order = Order.Ascending, CommandFlags flags = CommandFlags.None)
 {
     return(Inner.StreamRange(ToInner(key), minId, maxId, count, order, flags));
 }
コード例 #13
0
 public Task <StreamEntry[]> StreamReadGroupAsync(RedisKey key, RedisValue groupName, RedisValue consumerName, RedisValue?position, int?count, CommandFlags flags)
 {
     return(Inner.StreamReadGroupAsync(ToInner(key), groupName, consumerName, position, count, flags));
 }
コード例 #14
0
 public Task <StreamPendingMessageInfo[]> StreamPendingMessagesAsync(RedisKey key, RedisValue groupName, int count, RedisValue consumerName, RedisValue?minId = null, RedisValue?maxId = null, CommandFlags flags = CommandFlags.None)
 {
     return(Inner.StreamPendingMessagesAsync(ToInner(key), groupName, count, consumerName, minId, maxId, flags));
 }
コード例 #15
0
 public Task <bool> StreamCreateConsumerGroupAsync(RedisKey key, RedisValue groupName, RedisValue?position, CommandFlags flags)
 {
     return(Inner.StreamCreateConsumerGroupAsync(ToInner(key), groupName, position, flags));
 }
コード例 #16
0
 public StreamEntry[] StreamReadGroup(RedisKey key, RedisValue groupName, RedisValue consumerName, RedisValue?position = null, int?count = null, CommandFlags flags = CommandFlags.None)
 {
     return(Inner.StreamReadGroup(ToInner(key), groupName, consumerName, position, count, flags));
 }
コード例 #17
0
 public RedisValue StreamAdd(RedisKey key, RedisValue streamField, RedisValue streamValue, RedisValue?messageId = null, int?maxLength = null, bool useApproximateMaxLength = false, CommandFlags flags = CommandFlags.None)
 {
     return(Inner.StreamAdd(ToInner(key), streamField, streamValue, messageId, maxLength, useApproximateMaxLength, flags));
 }
コード例 #18
0
 bool IDatabase.StreamCreateConsumerGroup(RedisKey key, RedisValue groupName, RedisValue?position, bool createStream, CommandFlags flags)
 => Multiplexer.Wait(((IDatabaseAsync)this).StreamCreateConsumerGroupAsync(key, groupName, position, createStream, flags));
コード例 #19
0
 RedisValue IDatabase.StreamAdd(RedisKey key, NameValueEntry[] streamPairs, RedisValue?messageId, int?maxLength, bool useApproximateMaxLength, CommandFlags flags)
 => Multiplexer.Wait(((IDatabaseAsync)this).StreamAddAsync(key, streamPairs, messageId, maxLength, useApproximateMaxLength, flags));
コード例 #20
0
 RedisValue IDatabase.StreamAdd(RedisKey key, RedisValue streamField, RedisValue streamValue, RedisValue?messageId, int?maxLength, bool useApproximateMaxLength, CommandFlags flags)
 => Multiplexer.Wait(((IDatabaseAsync)this).StreamAddAsync(key, streamField, streamValue, messageId, maxLength, useApproximateMaxLength, flags));
コード例 #21
0
 public bool StreamCreateConsumerGroup(RedisKey key, RedisValue groupName, RedisValue?position = null, CommandFlags flags = CommandFlags.None)
 {
     return(Inner.StreamCreateConsumerGroup(ToInner(key), groupName, position, flags));
 }
コード例 #22
0
 StreamEntry[] IDatabase.StreamRange(RedisKey key, RedisValue?minId, RedisValue?maxId, int?count, Order messageOrder, CommandFlags flags)
 => Multiplexer.Wait(((IDatabaseAsync)this).StreamRangeAsync(key, minId, maxId, count, messageOrder, flags));
コード例 #23
0
 public Task <RedisValue> StreamAddAsync(RedisKey key, NameValueEntry[] streamPairs, RedisValue?messageId = null, int?maxLength = null, bool useApproximateMaxLength = false, CommandFlags flags = CommandFlags.None)
 {
     return(Inner.StreamAddAsync(ToInner(key), streamPairs, messageId, maxLength, useApproximateMaxLength, flags));
 }
コード例 #24
0
 StreamEntry[] IDatabase.StreamReadGroup(RedisKey key, RedisValue groupName, RedisValue consumerName, RedisValue?position, int?count, bool noAck, CommandFlags flags)
 => Multiplexer.Wait(((IDatabaseAsync)this).StreamReadGroupAsync(key, groupName, consumerName, position, count, noAck, flags));
コード例 #25
0
 public Task <bool> StreamCreateConsumerGroupAsync(RedisKey key, RedisValue groupName, RedisValue?position = null, bool createStream = true, CommandFlags flags = CommandFlags.None)
 {
     return(Inner.StreamCreateConsumerGroupAsync(ToInner(key), groupName, position, createStream, flags));
 }
コード例 #26
0
 public Task <RedisValue> StreamAddAsync(RedisKey key, RedisValue streamField, RedisValue streamValue, RedisValue?messageId = null, int?maxLength = null, bool useApproximateMaxLength = false, CommandFlags flags = CommandFlags.None)
 {
     return(this.db.StreamAddAsync(key, streamField, streamValue, messageId, maxLength, useApproximateMaxLength, flags));
 }
コード例 #27
0
 public Task <StreamEntry[]> StreamRangeAsync(RedisKey key, RedisValue?minId = null, RedisValue?maxId = null, int?count = null, Order messageOrder = Order.Ascending, CommandFlags flags = CommandFlags.None)
 {
     return(Inner.StreamRangeAsync(ToInner(key), minId, maxId, count, messageOrder, flags));
 }
コード例 #28
0
 public Task <bool> StreamCreateConsumerGroupAsync(RedisKey key, RedisValue groupName, RedisValue?position = null, CommandFlags flags = CommandFlags.None)
 {
     return(this.db.StreamCreateConsumerGroupAsync(key, groupName, position, flags));
 }
コード例 #29
0
 public Task <StreamEntry[]> StreamReadGroupAsync(RedisKey key, RedisValue groupName, RedisValue consumerName, RedisValue?position = null, int?count = null, bool noAck = false, CommandFlags flags = CommandFlags.None)
 {
     return(Inner.StreamReadGroupAsync(ToInner(key), groupName, consumerName, position, count, noAck, flags));
 }
コード例 #30
0
 public Task <StreamEntry[]> StreamReadGroupAsync(RedisKey key, RedisValue groupName, RedisValue consumerName, RedisValue?position = null, int?count = null, CommandFlags flags = CommandFlags.None)
 {
     return(this.db.StreamReadGroupAsync(key, groupName, consumerName, position, count, flags));
 }