Beispiel #1
0
        public void StreamAddMultipleValuePairsWithManualId()
        {
            var id  = "42-0";
            var key = GetUniqueKey("manual_id_multiple_values");

            using (var conn = Create())
            {
                Skip.IfMissingFeature(conn, nameof(RedisFeatures.Streams), r => r.Streams);

                var db = conn.GetDatabase();

                var fields = new NameValueEntry[]
                {
                    new NameValueEntry("field1", "value1"),
                    new NameValueEntry("field2", "value2")
                };

                var messageId = db.StreamAdd(key, fields, id);
                var entries   = db.StreamRange(key);

                Assert.Equal(id, messageId);
                Assert.NotNull(entries);
                Assert.True(entries.Length == 1);
                Assert.Equal(id, entries[0].Id);
            }
        }
Beispiel #2
0
        public async Task when_create_event_then_its_in_item_detail_view(Guid id, string itemName)
        {
            string json       = $"{{\"Id\": \"{id}\",\"Name\": \"{itemName}\", \"Version\": 0}}";
            var    streamName = $"inventory-InventoryItemLogic{id}";
            var    jsonBytes  = Encoding.UTF8.GetBytes(json);
            var    eventData  = new NameValueEntry[]
            {
                new NameValueEntry("id", Guid.NewGuid().ToString()),
                new NameValueEntry("type", "SimpleCQRS.InventoryItemCreated"),
                new NameValueEntry("msg", jsonBytes),
                new NameValueEntry("partition", string.Empty),
                new NameValueEntry("metadata", string.Empty)
            };
            var result = await connection.StreamAddAsync(streamName, eventData);

            await connection.StreamAddAsync("$ce-inventory", new NameValueEntry[]
            {
                new NameValueEntry("stream", streamName),
                new NameValueEntry("key", result),
            });

            await Task.Delay(sleepMillisecondsDelay);

            using var response = await client.GetAsync($"items/{id}");

            var jsonResponse = await client.GetStringAsync($"items/{id}");

            dynamic itemDetail = JsonConvert.DeserializeObject <System.Dynamic.ExpandoObject>(jsonResponse);

            Assert.Equal(id.ToString(), itemDetail.id);
            Assert.Equal(itemName, itemDetail.name);
        }
Beispiel #3
0
        protected override async Task ExecuteAsync(CancellationToken cancellationToken)
        {
            var counter = 0L;

            await foreach (var price in _priceGeneratorSvc.GetPricesAsync(cancellationToken))
            {
                if (cancellationToken.IsCancellationRequested)
                {
                    break;
                }
                if (false)
                {
                    var message = $"{price.symbol} is {price.bid}/{price.offer} at {price.date}";
                    _logger.LogInformation("latest {symol} price sent at {utcNow}, {message}", price.symbol, DateTime.UtcNow, message);
                    _redisCacheSvc.subscriber.Publish("messages", message);
                    await Task.Delay(1000, cancellationToken);
                }
                else
                {
                    //var message = $"hello at {DateTime.UtcNow}";
                    //_logger.LogInformation("Message sent at {utcNow}, {message}", DateTime.UtcNow, message);

                    //var messageId = _redisCacheSvc.db.StreamAdd(streamKey, "foo_name", "bar_value");

                    //var values = new[]
                    //{
                    //    new NameValueEntry("sensor_id", "1234"),
                    //    new NameValueEntry("temp", "19.8")
                    //};
                    //var messageId2 = _redisCacheSvc.db.StreamAdd("sensor_stream", values);

                    //_logger.LogInformation("Streams updated at {utcNow}", DateTime.UtcNow);
                    //await Task.Delay(10, stoppingToken);

                    //which is fastest?
                    _ = _redisCacheSvc.db.StreamAdd(Globals.streamKey, nameof(price.symbol), price.symbol);

                    _ = _redisCacheSvc.db.StreamAdd(Globals.streamKey, nameof(price.symbol), price.symbol, flags: CommandFlags.FireAndForget);

                    _ = await _redisCacheSvc.db.StreamAddAsync(Globals.streamKey, nameof(price.symbol), price.symbol);

                    var streamPairs = new NameValueEntry[3]
                    {
                        new NameValueEntry("s", price.symbol),
                        new NameValueEntry("b", price.bid),
                        new NameValueEntry("a", price.offer)
                    };
                    _ = await _redisCacheSvc.db.StreamAddAsync(Globals.streamKey, streamPairs, flags : CommandFlags.FireAndForget);
                }
                counter++;
                if (counter % 1000 == 0)
                {
                    _logger.LogInformation("{counter} records at {utcNow}", counter, DateTime.UtcNow);
                }
                if (counter % 1_000_000 == 0)
                {
                    break;
                }
            }
        }
