redis消费者组
消费组特性:
消费组是一组消费者,它们可以协同消费流中的事件。每个消费者组都有一个消费者组名称,用于标识不同的消费者组。
消费组中的每个消费者都有一个消费者名称,用于标识不同的消费者。
消费组会维护每个消费者的消费状态,以确保每个事件只被一个消费者处理。
Redis流还支持阻塞消费,即消费者可以使用XREADGROUP命令来等待新的事件,并在事件到达时立即处理它们。
流支持对事件设置字段和值,支持时间戳,允许灵活的数据建模。
使用delphiredisclient开源控件。
uses Redis.Commons, Redis.Client, Redis.Values, Redis.NetLib.Indy;
//XGROUP CREATE mystream mygroup 0,从流头开始 //只关心实时消息:用 XGROUP CREATE mystream mygroup $(推荐默认做法) //已有 Group 想让新消费者补读:必须用 XREADGROUP GROUP mygroup newconsumer COUNT 100 STREAMS mystream 0,显式指定起始 ID 0;但注意这会干扰 Group 整体的 pending 状态管理 //创建消费者组 var lCmd3: IRedisCommand := NewRedisCommand('XGROUP'); lCmd3 .Add('create') .Add('mystream') //流名 .Add('mygroup') //组名 .Add('$') .Add('MKSTREAM'); var lRes3: TRedisNullable<string> := fRedis.ExecuteWithStringResult(lCmd3); //为消费者组创建消费者 var lCmd1: IRedisCommand := NewRedisCommand('XGROUP'); lCmd1 .Add('CREATECONSUMER') .Add('mystream') //流名 .Add('mygroup') //组名 .Add('myconsumer'); //消费者名 var lRes1: TRedisNullable<string> := fRedis.ExecuteWithStringResult(lCmd1); //往流里插入一条消息 var lCmd: IRedisCommand := NewRedisCommand('XADD'); lCmd .Add('mystream') .Add('MAXLEN') .Add('~') .Add(10) .Add('*') .Add('key1') //键1 .Add('value1'); //值1 var lRes: TRedisNullable<string> := fRedis.ExecuteWithStringResult(lCmd); Log(lRes.Value);
procedure TMainForm.Button2Click(Sender: TObject); //订阅消费者组 begin TTask.Run( procedure begin while TTask.CurrentTask.Status <> TTaskStatus.Canceled do begin var lRedis := NewRedisClient(); var lCmd: IRedisCommand := NewRedisCommand('XREADGROUP'); lCmd .Add('group') .Add('mygroup') .Add('myconsumer') .Add('block') .Add(5000) .Add('count') .Add(1) .Add('streams') .Add('mystream') .Add('>'); var lRes: TRedisRESPArray := lRedis.ExecuteAndGetRESPArray(lCmd); if Assigned(lRes) then Log(lRes.tostring); end; end); end;
获取REDIS命令执行结果
var lRes: TRedisRESPArray := lRedis.ExecuteAndGetRESPArray(lCmd); if not Assigned(lRes) then begin Continue; end; try if lRes.Count > 0 then begin // var lSizeOfMyStreamArray := lRes .Items[0].ArrayValue .Items[1].ArrayValue .Count; lLastID := lRes .Items[0].ArrayValue .Items[1].ArrayValue .Items[lSizeOfMyStreamArray - 1].ArrayValue .Items[0].Value; end; Log(lRes.ToString+' count:'+lSizeOfMyStreamArray.ToString+' lastid:'+lLastID); finally lRes.Free; end;
XPENDING 命令用于查询流中的延时消息。它可以返回关于流中哪些消息是未处理的(即尚未被消费者处理的),以及这些消息的一些统计信息,如消息的数量、最小的 ID 和最大的 ID 等。
XACK用于确认 Redis Stream 消费者组中的消息已处理成功,将其从待处理列表(PEL)移除
uses redis.Command, redis.Client; var Redis: IRedisClient; Cmd: IRedisCommand; AckCount: Integer; begin Redis := NewRedisClient('127.0.0.1', 6379); // 方式一:直接构建命令(推荐,兼容性好) Cmd := NewRedisCommand('XACK') .Add('mystream') // Stream Key .Add('mygroup') // Consumer Group .Add('1526569495631-0'); // 消息 ID(可追加多个) AckCount := Redis.ExecuteWithIntegerResult(Cmd); // 结果:成功确认的消息数 // 方式二:批量确认多个 ID Cmd := NewRedisCommand('XACK') .Add('mystream') .Add('mygroup') .Add('1526569495631-0') .Add('1526569495632-0'); AckCount := Redis.ExecuteWithIntegerResult(Cmd); end
本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/21993952

浙公网安备 33010602011771号