delphiredisclient - Redis client for Delphi

Delphi Redis Client版本2(此分支)与Delphi 10.1 Berlin兼容,更好。警告!如果您使用较旧的Delphi版本,则必须使用适用于Delphi 10 Seattle,XE8,XE7,XE6和XE5的Delphi Redis Client版本1(也适用于旧版本)。

Delphi REDIS客户端从第一个版本(或左右)开始在移动设备上运行,自从Delphi 10.2东京它也在Linux上工作(测试Ubuntu 16.x LTS)。

Delphi Redis Client能够发送所有Redis命令并使用内部解析器读取响应。此外,许多流行的命令具有专门的专用方法,这简化了利用率。

这是用于连接,发送命令和管理Redis服务器的Redis客户端界面。许多方法都是1-1映射到具有相同名称的Redis命令(例如,SET是Redis SET命令的映射)。计划实现某种集成设计模式的高级方法(例如,推送JSONObject,弹出流等)。

https://github.com/danieleteti/delphiredisclient

IRedisClient = interface
['{566C20FF-7D9F-4DAC-9B0E-A8AA7D29B0B4}']
function &SET(const AKey, AValue: string): boolean; overload;
function &SET(const AKey, AValue: TBytes): boolean; overload;
function &SET(const AKey: string; AValue: TBytes): boolean; overload;
function &SET(const AKey: string; AValue: TBytes; ASecsExpire: UInt64): boolean; overload;
function &SET(const AKey: string; AValue: string; ASecsExpire: UInt64): boolean; overload;
function SETNX(const AKey, AValue: string): boolean; overload;
function SETNX(const AKey, AValue: TBytes): boolean; overload;
function GET(const AKey: string; out AValue: string): boolean; overload;
function GET(const AKey: TBytes; out AValue: TBytes): boolean; overload;
function GET(const AKey: string; out AValue: TBytes): boolean; overload;
function DEL(const AKeys: array of string): Integer;
function TTL(const AKey: string): Integer;
function EXISTS(const AKey: string): boolean;
function MSET(const AKeysValues: array of string): boolean;
function KEYS(const AKeyPattern: string): TArray<string>;
function INCR(const AKey: string): NativeInt;
function DECR(const AKey: string): NativeInt;
function EXPIRE(const AKey: string; AExpireInSecond: UInt32): boolean; // strings functions
function APPEND(const AKey, AValue: TBytes): UInt64; overload;
function APPEND(const AKey, AValue: string): UInt64; overload;
function STRLEN(const AKey: string): UInt64;
function GETRANGE(const AKey: string; const AStart, AEnd: NativeInt): string;
function SETRANGE(const AKey: string; const AOffset: NativeInt; const AValue: string)
: NativeInt; // hash
function HSET(const AKey, aField: string; AValue: string): Integer; overload;
procedure HMSET(const AKey: string; aFields: TArray<string>; AValues: TArray<string>);
function HMGET(const AKey: string; aFields: TArray<string>): TArray<string>;
function HSET(const AKey, aField: string; AValue: TBytes): Integer; overload;
function HGET(const AKey, aField: string; out AValue: TBytes): boolean; overload;
function HGET(const AKey, aField: string; out AValue: string): boolean; overload;
function HDEL(const AKey: string; aFields: TArray<string>): Integer; // lists
function RPUSH(const AListKey: string; AValues: array of string): Integer;
function RPUSHX(const AListKey: string; AValues: array of string): Integer;
function RPOP(const AListKey: string; var Value: string): boolean;
function LPUSH(const AListKey: string; AValues: array of string): Integer;
function LPUSHX(const AListKey: string; AValues: array of string): Integer;
function LPOP(const AListKey: string; out Value: string): boolean;
function LLEN(const AListKey: string): Integer;
procedure LTRIM(const AListKey: string; const AIndexStart, AIndexStop: Integer);
function LRANGE(const AListKey: string; IndexStart, IndexStop: Integer)
: TArray<string>;
function RPOPLPUSH(const ARightListKey, ALeftListKey: string;
var APoppedAndPushedElement: string): boolean; overload;
function BRPOPLPUSH(const ARightListKey, ALeftListKey: string;
var APoppedAndPushedElement: string; ATimeout: Int32): boolean; overload;
function BLPOP(const AKeys: array of string; const ATimeout: Int32;
out Value: TArray<string>): boolean;
function BRPOP(const AKeys: array of string; const ATimeout: Int32;
out Value: TArray<string>): boolean;
function LREM(const AListKey: string; const ACount: Integer;
const AValue: string): Integer; // sets
function SADD(const AKey, AValue: TBytes): Integer; overload;
function SADD(const AKey, AValue: string): Integer; overload;
function SREM(const AKey, AValue: TBytes): Integer; overload;
function SREM(const AKey, AValue: string): Integer; overload;
function SMEMBERS(const AKey: string): TArray<string>;
function SCARD(const AKey: string): Integer; // ordered sets
function ZADD(const AKey: string; const AScore: Int64; const AMember: string): Integer;
function ZREM(const AKey: string; const AMember: string): Integer;
function ZCARD(const AKey: string): Integer;
function ZCOUNT(const AKey: string; const AMin, AMax: Int64): Integer;
function ZRANK(const AKey: string; const AMember: string; out ARank: Int64): boolean;
function ZRANGE(const AKey: string; const AStart, AStop: Int64): TArray<string>;
function ZRANGEWithScore(const AKey: string; const AStart, AStop: Int64): TArray<string>;
function ZINCRBY(const AKey: string; const AIncrement: Int64; const AMember: string): string; // lua scripts
function EVAL(const AScript: string; AKeys: array of string; AValues: array of string): Integer; // system
procedure FLUSHDB;
procedure SELECT(const ADBIndex: Integer);
procedure AUTH(const aPassword: string); // raw execute
function ExecuteAndGetArray(const RedisCommand: IRedisCommand)
: TArray<string>;
function ExecuteWithIntegerResult(const RedisCommand: string)
: TArray<string>; overload;
function ExecuteWithIntegerResult(const RedisCommand: IRedisCommand)
: Int64; overload;
function ExecuteWithStringResult(const RedisCommand: IRedisCommand): string; // pubsub
procedure SUBSCRIBE(const AChannels: array of string;
ACallback: TProc<string, string>;
ATimeoutCallback: TRedisTimeoutCallback = nil);
function PUBLISH(const AChannel: string; AMessage: string): Integer; // transactions
function MULTI(ARedisTansactionProc: TRedisTransactionProc): TArray<string>; overload;
procedure MULTI; overload;
function EXEC: TArray<string>;
procedure WATCH(const AKeys: array of string); procedure DISCARD;
// non sys
function Tokenize(const ARedisCommand: string): TArray<string>;
procedure Disconnect;
function InTransaction: boolean;
// client
procedure ClientSetName(const ClientName: string);
procedure SetCommandTimeout(const Timeout: Int32);
function Clone: IRedisClient;
end;