Beispiel #4
0
        public void StreamAdd_2()
        {
            var fields = new NameValueEntry[0];

            wrapper.StreamAdd("key", fields, "*", 1000, true, CommandFlags.HighPriority);
            mock.Verify(_ => _.StreamAdd("prefix:key", fields, "*", 1000, true, CommandFlags.HighPriority));
        }
Beispiel #5
0
        public async Task SendMessage(MessageDTO message)
        {
            var values = new NameValueEntry[]
            {
                new NameValueEntry("clientuniqueid", message.clientuniqueid),
                new NameValueEntry("sender_username", message.senderUsername),
                new NameValueEntry("receiver_id", message.receiverId),
                new NameValueEntry("receiver_username", message.receiverUsername),
                new NameValueEntry("type", message.type),
                new NameValueEntry("message", message.message),
                new NameValueEntry("date", message.date.ToString()),
            };
            IDatabase redisDB = _redisConnection.GetDatabase();
            string    fromUsername;
            string    toUsername;
            int       proba = string.Compare(message.senderUsername, message.receiverUsername);

            if (proba > 0)
            {
                fromUsername = message.receiverUsername;
                toUsername   = message.senderUsername;
            }
            else
            {
                fromUsername = message.senderUsername;
                toUsername   = message.receiverUsername;
            }
            await redisDB.StreamAddAsync($"messages:{fromUsername}:{toUsername}:chat", values);
        }
Beispiel #6
0
        public void StreamAddMultipleValuePairsWithAutoId()
        {
            using (var conn = Create())
            {
                Skip.IfMissingFeature(conn, nameof(RedisFeatures.Streams), r => r.Streams);

                var key = GetUniqueKey("multiple_value_pairs");

                var fields = new NameValueEntry[]
                {
                    new NameValueEntry("field1", "value1"),
                    new NameValueEntry("field2", "value2")
                };

                var db        = conn.GetDatabase();
                var messageId = db.StreamAdd(key, fields);

                var entries = db.StreamRange(key);

                Assert.True(entries.Length == 1);
                Assert.Equal(messageId, entries[0].Id);
                Assert.True(entries[0].Values.Length == 2);
                Assert.True(entries[0].Values[0].Name == "field1" &&
                            entries[0].Values[0].Value == "value1");
                Assert.True(entries[0].Values[1].Name == "field2" &&
                            entries[0].Values[1].Value == "value2");
            }
        }
Beispiel #7
0
        public async Task SendFriendRequest(int senderId, int receiverId, Request sender)
        {
            string channelName = $"messages:{receiverId}:friend_request";

            var values = new NameValueEntry[]
            {
                new NameValueEntry("sender_id", senderId),
                new NameValueEntry("sender_first_name", sender.FirstName),
                new NameValueEntry("sender_last_name", sender.LastName),
                new NameValueEntry("sender_email", sender.Email),
                new NameValueEntry("sender_profile_picture_path", sender.ProfilePicturePath),
            };

            IDatabase redisDB   = _redisConnection.GetDatabase();
            var       messageId = await redisDB.StreamAddAsync(channelName, values);

            //Dodatna funkcija
            await redisDB.SetAddAsync("friend:" + senderId + ":request", receiverId);

            // objekat za notifikaciju
            FriendRequestNotificationDTO message = new FriendRequestNotificationDTO
            {
                ReceiverId = receiverId,
                RequestDTO = new RequestDTO {
                    Id = messageId, Request = sender
                }
            };

            //Push notifikacija
            var         jsonMessage = JsonSerializer.Serialize(message);
            ISubscriber chatPubSub  = _redisConnection.GetSubscriber();
            await chatPubSub.PublishAsync("friendship.requests", jsonMessage);
        }
Beispiel #8
0
        public void StreamAddAsync_2()
        {
            var fields = new NameValueEntry[0];

            wrapper.StreamAddAsync("key", fields, "*", 1000, true, CommandFlags.None);
            mock.Verify(_ => _.StreamAddAsync("prefix:key", fields, "*", 1000, true, CommandFlags.None));
        }
