pipleline 流水线
- 将多个命令进行打包,一起发送给redis服务器执行。redis服务器将这批命令执行完成后会将结一并返回给客户端,减少了多次请求带来的网络消耗。
- 使用pipeline打包的命令并不能保证其原子性,这些子命令并不能保证按序依次执行。可能在执行队列中会穿插执行其他客户端发送的命令。

pipleline 的子命令在执行队列中不连续,被C1命令切断了。
<?php
//使用php,进行测试
$cli = new Redis();
$cli->connect('127.0.0.1',6379);
#$cli->multi(Redis::PIPELINE);
$start = microtime(true);
$i = 100000;
while ($i--){
$cli->set('ok:'.$i,$i);
}
#$cli->exec();
$end = microtime(true);
echo $end-$start,"\n";
不使用pipeline消耗7秒,使用pipeline消耗0.7秒
发布订阅
角色
- publisher 发布者,发布消息到频道
- subscriber订阅者,订阅频道
- channel 频道,将发布者的消息流转到订阅者
发布订阅模型

- 发布者通过redis客户端发布消息到某个频道
- 一个频道能被多个订阅者订阅。频道能将消息,流转到订阅他的所有订阅者。频道不能保存消息,所以新的订阅者无法获取历史消息。
- 订阅者能够同时订阅多个频道。
命令
命令 | 解释 |
---|
publish channel msg | 将消息发送到某个频道中,返回订阅者数 |
subscribe channel1 channel2 … | 订阅频道 |
unsubscribe channel1 channel2 | 取消订阅频道 |
psubscirbe pattern | 模式匹配频道进行订阅 |
punsubscribe pattern | 模式匹配频道取消订阅 |
bitmap 位图
应用
- 用于做数据统计
比如需要统计一个具有10000W注册用户,一天用户登陆数量。如果使用set集合,需要将用户的id号加入集合后进行统计。如果使用位图,需要将位图上编号为id的位,设置为1,能节约大量内存。
命令
命令 | 解释 |
---|
setbit key offset [0|1] | 将位图key上的offset位,设置为0或者1,返回值是当前ofset位的数值 |
getbit key offset | 获取offset位上的数值 |
bitcount key start end | 统计在start和end 位上,被设置为1的位的个数 |
bitop [and or not xor] map1 map2 … | 将多个位图进行与、或、非、异或操作 |
bitos map [0|1] start end | 查找指定范围中,map第一次出现 1或0 的位置 |
HyperLogLog
应用
- 用途与位图一样主要用于数据统计
注意,使用hyperloglog统计的结果是一个大概的结构,官方给出0.8%的误差。
无法从hyperloglog中获取某个元素的具体信息,只能获取全部元素的统计信息。
命令
命令 | 解释 |
---|
pfadd hyper m1 m2 m3 | 向hyperloglog 中添加元素 |
pfcount | 统计hyperloglog中元素个数 |
pfmerge newHyper hyper1 hyper2 … | 将多个hyerloglog 合并 |