/// <summary> /// 发布消息, /// XADD mystream MAXLEN ~ 1000 * /// </summary> /// <param name="topic"></param> /// <param name="fields"></param> /// <param name="id"></param> /// <param name="maxLen"></param> /// <returns></returns> public RedisID Publish(string topic, IEnumerable <RedisField> fields, string id = "*", int maxLen = -1) { List <string> @params = new List <string>(); @params.Add(topic); if (maxLen > 0) { @params.Add("MAXLEN"); @params.Add("~"); @params.Add(maxLen.ToString()); } if (string.IsNullOrEmpty(id)) { @params.Add("*"); } else { @params.Add(id); } foreach (var item in fields) { @params.Add(item.Field); @params.Add(item.String); } var responseData = RedisConnection.DoWithMutiParams(RequestType.XADD, @params.ToArray()); if (responseData == null) { throw new Exception("Time out"); } if (responseData.Type == ResponseType.Error) { throw new Exception(responseData.Data); } return(RedisID.Parse(responseData.Data.Trim())); }
/// <summary> /// Subscribe, /// XREADGROUP GROUP group consumer [COUNT count][BLOCK milliseconds] [NOACK] STREAMS key [key ...]ID [ID ...] /// </summary> /// <param name="groupName"></param> /// <param name="consumerName"></param> /// <param name="topicName"></param> /// <param name="redisId"></param> /// <param name="noAck"></param> /// <param name="count"></param> /// <param name="blocked"></param> /// <param name="timeout"></param> /// <returns></returns> public IEnumerable <StreamEntry> Subscribe(string groupName, string consumerName, string topicName, RedisID redisId, bool noAck = false, int count = 1, bool blocked = false, int timeout = 1000) { List <string> @params = new List <string>(); @params.Add("GROUP"); @params.Add(groupName); @params.Add(consumerName); @params.Add("COUNT"); @params.Add(count.ToString()); if (blocked) { @params.Add("BLOCK"); @params.Add(timeout.ToString()); } if (noAck) { @params.Add("NOACK"); } @params.Add("STREAMS"); @params.Add(topicName); if (redisId != null) { @params.Add(redisId.ToString()); } else { @params.Add(">"); } var responseData = RedisConnection.DoStreamSub(RequestType.XREADGROUP, @params.ToArray()); if (responseData == null) { throw new Exception("Time out"); } if (responseData.Type == ResponseType.Error) { throw new Exception(responseData.Data); } return(responseData.Entity); }
/// <summary> /// 返回范围内的消息信息 /// </summary> /// <param name="topic"></param> /// <param name="from"></param> /// <param name="to"></param> /// <param name="count"></param> /// <returns></returns> public IEnumerable <IdFiled> GetRange(string topic, RedisID from, RedisID to, int count = -1) { return(GetRange(topic, from.ToString(), to.ToString(), count)); }