Beispiel #9
0
        public async Task when_create_event_then_its_in_list_view(Guid id, string itemName)
        {
            string json       = $"{{\"Id\": \"{id}\",\"Name\": \"{itemName}\", \"Version\": 0}}";
            var    jsonBytes  = Encoding.UTF8.GetBytes(json);
            var    streamName = $"inventory-InventoryItemLogic{id}";
            var    eventData  = new NameValueEntry[]
            {
                new NameValueEntry("id", Guid.NewGuid().ToString()),
                new NameValueEntry("type", "SimpleCQRS.InventoryItemCreated"),
                new NameValueEntry("msg", jsonBytes),
                new NameValueEntry("partition", string.Empty),
                new NameValueEntry("metadata", string.Empty)
            };
            var result = await connection.StreamAddAsync(streamName, eventData);

            await connection.StreamAddAsync("$ce-inventory", new NameValueEntry[]
            {
                new NameValueEntry("stream", streamName),
                new NameValueEntry("key", result),
            });

            await Task.Delay(sleepMillisecondsDelay *2);

            var response = await client.GetStringAsync("items/");

            //We dont test json convert and .net core mvc conversion, end to end tests will cover that as well.
            // just that the test doest break as schema is changed
            Assert.Contains(id.ToString(), response);
            Assert.Contains(itemName.ToString(), response);
        }
Beispiel #10
0
        public async Task SendFriendRequest(int senderId, int receiverId, Request sender)
        {
            string channelName = $"messages:{receiverId}:friend_request";

            var values = new NameValueEntry[]
            {
                new NameValueEntry("sender_id", senderId),
                new NameValueEntry("sender_first_name", sender.FirstName),
                new NameValueEntry("sender_last_name", sender.LastName),
                new NameValueEntry("sender_username", sender.Username)
            };

            IDatabase redisDB   = _redisConnection.GetDatabase();
            var       messageId = await redisDB.StreamAddAsync(channelName, values);

            await redisDB.SetAddAsync("friend:" + senderId + ":request", receiverId);

            FriendRequestNotificationDTO message = new FriendRequestNotificationDTO
            {
                ReceiverId     = receiverId,
                IdNotification = messageId,
                Request        = sender
            };
            var         jsonMessage     = JsonSerializer.Serialize(message);
            ISubscriber pubNotification = _redisConnection.GetSubscriber();
            await pubNotification.PublishAsync("friendship.requests", jsonMessage);
        }
Beispiel #11
0
 public async Task SendNotification(NotificationDTO notiffication)
 {
     var values = new NameValueEntry[]
     {
         new NameValueEntry("sender_username", notiffication.SenderUsername),
         new NameValueEntry("receiver_username", notiffication.ReceiverUsername),
         new NameValueEntry("message", notiffication.Message),
     };
     IDatabase redisDB = _redisConnection.GetDatabase();
     await redisDB.StreamAddAsync($"notification:{notiffication.SenderUsername}:{notiffication.ReceiverUsername}:reservation", values);
 }
Beispiel #12
0
        public async Task PublishMessageToStreamAsync(string messageKey)
        {
            var messages = new NameValueEntry[1];

            for (int i = 0; i < 1; i++)
            {
                messages[i] = new NameValueEntry(messageKey, i);
            }
            var messageId = await _db.StreamAddAsync(ZikeyStream, messages);

            System.Console.WriteLine("messageId:{0}", messageId);
        }
        public async Task <IActionResult> Withdraw()
        {
            // db.StreamCreateConsumerGroup("bank-consumer", "bank-consumer",  StreamPosition.NewMessages);

            var values = new NameValueEntry[]
            {
                new NameValueEntry("date", DateTime.Now.ToString())
            };

            var messageId = await _database.StreamAddAsync("bank-consumer", values, flags : CommandFlags.FireAndForget);

            return(Ok());
        }
        /// <summary>
        /// Sends raw announcement.
        /// </summary>
        /// <param name="payload">The raw announcement data.</param>
        /// <returns>
        /// Return the message id
        /// </returns>
        public async ValueTask <string> SendAsync(Announcement payload)
        {
            IDatabaseAsync db = await _dbTask;

            Metadata meta = payload.Metadata;
            string   id   = meta.MessageId;

            #region var entries = new NameValueEntry[]{...}

            // local method
            NameValueEntry KV(RedisValue key, RedisValue value) => new NameValueEntry(key, value);

            var entries = new NameValueEntry[]
            {
                KV(nameof(meta.MessageId), id),
                KV(nameof(meta.Operation), meta.Operation),
                KV(nameof(meta.ProducedAt), meta.ProducedAt.ToUnixTimeSeconds())
            };

            #endregion // var entries = new NameValueEntry[]{...}

            // TODO: [bnaya 2021-01] enable to replace the segments storage without replacing the strweam

            #region await db.HashSetAsync($"Segments~{id}", segmentsEntities)

            var segmentsEntities = payload.Segments
                                   .Select(sgm =>
                                           new HashEntry(sgm.Key, sgm.Value))
                                   .ToArray();
            await db.HashSetAsync($"Segments~{id}", segmentsEntities);

            #endregion // await db.HashSetAsync($"Segments~{id}", segmentsEntities)

            #region await db.HashSetAsync($"Interceptors~{id}", interceptionsEntities)

            var interceptionsEntities = payload.InterceptorsData
                                        .Select(spt =>
                                                new HashEntry(spt.Key, spt.Value))
                                        .ToArray();
            await db.HashSetAsync($"Interceptors~{id}", interceptionsEntities);

            #endregion // await db.HashSetAsync($"Interceptors~{id}", interceptionsEntities)

            RedisValue messageId = await _resiliencePolicy.ExecuteAsync(() =>
                                                                        db.StreamAddAsync(meta.Key(), entries,
                                                                                          flags: CommandFlags.DemandMaster));


            return(messageId);
        }
