palicao / php-redis-time-series
在PHP中使用Redis时间序列
Requires
- php: >=7.2.0
- ext-redis: *
Requires (Dev)
- phpunit/phpunit: ^8.3
- vimeo/psalm: ^3.5
README
在PHP中使用 Redis 时间序列!
快速入门
安装
composer require palicao/php-redis-time-series
要求
该库已测试与以下版本的PHP兼容:
- PHP 7.2, 7.3, 7.4, 8.0
- RedisTimeSeries 1.4.10(但它应该与任何1.4版本兼容)
为了使用RedisTimeSeries 1.2,请使用本库的2.1.1版本。
构建
$ts = new TimeSeries(
new RedisClient(
new Redis(),
new RedisConnectionParams($host, $port)
)
);
TimeSeries
方法
创建
TimeSeries::create(string $key, ?int $retentionMs = null, array $labels = []): void
创建一个键,可选地设置保留时间(以毫秒为单位)和一些标签。
见 https://oss.redislabs.com/redistimeseries/commands/#tscreate.
修改
TimeSeries::alter(string $key, ?int $retentionMs = null, array $labels = []): void
修改现有键的保留时间以及/或标签。
见 https://oss.redislabs.com/redistimeseries/commands/#tsalter.
添加
TimeSeries::add(Sample $sample, ?int $retentionMs = null, array $labels = []): Sample
添加一个样本。
如果键未显式创建,则可以设置保留时间和标签。
见 https://oss.redislabs.com/redistimeseries/commands/#tsadd.
示例
$sample = $ts->add(new Sample('myKey', 32.10), 10, [new Label('myLabel', 'myValue')]);
在当前时间戳(redis服务器的时间)将样本添加到myKey
并返回它(包含dateTime)。$sample = $ts->add(new Sample('myKey', 32.10, new DateTimeImmutable()), 10, [new Label('myLabel', 'myValue')]);
在指定的日期时间将样本添加到myKey
并返回它。
请注意,RedisTimeSeries只允许按顺序添加样本(不允许添加比最新样本更早的样本)
添加多个
TimeSeries::addMany(array $samples): array
添加多个样本。
如常,如果没有提供时间戳,则使用redis服务器当前时间。添加的样本将作为一个数组返回。
见 https://oss.redislabs.com/redistimeseries/commands/#tsmadd.
incrementBy
和 decrementBy
TimeSeries::incrementBy(Sample $sample, ?int $resetMs = null, ?int $retentionMs = null, array $labels = []): void
TimeSeries::decrementBy(Sample $sample, ?int $resetMs = null, ?int $retentionMs = null, array $labels = []): void
将样本添加到键中,通过在$sample
中指定的数量增加或减少最后一个值。值可以在$resetMs
毫秒后重置。
类似于add
,如果命令用于非现有键,则可以设置保留时间和标签。
见 https://oss.redislabs.com/redistimeseries/commands/#tsincrbytsdecrby.
创建规则
TimeSeries::createRule(string $sourceKey, string $destKey, AggregationRule $rule): void
创建一个聚合规则,将给定的$rule
应用于$sourceKey
以填充$destKey
。
注意,这两个键必须已存在,否则命令将失败。
见 https://oss.redislabs.com/redistimeseries/commands/#tscreaterule.
示例
$ts->createRule('source', 'destination', new AggregationRule(AggregationRule::AVG, 10000)
将通过在 10 秒的时间桶中平均source
中包含的样本来填充destination
键。
deleteRule
TimeSeries::deleteRule(string $sourceKey, string $destKey): void
删除现有的聚合规则。
请参阅 https://oss.redislabs.com/redistimeseries/commands/#tsdeleterule.
range
TimeSeries::range(string $key, ?DateTimeInterface $from = null, ?DateTimeInterface $to = null, ?int $count = null, ?AggregationRule $rule = null, bool $reverse = false): Sample[]
检索键中的样本。可以限制查询在给定的时间框架内(通过传递 $from
和 $to
),限制检索的样本数量(通过传递 $count
),还可以使用 $rule
预聚合结果。
标志 $reverse
将按时间顺序反向返回结果。
请参阅 https://oss.redislabs.com/redistimeseries/commands/#tsrange.
multiRange
和 multiRangeWithLabels
TimeSeries::multiRange(Filter $filter, ?DateTimeInterface $from = null, ?DateTimeInterface $to = null, ?int $count = null, ?AggregationRule $rule = null, bool $reverse = false): Sample[]
TimeSeries::multiRangeWithLabels(Filter $filter, ?DateTimeInterface $from = null, ?DateTimeInterface $to = null, ?int $count = null, ?AggregationRule $rule = null, bool $reverse = false): SampleWithLabels[]
类似于 range
,但不是按键查询,而是查询 $filter
中指定的特定标签集。
multiRangeWithLabels
将返回一个包含 SampleWithLabels
的数组,而不是简单的 Sample
。
标志 $reverse
将按时间顺序反向返回结果。
请参阅 https://oss.redislabs.com/redistimeseries/commands/#tsmrange.
getLastSample
TimeSeries::getLastSample(string $key): Sample
获取键的最后样本。
请参阅 https://oss.redislabs.com/redistimeseries/commands/#tsget.
getLastSamples
TimeSeries::getLastSamples(Filter $filter): Sample[]
获取匹配给定 $filter
的键集的最后样本。
请参阅 https://oss.redislabs.com/redistimeseries/commands/#tsmget.
info
TimeSeries::info(string $key): Metadata
获取给定键的有用元数据。
请参阅 https://oss.redislabs.com/redistimeseries/commands/#tsinfo.
getKeysByFilter
getKeysByFilter(Filter $filter): string[]
检索匹配给定 $filter
的键列表。
请参阅 https://oss.redislabs.com/redistimeseries/commands/#tsqueryindex.
高级连接参数
您可以使用以下方法操作您的 RedisConnectionParams
RedisConnectionParams::setPersistentConnection(bool $persistentConnection)
启用/禁用持久连接RedisConnectionParams::setTimeout(int $timeout)
连接超时(秒)RedisConnectionParams::setRetryInterval(int $retryInterval)
重试间隔(秒)RedisConnectionParams::setReadTimeout(float $readTimeout)
读取超时(秒)
构建过滤器
过滤器由多个过滤操作组成。至少必须提供一个相等操作(在构造函数中提供)。可以使用方法 add
链接添加过滤操作。
示例
$f = (new Filter('label1', 'value1'))->add('label2', Filter::OP_EXISTS);
过滤具有 label1 = value1 并且有 label2 的项。$f = (new Filter('label1', 'value1'))->add('label2', Filter::OP_IN, ['a', 'b', 'c']);
过滤具有 label1 = value1 且 label2 是 'a'、'b' 或 'c' 之一的项。
本地测试
对于本地测试,您可以使用提供的 docker-compose.yml
文件,该文件将创建一个 PHP 容器(预安装了 redis 扩展)和一个 redis 容器(包含 Redis 时间序列)。
贡献者
感谢 Mrkisha 的宝贵贡献。