redis实现异步任务队列

redis实现异步任务队列

先说思路:

将任务对象序列为JSON字符串,然后推入REDIS缓存,这叫入队。

通过独立的工作线程从REDIS拉出一个任务,这叫出队,工作线程将JSON字符串还原为任务对象,然后对这个任务对象进行处理,并取得执行结果。

整个过程是全异步执行的,所以叫异步任务队列。

下面附上演示代码。

1)任务对象定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
type
  TJob = class
  private
    FReplyTo: String;
    procedure SetReplyTo(const Value: String);
  public
    property ReplyTo: String read FReplyTo write SetReplyTo;
  end;
 
  TEvalJob = class(TJob)
  private
    FExpression: String;
    procedure SetExpression(const Value: String);
  public
    property Expression: String read FExpression write SetExpression;
  end;
 
  TDatabaseJob = class(TJob)
  private
    FProcedureName: String;
    procedure SetProcedureName(const Value: String);
  public
    property ProcedureName: String read FProcedureName
      write SetProcedureName;
  end;

  2)入队

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TMainForm.Button1Click(Sender: TObject);
var
  lRedis: IRedisClient;
  lJob: TEvalJob;
  lJobString: string;
begin
  lRedis := NewRedisClient(REDIS_HOSTNAME);
 
  lJob := TEvalJob.Create;
  try
    lJob.ReplyTo := 'replies:' + FUserName;
    lJob.Expression := Edit1.Text;
    lJobString := TJson.ObjectToJsonString(lJob);
    lRedis.LPUSH('jobs', lJobString);
  finally
    lJob.free;
  end;
end;

  3)出队并执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TMainForm.Timer1Timer(Sender: TObject);
var
  lJobj: TJSONObject;
  lExpression, lRes: string;
  lResponse: string;
begin
  if FRedis.RPOP('replies:' + FUserName, lResponse) then
  begin
    lJobj := TJSONObject.ParseJSONValue(lResponse) as TJSONObject;
    try
      lExpression := lJobj.GetValue<TJSONString>('expression').Value;
      lRes := lJobj.GetValue<TJSONString>('result').Value;
      Memo1.Lines.Add(Format('Response: %s = %s', [lExpression, lRes]));
    finally
      lJobj.free;
    end;
  end;
end;

  

 

posted @   delphi中间件  阅读(2928)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2014-03-06 关于sqlite数据库
2013-03-06 delphi 新老版本数据类型所占内存大小
点击右上角即可分享
微信分享提示