Beispiel #15
0
        static async Task Main(string[] args)
        {
            var connectionMultiplexer = await ConnectionMultiplexer.ConnectAsync("127.0.0.1");

            var redisDb = connectionMultiplexer.GetDatabase(1);

            if (redisDb == null)
            {
                throw new ApplicationException("Could not establish connection with the Redis database");
            }

            while (true)
            {
                var newPrivateKeyBytes = new Bitcoin().GenerateBitcoinKeyByte();

                var value = Convert.ToBase64String(newPrivateKeyBytes);
                var key   = $"Phase0:Worker1:{value}";

                var streamValue = new NameValueEntry[1];
                streamValue[0] = new NameValueEntry(key, value);

                await redisDb
                .StreamAddAsync("Phase0", streamValue)
                .ConfigureAwait(false);

                // var verifiedKey = Convert.FromBase64String(key);
            }

            // var random = PrivateKey.CreatePrivateKey(Globals.ProdDumpKeyVersion);
            // var seedBytes = random.PrivateKeyBytes;

            // //create a private key using seedBytes and not supplying compressedPublicKey which by default forces the public key to be compressed
            // var pkCompressed = new PrivateKey(Globals.ProdDumpKeyVersion, seedBytes);
            // //get the wif encoded string that represents the pkCompressed private key
            // var wifCompressed = pkCompressed.WIFEncodedPrivateKeyString;
            // //here we can create a bitcoin address string using the public key ascociated with our private key
            // var bitcoinAddressCompressed = BitcoinAddress.GetBitcoinAdressEncodedStringFromPublicKey(pkCompressed.PublicKey);

            // //create a private key using seedBytes which forces the public key to be compressed and supplying compressedPublicKey as false so the public key will not be compressed
            // var pkNotCompressed = new PrivateKey(Globals.ProdDumpKeyVersion, seedBytes, false);
            // var wif = pkNotCompressed.WIFEncodedPrivateKeyString;
            // var bitcoinAddress = BitcoinAddress.GetBitcoinAdressEncodedStringFromPublicKey(pkNotCompressed.PublicKey);

            // Console.WriteLine($"{bitcoinAddressCompressed} | {random.ToString()}");
            // Console.WriteLine($"{bitcoinAddress} | {wif}");
        }
Beispiel #16
0
        private async Task HandleRequest(string metricName, long value)
        {
            var redisDb = conn.GetDatabase(DBNbr);

            var currentTimeStampInMicroseconds = TimeStampProvider.GetCurrentTimeStamp(TimePrecisionUnit.Microseconds);

            // Decide in which consumer we should put this metric
            var metricConsumerName = await GetMetricConsumer(conn, metricName, currentTimeStampInMicroseconds);

            // Put the metric value into the consumer's stream
            var nameValueEntry = new NameValueEntry[] {
                new NameValueEntry("metricName", metricName),
                new NameValueEntry("value", value),
                new NameValueEntry("time", currentTimeStampInMicroseconds),
            };
            await redisDb.StreamAddAsync("stream:" + metricConsumerName, nameValueEntry);
        }
        /// <summary>
        /// Converts a Redis Event Stream Entry event into our abstraction
        /// </summary>
        internal EventMessage(string id, NameValueEntry value)
        {
            string[]       idParts         = ((string)id).Split('-');
            long           enqueuedUnixMs  = long.Parse(idParts[0]);
            long           sequenceNumber  = long.Parse(idParts[1]);
            DateTimeOffset enqueuedTimeUtc = DateTimeOffset.FromUnixTimeMilliseconds(enqueuedUnixMs);

            Content         = value.Value.ToString();
            EnqueuedTimeUtc = enqueuedTimeUtc;
            Offset          = id;
            PartitionKey    = id;
            SequenceNumber  = sequenceNumber;
            Properties      = new Dictionary <string, object>()
            {
                ["Name"] = value.Name,
            };
        }
