jjw

写给自己的博客。 记录学习的点滴以备查。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

delphi redisclient测试

Posted on 2024-01-13 16:28  jjw  阅读(75)  评论(0编辑  收藏  举报
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    BitBtn1: TBitBtn;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  Redis.Commons, redis.Command, redis.NetLib.INDY, redis.Client;

var
  redis: IRedisClient;
  cmd: IRedisCommand;

procedure log(msg: string);
begin
  Form1.Memo1.Lines.Add(msg);
end;

procedure TForm1.FormCreate(Sender: TObject);
  procedure addMsg;
  begin
    if not redis.EXISTS('myStream') then
    begin
      var xaddCmd := NewRedisCommand('XADD').Add('myStream').Add('*').Add('name').Add('jjw');
      var ret := redis.ExecuteWithStringResult(xaddCmd);
      if ret.HasValue then
        Log(ret.Value);
    end;
  end;

  procedure getGroups;
  begin
    cmd := NewRedisCommand('XINFO').Add('GROUPS').Add('myStream');     //redis 无法处理
    var ret := redis.ExecuteAndGetMatrix(cmd);
    if ret.HasValue then
    begin
      var c := Length(ret.Value);
      var v := ret.Value[0];
      for var I := 0 to Length(v.Value)-1 do
        log(v.Value[I].Value);
    end;
  end;

  procedure clearGroup;
  begin
    cmd := NewRedisCommand('XGROUP').Add('DESTROY').Add('myStream').Add('myGroup');     //会清空未读,未确认的消息
    var ret := redis.ExecuteWithStringResult(cmd);
  end;

  procedure createGroup;
  begin
    var createGroupCmd := NewRedisCommand('XGROUP').Add('CREATE').Add('myStream').Add('myGroup').Add('0');  // $:最新消息, 即未读过的。  0:从最后一条读
    var ret := redis.ExecuteWithStringResult(createGroupCmd);
    if ret.HasValue then
      Log(ret.Value);
  end;

  procedure readMsg;
  begin
    cmd := NewRedisCommand('XREADGROUP').Add('GROUP').Add('myGroup').Add('cm').Add('COUNT').Add(2).Add('STREAMS').Add('myStream').Add('>');  //0,未ACK(确认)的未读消息   > 未读过的消息
    var val := redis.ExecuteAndGetRESPArray(cmd);
    if val<>nil then
      memo1.Text := val.ToJSON(); //[["myStream",[["1704960677439-0",["name","haha","age","100"]]]]]
//    Memo1.Text := val.ToString; //[["myStream",[["1704960677439-0",["name","haha","age","100"]]]]]
//    var y1 := val[0].ArrayValue[0].Value;  //myStream
//    Log(val[0].Items[1].Items[0].Items[0].Value);  //1704960677439-0
//    Log(val[0].Items[1].Items[0].Items[1].Items[0].Value);  //name
  end;
begin
  redis := NewRedisClient('192.168.88.129');

  getGroups;

  addMsg;
  try
    // if not ExistsGroup(groupName) then  //若不判断,捕获异常也可以。
    //   createGroup;
  except
    ;
  end;
  readMsg;
end;

end.

注:

或IRedisClient接口中无ExecuteAndGetMatrix方法需要自行添加。