Delphi Redis Client is not tied to a specific TCP/IP library. Currently it uses INDY but you can implement the IRedisNetLibAdapter and wrap whatever library you like.

  IRedisNetLibAdapter = interface
['{2DB21166-2E68-4DC4-9870-5DCCAAE877A3}']
procedure Connect(const HostName: string; const Port: Word);
procedure Send(const Value: string);
procedure Write(const Bytes: TBytes);
procedure WriteCrLf(const Bytes: TBytes);
procedure SendCmd(const Values: IRedisCommand);
function Receive(const Timeout: Int32): string;
function ReceiveBytes(const ACount: Int64; const Timeout: Int32): System.TArray<System.Byte>;
procedure Disconnect;
function LastReadWasTimedOut: boolean;
end;

This is a simple demo showing the utilization pattern (using the builtin INDY library support).

program CmdsSample1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
System.SysUtils,
Redis.Commons, // Interfaces and types
Redis.Client, // The client itself
Redis.NetLib.INDY, // The tcp library used
Redis.Values; // nullable types for redis commands var
lRedis: IRedisClient;
lValue: TRedisString; begin
try
lRedis := TRedisClient.Create;
lRedis.Connect;
lRedis.&SET('firstname', 'Daniele');
lValue := lRedis.GET('firstname');
if not lValue.IsNull then
WriteLn('KEY FOUND! key "firstname" => ', lValue.Value);
WriteLn('DEL firstname');
lRedis.DEL(['firstname']); // remove the key
lValue := lRedis.GET('firstname');
if lValue.IsNull then
WriteLn('Key "firstname" doesn''t exist (it''s correct!)')
else
WriteLn(lValue.Value); // never printed except
on E: Exception do
WriteLn(E.ClassName, ': ', E.Message);
end;
readln; //just to keep the command prompt open end.