Beispiel #18
0
        public async Task SendMessage(Message message)
        {
            var values = new NameValueEntry[]
            {
                new NameValueEntry("sender_username", message.SenderUsername),
                new NameValueEntry("senderId", message.SenderId),
                new NameValueEntry("receiver_username", message.ReceiverUsername),
                new NameValueEntry("receiverId", message.ReceiverId),
                new NameValueEntry("text", message.Text)
            };
            IDatabase redisDB = _redisConnection.GetDatabase();
            //int fromId = message.SenderId > message.ReceiverId ? message.SenderId : message.ReceiverId;
            //int toId = message.SenderId < message.ReceiverId ? message.SenderId : message.ReceiverId;
            await redisDB.StreamAddAsync($"forum:{message.ReceiverId}:chat", values);

            var         jsonMessage = JsonSerializer.Serialize(message);
            ISubscriber chatPubSub  = _redisConnection.GetSubscriber();
            await chatPubSub.PublishAsync("forum.messages", jsonMessage);
        }
Beispiel #19
0
        private static async Task CreateEvents(IDatabase db, CancellationToken cancel)
        {
            await Task.Run(async() =>
            {
                var messung = 0;
                while (!cancel.IsCancellationRequested)
                {
                    cpuCounter.NextValue();
                    await Task.Delay(1000);
                    var cpu = (int)cpuCounter.NextValue();

                    var data = new NameValueEntry[2] {
                        new NameValueEntry("CPU", cpu.ToString()),
                        new NameValueEntry("messung", ++messung)
                    };
                    var id = await db.StreamAddAsync(STREAM_NAME, data, null, 16, true);
                }
            }, cancel);
        }
Beispiel #20
0
        /// <inheritdoc />
        public Task SendEventDataAsync(IList <object> msgs, string partition)
        {
            if (msgs.Any() == false)
            {
                throw new InvalidOperationException("Cannot send empty message");
            }

            NameValueEntry[] entries = new NameValueEntry[msgs.Count()];
            for (int i = 0; i < msgs.Count(); i++)
            {
                entries[i] = new NameValueEntry($"{DATA_FIELD}_{i}", SerializeObject(msgs[i]));
            }

            return(ExecuteRedisCommandAsync(() =>
            {
                IDatabase db = GetRedisDatabase();
                return db.StreamAddAsync(_streamName, entries);
            }));
        }
Beispiel #21
0
        public async Task SendMessage(Message message)
        {
            var values = new NameValueEntry[]
            {
                new NameValueEntry("sender", message.Sender),
                new NameValueEntry("senderId", message.SenderId),
                new NameValueEntry("receiver", message.Receiver),
                new NameValueEntry("receiverId", message.ReceiverId),
                new NameValueEntry("content", message.Content)
            };
            IDatabase redisDB   = _redisConnection.GetDatabase();
            int       biggerId  = message.SenderId > message.ReceiverId ? message.SenderId : message.ReceiverId;
            int       smallerId = message.SenderId < message.ReceiverId ? message.SenderId : message.ReceiverId;
            await redisDB.StreamAddAsync($"messages:{biggerId}:{smallerId}:chat", values);

            var         jsonMessage = JsonSerializer.Serialize(message);
            ISubscriber chatPubSub  = _redisConnection.GetSubscriber();
            await chatPubSub.PublishAsync("chat.messages", jsonMessage);
        }
        private static async Task <TaskResult> CreateEvents(CancellationToken cancel)
        {
            var events = 0;

            try
            {
                await Task.Run(async() =>
                {
                    var rnd = new Random();

                    while (!cancel.IsCancellationRequested)
                    {
                        var data = new NameValueEntry[1] {
                            new NameValueEntry("eventID", events + 1)
                        };
                        var id = await db.StreamAddAsync(STREAM_NAME, data, null, 16, true);

                        ++events;
                        Console.Write("\r{0} events generated", events);
                        await Task.Delay(300, cancel);
                    }
                });
            }
            catch (TaskCanceledException)
            {
                // may happen
            }

            return(new TaskResult()
            {
                sender = true,
                events = events,
                group = "generator",
                consumer = Process.GetCurrentProcess().Id.ToString()
            });
        }
        public NameValueCollectionEntry(NameValueEntry entry)
        {
            Name = entry.Name;

            Value = entry.Value;
        }