delphiredisclient开源GIT的更多相关文章

  1. 个人开源Git地址

    开源Git地址 序号 Git地址 描述 1 https://github.com/winds-june 各种源码.直接调用的jar包          2    

  2. 开源Git代码托管平台

    开源Git代码托管平台主要参考有以下4个: 1.GitHub 很多开源项目都来自GitHub,但是GitHub只能新建公开的Git仓库,私有 仓库要收费.GitHub地址:https://github ...

  3. 开源GIT仓库-----gitlab

    简介:GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目.它拥有与Github类似的功能,能够浏览源代码 ...

  4. [js开源组件开发]js手机联动选择地区仿ios 开源git

    js手机联动选择地区 前言:由于网上找到了一个mobiscrool,比较全,但是不开源,只能试用15天,正式版竟然要三千块钱,穷人只能自己动手,写了个只针对弹窗地区选择的. 本站点所有的资源均在git ...

  5. 提交到开源git时出现:fatal: refusing to merge unrelated histories的解决办法

    解决办法   创建本地库和fetch远程分支这些前面的步骤这里略过.可以自行百度. 解决办法: 1.cmd进入项目的根目录. 2.执行下面的命令:git pull origin master --al ...

  6. android studio提交到开源git时出现:fatal: refusing to merge unrelated histories的解决办法

    创建本地库和fetch远程分支这些前面的步骤这里略过.可以自行百度. 解决办法: 1.cmd进入项目的根目录. 2.执行下面的命令:git pull origin master --allow-unr ...

  7. 开源GIT仓库-----gogs

    简介:Gogs 是一款极易搭建的自助 Git 服务,其目标是打造一个最简单.最快速和最轻松的方式搭建自助 Git 服务.使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发,并且支持 Go 语 ...

  8. [js开源组件开发]js手机联动选择日期 开源git

    js手机联动选择日期 这里在前面的<js手机联动选择地区>的基础上,改造数据源之后形成的一个日期的选择器,当然你可以使用之前的PC上模式的<日期控件>,它同时也支持手机端,ht ...

  9. Git各大平台(win/Linux/Mac)图形化界面客户端大汇总

    摘要: 介绍各平台下的图形化界面git客户端(本人并没有全部使用过),欢迎大家补充新的软件或者使用感受~  一.TortoiseGit - The coolest Interface to Git V ...

随机推荐

  1. async异步注解和aspect切面注解等注解的原理

    在我们使用spring框架的过程中,在很多时候我们会使用@async注解来异步执行某一些方法,提高系统的执行效率.今天我们来探讨下spring是如何完成这个功能的. 1.spring 在扫描bean的 ...

  2. 【转】手把手教你 Mockito 的使用

    原文链接:https://segmentfault.com/a/1190000006746409 什么是 Mockito Mockito 是一个强大的用于 Java 开发的模拟测试框架, 通过 Moc ...

  3. Python 单例模式讲解

    Python 单例模式讲解 本节内容: classmethod用途 单例模式方法一 类__new__方法讲解 单例模式方法二 前言: 使用单例方法的好处:对于一个类,多次实例化会产生多个对象,若使用单 ...

  4. Java 把异常传递给控制台

    最简答而又不用写多少代码就能保护异常信息的方法,就是把它们从main()传递到控制台,对于简单的程序可以像这样: package exceptions; //: exceptions/MainExce ...

  5. tensorflow-作用域

    变量名字由两部分组成:scope/变量name. name 参数才是对象的唯一标识. 1.tf.name_scope() Graph中保存着一个属性_name_stack(string类型),_nam ...

  6. Java第三阶段学习(六、多线程)

    一.进程和线程的区别: 进程:指正在运行的程序,当一个程序进入内存运行,就变成一个进程. 线程:线程是进程的一个执行单元. 总结:一个程序运行后至少会有一个进程,一个进程可以有多个线程. 多线程:多线 ...

  7. C++ 矩阵库 eigen

    找了好久才发现了一个这么方便的C++矩阵库. 官网 http://eigen.tuxfamily.org/index.php?title=Main_Page 参考文章 http://blog.csdn ...

  8. Angular快速学习笔记(3) -- 组件与模板

    1. 显示数据 在 Angular 中最典型的数据显示方式,就是把 HTML 模板中的控件绑定到 Angular 组件的属性. 使用插值表达式显示组件属性 要显示组件的属性,最简单的方式就是通过插值表 ...

  9. 【LOJ】#6437. 「PKUSC2018」PKUSC

    题解 我们把这个多边形三角形剖分了,和统计多边形面积一样 每个三角形有个点是原点,把原点所对应的角度算出来,记为theta 对于一个点,相当于半径为这个点到原点的一个圆,圆弧上的弧度为theta的一部 ...

  10. Linux常用包的安装

    下面列出的这些包都有很强大的功能,也是非常实用常用的工具 gcc yum -y install gcc GNU编译器套件(GNU Compiler Collection) gcc-c++ yum -y ...