PHP 使用 Redis

Stella981
• 阅读 638

PHPRedis 项目地址
安装步骤参考链接

安装 Redis 扩展

PHPRedis 已经封装为 PHP 的官方扩展了,只要安装了这个扩展,重启 PHP-FPM 后即可使用 PHPRedis。

从 pecl 安装

下面命令会安装最新的稳定版本的 PHP 扩展:

pecl install redis

源码编译安装(仅限 Linux)

可以从源码构建这个 PHP 扩展:

phpize
./configure [--enable-redis-igbinary] [--enable-redis-lzf [--with-liblzf[=DIR]]]
make && make install

对 Windows 下的编译安装如果有兴趣,可以参考 这里

从二进制包安装

大多数发行版都会提供这个扩展的预编译的二进制包。安装完成后记得重启 php-fpm 或 apache。

Windows

https://pecl.php.net/package/redis 这个页面下载 DLL 文件,放入指定位置,并修改 php.ini 文件指定扩展位置。

extension_dir = "/path/to/php/extensions" //扩展所在路径

extension=redis.so // 扩展名称

Fedora

Fedora 用户可以从官方仓库安装。注意区分版本。

Fedora ≤ 28, Version 3 ,安装 php-pecl-redis 包:

dnf install php-pecl-redis

Fedora ≥ 27, Version 4 ,安装 php-pecl-redis4 包:

dnf install php-pecl-redis4

RHEL / CentOS

从 EPEL 仓库安装 php-pecl-redis 包:

yum install php-pecl-redis

PHPRedis 基本用法

PHPRedis 提供了通过 PHP 使用 Redis 的 API,详细的文档可以 参考项目文档
示例代码可以 参考这里

PHPRedis 中的方法,基本上都返回 TRUE 或FALSE。

Redis 的代码结构

Redis 提供了两个类和几个预定义常量:

  • Class Redis:用于创建 Redis 客户端,用法:$redis = new Redis();
  • Class RedisException:如果无法连接 Redis 服务器(服务器宕机、过载等连接问题),会抛出这个异常。只要服务器可以连接,就不会抛出这个异常(例如命令有无、Key 不存在等问题,只会返回 FALSE)
  • 预定义常量:Redis 的数据类型
    Redis::REDIS_STRING - String
    Redis::REDIS_SET - Set
    Redis::REDIS_LIST - List
    Redis::REDIS_ZSET - Sorted set
    Redis::REDIS_HASH - Hash
    Redis::REDIS_NOT_FOUND - Not found / other

连接 Redis

  • connect, open:连接到一台服务器
  • pconnect, popen:持久连接到一台服务器,参数类似 connect 和 open
  • auth:向服务器认证,注意,密码会以明文传输
  • select:切换当前连接使用的数据库
  • swapdb:切换两个 Redis,原子地将一个 Redis 数据库与另一个 Redis 数据库交换,版本受限:>= 4.0.0
  • close:关闭连接
  • setOption:设置客户端选项
  • getOption:获取客户端选项
  • ping:向服务器发送 Ping 请求
  • echo:回显指定的字符串

connect, open

参数如下:

  • host:字符串,可以是 host 或 Linux 下的 socket 套接字
  • port:端口,可选
  • timeout:超时时间。浮点数,单位秒,可选,默认值 0 表示无限制
  • reserved:如果指定了 retry_interval ,就应该设置为 NULL
  • retry_interval:整型,单位毫秒,可选
  • read_timeout:浮点数,单位秒,可选,默认值 0 表示无限制

返回值:

  • BOOL:成功建立连接返回 TRUE,失败则返回 FALSE

示例:

$redis->connect('127.0.0.1', 6379);
$redis->connect('127.0.0.1'); // 默认使用的端口号是 6379
$redis->connect('127.0.0.1', 6379, 2.5); // 超时时间是 2.5 秒
$redis->connect('/tmp/redis.sock'); // unix domain socket
$redis->connect('127.0.0.1', 6379, 1, NULL, 100); // 超时时间是 1 秒,发起重新连接之前有 100ms 的延迟

auth

参数:密码,字符串
返回值:

  • BOOL:认证成功则返回 TRUE,失败则返回 FALSE

    $redis->auth('myPass');

select

参数:整型,要使用的数据库的编号
返回值:

  • BOOL:成功则返回 TRUE,失败则返回 FALSE

setOption

参数:参数名和参数值

返回值:

  • BOOL:成功则返回 TRUE,失败则返回 FALSE

    $redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_NONE); // 不序列化数据 $redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP); // 使用内建的 serialize/unserialize $redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_IGBINARY); // 使用 igBinary serialize/unserialize

    $redis->setOption(Redis::OPT_PREFIX, 'myAppName:'); // 对所有的 key 使用自定义的前缀

    /* SCAN 命令族的选项,指示是否抽象来自用户的空结果。如果设置为SCAN_NORETRY(默认值), phpredis 将一次发出一个SCAN命令,有时返回空数组。如果设置为SCAN_RETRY,phpredis 将重试scan命令直到返回 key 或 Redis 返回零的迭代器 */ $redis->setOption(Redis::OPT_SCAN, Redis::SCAN_NORETRY); $redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY);

getOption

返回设置的选项。

示例:

// 返回 Redis::SERIALIZER_NONE, Redis::SERIALIZER_PHP, 或 Redis::SERIALIZER_IGBINARY
$redis->getOption(Redis::OPT_SERIALIZER);

ping

返回值:
成功时返回字符串 +PONG。连接错误时抛出 RedisException。

Server 服务器指令

  • bgRewriteAOF:向只支持追加的文件(Append-Only File)异步重写
  • bgSave:异步将数据集保存到磁盘(在后台运行)
  • config:设置或获取 Redis 服务器配置参数
  • dbSize:返回选中的数据库中 key 的个数
  • flushAll:删除所有数据库中所有的 key
  • flushDb:删除当前数据库中所有的 key
  • info:获取服务器的状态和统计信息
  • lastSave:获取上次保存数据到磁盘时的时间戳
  • resetStat:重置 info 方法返回的统计信息
  • save:异步将数据集保存到磁盘(前台,需等待)
  • slaveOf:使服务器成为另一个实例的从属服务器,或将其提升为主服务器
  • time:返回当前的服务器时间
  • slowLog:访问 Redis 的 slowLog 条目

bgRewriteAOF 和 bgSave

示例:

$redis->bgRewriteAOF();
$redis->bgSave();

config

参数:

  • 操作:GET 或 SET
  • 对于 SET 操作,需要 key。对于 GET 操作需要 glob-pattern,参考:http://redis.io/commands/config-get
  • 对于 SET 操作,还需要 value。

返回值:

  • GET 操作会返回关联数组:key -> value
  • SET 操作返回布尔值

示例:

$redis->config("GET", "*max-*-entries*");
$redis->config("SET", "dir", "/var/run/redis/dumps/");

info

返回关联数组形式的服务器信息。不指定参数时会返回所有的信息(类似 Redis 的 info 命令):

127.0.0.1:6379> info
# Server
redis_version:3.2.12
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:3dc3425a3049d2ef
redis_mode:standalone
os:Linux 4.15.6-1.el7.elrepo.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.8.5
process_id:1251
run_id:64c7b0402e7a1b327854c02265ee04523a63c8b0
tcp_port:6379
uptime_in_seconds:491886
uptime_in_days:5
hz:10
lru_clock:8793321
executable:/root/redis-server
config_file:

# Clients
connected_clients:1
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

# Memory
used_memory:813480
used_memory_human:794.41K
used_memory_rss:6680576
used_memory_rss_human:6.37M
used_memory_peak:833424
used_memory_peak_human:813.89K
total_system_memory:4137517056
total_system_memory_human:3.85G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:8.21
mem_allocator:jemalloc-3.6.0

# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1535423155
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok

# Stats
total_connections_received:14
total_commands_processed:209
instantaneous_ops_per_sec:0
total_net_input_bytes:6977
total_net_output_bytes:82521
instantaneous_input_kbps:0.01
instantaneous_output_kbps:6.06
rejected_connections:133
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:9
evicted_keys:0
keyspace_hits:77
keyspace_misses:27
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:807
migrate_cached_sockets:0

# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

# CPU
used_cpu_sys:344.30
used_cpu_user:150.14
used_cpu_sys_children:0.02
used_cpu_user_children:0.00

# Cluster
cluster_enabled:0

# Keyspace
db0:keys=10,expires=0,avg_ttl=0

可以将各种选项传递给 INFO(根据 Redis 文档),只返回感兴趣的内容。

127.0.0.1:6379> info cpu
# CPU
used_cpu_sys:344.43
used_cpu_user:150.19
used_cpu_sys_children:0.02
used_cpu_user_children:0.00

参数:可选,例如 COMMANDSTATSCPU

示例:

$redis->info(); /* standard redis INFO command */
$redis->info("COMMANDSTATS"); /* Information on the commands that have been run (>=2.6 only)
$redis->info("CPU"); /* just CPU information from Redis INFO */

slaveOf

参数:
主机加端口号,不指定参数时表示不再做 slave 。

示例:

$redis->slaveOf('10.0.1.7', 6379);
/* ... */
$redis->slaveOf();

slowLog

参数:

  • 操作(字符串):GET、LEN 或 RESET
  • 长度(integer)可选:GET 命令需要这个选项

不同操作的返回值不同:

  • SLOWLOG GET:慢日志条目的关联数组
  • SLOGLOG LEN:整型,slowLog 的个数
  • SLOWLOG RESET:布尔值,取决于操作是否成功

示例:

// Get ten slowLog entries
$redis->slowLog('get', 10);
// Get the default number of slowLog entries

$redis->slowLog('get');
// Reset our slowLog
$redis->slowLog('reset');

// Retrieve slowLog length
$redis->slowLog('len');

KEY 和 STRING 字符串操作

key 针对键的操作

  • del, delete, unlink:删除一个 key

  • dump:返回存储在指定键处的值的序列化版本

  • exists:判断 key 是否存在

  • expire, setTimeout, pexpire:设置 key 的过期时间

  • expireAt, pexpireAt:设置 key 在那一刻过期,UNIX 时间戳

  • keys, getKeys:找出所有匹配指定模式的 key

  • scan:扫描键空间中的键,Redis >= 2.8.0

  • migrate:以原子方式将 key 从一个 Redis 实例转移到另一个实例

  • move:将 key 移动到另一个数据库

  • object:检查 Redis 对象的内部

  • persist:删除 key 的过期时间

  • randomKey:从键空间中返回一个随机的 key

  • rename, renameKey:重命名 key

  • renameNx:仅在 key 不存在(not exist)的时候才重命名这个 key

  • type:判断存储在 key 中的数据的类型

  • sort:排序 LIST、SET 或 Sorted SET 中的元素

  • ttl, pttl:获取 key 的有效期

  • restore:使用先前通过 dump 获得的序列化值创建 key

    keys("*"); print_r($arr);

STRING 针对字符串的操作

  • append:向一个 key 追加值
  • bitCount:计算字符串中的设置位数(Count set bits in a string)
  • bitOp:在字符串之间执行按位运算(Perform bitwise operations between strings)
  • decr, decrBy:减少 key 对应的字符串值
  • get:获取值
  • getBit:返回 key 对应的字符串值中 offset 处的位值
  • getRange:返回 key 对应的字符串值中的子字符串
  • getSet:设置 key 对应的字符串值,并返回旧值
  • incr, incrBy:增加 key 对应的字符串值
  • incrByFloat:按指定的数量增加 key 对应的浮点值
  • mGet, getMultiple:获取多个指定的 key 对应的值
  • mSet, mSetNX:为多个 key 设置指定的值
  • set:为一个 key 设置值
  • setBit:设置或清除 key 处存储的字符串值中的指定偏移处的位
  • setEx, pSetEx:同时设置 key 的值和过期时间
  • setNx:只有在 key 不存在时,才为其设置值
  • setRange:覆盖指定的 key 对应的字符串的一部分
  • strLen:获取指定的 key 对应的值的长度

get

返回值:字符串或 BOOL。如果 key 不存在则返回 FALSE。否则,返回 key 对应的值。

示例:

$redis->get('key');

set

对于 >= 2.6.12 的版本,可以使用额外的参数。

参数:

  • Key
  • Value
  • 超时时间或选项数组(可选)。如果传的是整型,则 phpredis 会将其转为 SETEX,如果传的是数组,会尝试使用 >= 2.6.12 的版本所支持的扩展选项。

返回值:如果命令执行成功,返回 TRUE。

示例:

$redis->set('key', 'value');

// 会自动转为调用 SETEX
$redis->set('key','value', 10);

// 10 秒有效期,仅在 key 不存在时设置值
$redis->set('key', 'value', Array('nx', 'ex'=>10));

// 1000 毫秒有效期,仅在 key 存在时设置值
$redis->set('key', 'value', Array('xx', 'px'=>1000));

setex 和 psetex

参数:Key TTL Value

示例:

$redis->setEx('key', 3600, 'value'); // 1 小时有效期
$redis->pSetEx('key', 100, 'value'); // 0.1 秒有效期

参数:key 的数组,或直接用不限数量的 key。

注意:unlink 方法与使用 del 完全相同,unlink 命令是非阻塞的,并且将异步执行实际删除。需要 > = 4.0.0 的版本才支持。

返回值:已删除的 key 的个数。

示例:

$redis->delete('key1', 'key2'); /* 返回 2 */
$redis->delete(array('key3', 'key4')); /* 返回 2 */

/* 如果版本 >= 4.0.0 可以使用 unlink */
$redis->unlink('key1', 'key2');
$redis->unlink(Array('key1', 'key2'));

mGet 和 getMultiple

如果有不存在的 key,返回的数组中对应的位置会被设置为 FALSE。

参数:数组,包含与参数中的 key 相关的值的数组

示例:

$redis->set('key1', 'value1');
$redis->set('key2', 'value2');
$redis->set('key3', 'value3');
$redis->mGet(array('key1', 'key2', 'key3')); /* array('value1', 'value2', 'value3');
$redis->mGet(array('key0', 'key1', 'key5')); /* array(`FALSE`, 'value1', `FALSE`);

mSet 和 mSetNx

在一个原子命令中设置多个键值对。mSetNx 在所有键值对设置成功时,只会返回 TRUE。

参数:键值对数组 array(key => value, …)

返回值:TRUE 或 FALSE。

示例:

$redis->mSet(array('key0' => 'value0', 'key1' => 'value1'));
var_dump($redis->get('key0'));
var_dump($redis->get('key1'));

输出:

string(6) "value0"
string(6) "value1"

getSet

参数:key value

返回值:字符串,key 之前对应的值

示例:

$redis->set('x', '42');
$exValue = $redis->getSet('x', 'lol'); // 返回 '42',并将 x 设置为 'lol'
$newValue = $redis->get('x')'       // 返回 'lol'

move

将 key 移动到另一个数据库。Redis 中的数据库编号从 0 开始。

参数:

  • key
  • dbindex,整型,要移动到的数据库的编号

返回值:BOOL 值,成功返回 TRUE,失败返回 FALSE。e.

示例:

$redis->select(0); // 使用数据库 0
$redis->set('x', '42');
$redis->move('x', 1);  // 将 x 移动到数据库 1
$redis->select(1); // 切换为数据库 1
$redis->get('x');  // 返回 42

expire、setTimeout 和 pexpire

参数:

  • Key
  • ttl,整型值

示例:

$redis->set('x', '42');
$redis->setTimeout('x', 3);    // 设置 3 秒钟的有效期
sleep(5);
$redis->get('x');      // 因为已经过期了,所以这里返回 `FALSE`

expireAt 和 pexpireAt

参数:

  • Key
  • UNIX 时间戳,整型值。

示例:

$redis->set('x', '42');
$now = time(); // 当前时间戳, Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数
$redis->expireAt('x', $now + 3);  // x 在 3 秒钟后失效
sleep(5);
$redis->get('x');      // 因为已经过期了,所以这里返回 `FALSE`

keys 和 getKeys

参数:pattern 模式,字符串类型,通配符是“*”。

返回值:STRING 类型组成的数组。

示例:

$allKeys = $redis->keys('*');  // 查询所有的 key
$keyWithUserPrefix = $redis->keys('user*');  // 查询 user 开头的 key

type

返回值:取决于 key 指向的数据的类型,返回值可能是:

  • string: Redis::REDIS_STRING
  • set: Redis::REDIS_SET
  • list: Redis::REDIS_LIST
  • zset: Redis::REDIS_ZSET
  • hash: Redis::REDIS_HASH
  • other: Redis::REDIS_NOT_FOUND

示例:

$redis->type('key');

append

参数:Key Value

返回值:追加后的值的大小,整型值。

示例:

$redis->set('key', 'value1');
$redis->append('key', 'value2'); /* 返回 12 */
$redis->get('key'); /* 'value1value2' */

getRange

获取子字符串。注意:substr 已经废弃。

参数:key start end

示例:

$redis->set('key', 'string value');
$redis->getRange('key', 0, 5); /* 'string' */
$redis->getRange('key', -5, -1); /* 'value' */

setRange

用指定的字符串替换 key 对应字符串的一部分。

参数:key offset value

返回值:修改后的字符串的长度。

示例:

$redis->set('key', 'Hello world');
$redis->setRange('key', 6, "redis"); /* 返回 11 */
$redis->get('key'); /* "Hello redis" */

strLen

示例:

$redis->set('key', 'value');
$redis->strlen('key'); /* 5 */

getBit

返回字符串中的一个位。

参数:key offset

返回值:位值,0 或 1,LONG 类型

示例:

$redis->set('key', "\x7f"); // 0111 1111
$redis->getBit('key', 0); /* 0 */
$redis->getBit('key', 1); /* 1 */

setBit

改变字符串的一个位。

参数:key offset value: bool or int (1 or 0)

返回值:要替换的位在替换前的值,0 或 1,LONG 类型

示例:

$redis->set('key', "*");   // ord("*") = 42 = 0x2f = "0010 1010"
$redis->setBit('key', 5, 1); /* returns 0 */
$redis->setBit('key', 7, 1); /* returns 0 */
$redis->get('key'); /* chr(0x2f) = "/" = b("0010 1111") */

bitOp

在多个 key 上指向位操作。

参数:

  • operation:操作,”AND”, “OR”, “NOT”, “XOR”
  • ret_key:返回的 key
  • key1
  • key2…

返回值:存储在目标 key 中的字符串的大小,LONG 类型

sort

对 list、set 或 sorted set 中的元素进行排序。

参数:

  • Key

  • array(key => value, …):可选,示例如下:

    ‘by’ => ‘some_pattern_*’,
    ‘limit’ => array(0, 1),
    ‘get’ => ‘some_other_pattern_*’ or an array of patterns,
    ‘sort’ => ‘asc’ or ‘desc’,
    ‘alpha’ => TRUE,
    ‘store’ => ‘external-key’

返回值:值组成的数组,或存储的元素个数(如果指定的话)。

示例:

$redis->delete('s');
$redis->sAdd('s', 5);
$redis->sAdd('s', 4);
$redis->sAdd('s', 2);
$redis->sAdd('s', 1);
$redis->sAdd('s', 3);

var_dump($redis->sort('s')); // 1,2,3,4,5
var_dump($redis->sort('s', array('sort' => 'desc'))); // 5,4,3,2,1
var_dump($redis->sort('s', array('sort' => 'desc', 'store' => 'out'))); // (int)5

dump

打印 Redis 数据库中的值,之后可以通过 RESTORE 命令将其传回 Redis。DUMP 返回的数据是 Redis 中存储的二进制。

返回值:Redis 编码过的 key,如果 key 不存在则返回 FALSE。

示例:

$redis->set('foo', 'bar');
$val = $redis->dump('foo');

编码参考这个例子:

127.0.0.1:6379> type hello
string
127.0.0.1:6379> dump hello
"\x00\xc0\x05\a\x00\x9c\x1d\x8a\x95\x8b\xe5fK"

restore

使用先前通过 dump 获得的序列化值创建 key。

参数:

  • key
  • ttl:整型。设置 0 时表示一直有效
  • value:字符串(二进制)。Redis 编码的值(来自 DUMP 命令)。

示例:

$redis->set('foo', 'bar');
$val = $redis->dump('foo');
$redis->restore('bar', 0, $val); // The key 'bar', will now be equal to the key 'foo'

migrate

将 key 迁移到另一个 Redis 实例。Redis 在 3.0.6 版本之后支持一次迁移多个 key。

参数:

  • host:字符串,目标主机
  • port:整型,TCP 端口号
  • key(s):字符串或数组
  • destination-db integer.:目标数据库的编号
  • timeout:这次迁移允许的最大时间
  • copy:boolean,可选。是否向 Redis 发送 COPY 标志
  • replace:boolean,可选。是否向 Redis 发送 REPLACE 标志

示例:

$redis->migrate('backup', 6379, 'foo', 0, 3600);
$redis->migrate('backup', 6379, 'foo', 0, 3600, true, true); /* copy and replace */
$redis->migrate('backup', 6379, 'foo', 0, 3600, false, true); /* just REPLACE flag */

/* Migrate multiple keys (requires Redis >= 3.0.6)
$redis->migrate('backup', 6379, ['key1', 'key2', 'key3'], 0, 3600);

LIST 列表操作

  • blPop, brPop:删除并获取列表中的第一个/最后一个元素
  • bRPopLPush:从列表中弹出一个值,将其推送到另一个列表并返回它
  • lIndex, lGet:通过索引从列表中获取元素
  • lInsert:通过索引从列表中获取元素
  • lLen, lSize:获取列表的长度/大小
  • lPop:删除并获取列表中的第一个元素
  • lPush:将一个或多个值添加到列表中
  • lPushx:仅当列表存在时,才将值添加到列表中
  • lRange, lGetRange:从列表中获取一系列元素
  • lRem, lRemove:从列表中删除元素
  • lSet:通过索引设置列表中元素的值
  • lTrim, listTrim:将列表修剪到指定范围
  • rPop:删除并返回列表的最后一个元素
  • rPopLPush:删除并返回列表的最后一个元素,并将其追加到另一个列表(>= 1.1)
  • rPush:向列表追加一个或多个值
  • rPushX:仅在列表存在的情况下,向列表追加一个或多个值

blPop 和 brPop

描述:是一个阻塞的 lPop(rPop)原语,开头的字母 b 表示 blocking。如果至少有一个列表包含至少一个元素,则该元素将从列表的头部弹出并返回给调用者。如果由参数传递的键所标识的所有列表都为空,则 blPop 将在指定的超时期间阻塞,直到元素被推送到其中一个列表,然后才弹出此元素并继续。

参数:

  • ARRAY,包含多个 key 的数组
  • INTEGER Timeout,超时时间

  • STRING Key1
  • STRING Key2
  • STRING Key3
  • STRING Keyn
  • INTEGER Timeout,超时时间

返回值:ARRAY array(‘listName’, ‘element’)

示例:

/* Non blocking feature */
$redis->lPush('key1', 'A');
$redis->delete('key2');

$redis->blPop('key1', 'key2', 10); /* array('key1', 'A') */
/* OR */
$redis->blPop(array('key1', 'key2'), 10); /* array('key1', 'A') */

$redis->brPop('key1', 'key2', 10); /* array('key1', 'A') */
/* OR */
$redis->brPop(array('key1', 'key2'), 10); /* array('key1', 'A') */

/* Blocking feature */

/* process 1 */
$redis->delete('key1');
$redis->blPop('key1', 10);
/* blocking for 10 seconds */

/* process 2 */
$redis->lPush('key1', 'A');

/* process 1 */
/* array('key1', 'A') is returned*/

bRPopLPush

rPopLPush 的阻塞版本,第三个参数是整型超时时间。

参数:

  • Key:源 key
  • Key:目标 key
  • Long timeout:超时时间

返回值:成功则返回 STRING 类型的元素,失败则返回 FALSE。

lIndex 和 lGet

返回列表中指定 key 对应的元素。

  • 0 表示第一个元素,1 表示第二个。。。
  • -1 表示最后一个元素,-2 表示倒数第二个。。。

Return FALSE in case of a bad index or a key that doesn’t point to a list.

参数:key index

返回值:成功则返回 STRING 类型的元素,失败返回 FALSE。

示例:

$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->rPush('key1', 'C'); /* key1 => [ 'A', 'B', 'C' ] */
$redis->lGet('key1', 0); /* 'A' */
$redis->lGet('key1', -1); /* 'C' */
$redis->lGet('key1', 10); /* `FALSE` */

lInsert

在列表中指定的值之前或之后插入值。

参数选项指定插入的位置(之前或之后)。如果列表不存在,或者指定的值不存在,则不插入该值。

参数:

  • key
  • position Redis::BEFORE | Redis::AFTER
  • pivot,指定的值
  • value

返回值:成功则返回列表中的元素个数,如果 pivot 不存在则返回 -1.

示例:

$redis->delete('key1');
$redis->lInsert('key1', Redis::AFTER, 'A', 'X'); /* 0 */

$redis->lPush('key1', 'A');
$redis->lPush('key1', 'B');
$redis->lPush('key1', 'C');

$redis->lInsert('key1', Redis::BEFORE, 'C', 'X'); /* 4 */
$redis->lRange('key1', 0, -1); /* array('A', 'B', 'X', 'C') */

$redis->lInsert('key1', Redis::AFTER, 'C', 'Y'); /* 5 */
$redis->lRange('key1', 0, -1); /* array('A', 'B', 'X', 'C', 'Y') */

$redis->lInsert('key1', Redis::AFTER, 'W', 'value'); /* -1 */

lPop 和 rPop

返回并删除列表的第一个(最后一个)元素。

返回值:成功则返回 STRING 类型的元素,失败(空列表)则返回 FALSE。

示例:

$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->rPush('key1', 'C'); /* key1 => [ 'A', 'B', 'C' ] */
$redis->lPop('key1'); /* key1 => [ 'B', 'C' ] */
$redis->rPop('key1'); /* key1 => [ 'B' ] */

lPush 和 rPush

向列表左侧(右侧)添加字符串。如果 key 不存在则创建。如果 key 已经存在但不是列表,返回 FALSE。

参数:key value

返回值:成功则返回列表的新长度,失败则返回 FALSE。

示例:

$redis->delete('key1');
$redis->lPush('key1', 'C'); // returns 1
$redis->lPush('key1', 'B'); // returns 2
$redis->lPush('key1', 'A'); // returns 3
$redis->rPush('key1', 'X'); // returns 3
/* key1 now points to the following list: [ 'A', 'B', 'C', 'X' ] */

lRange 和 lGetRange

返回列表中指定的范围 [start, end] 对应的部分元素。start 和 end 的用法如下:

  • 0 表示第一个元素,1 表示第二个。。。
  • -1 表示最后一个元素,-2 表示倒数第二个。。。

参数:key start end

示例:

$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->rPush('key1', 'C');
$redis->lRange('key1', 0, -1); /* array('A', 'B', 'C') */

lRem 和 lRemove

从列表中删除 value 元素的 count 次。如果 count 为零,则删除所有匹配元素。如果 count 为负数,则从尾部到头部移除元素。

注意:这里的参数顺序跟 Redis 文档不同(兼容性)。

参数:key value count

返回值:LONG 类型的要删除的元素个数,如果 key 对应的不是列表则返回 FALSE。

示例:

$redis->lPush('key1', 'A');
$redis->lPush('key1', 'B');
$redis->lPush('key1', 'C');
$redis->lPush('key1', 'A');
$redis->lPush('key1', 'A');

$redis->lRange('key1', 0, -1); /* array('A', 'A', 'C', 'B', 'A') */
$redis->lRem('key1', 'A', 2); /* 2 */
$redis->lRange('key1', 0, -1); /* array('C', 'B', 'A') */

lSet

设置指定索引处的值。

参数:key index value

返回值:成功则返回 TRUE。失败返回 FALSE。

示例:

$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->rPush('key1', 'C'); /* key1 => [ 'A', 'B', 'C' ] */
$redis->lGet('key1', 0); /* 'A' */
$redis->lSet('key1', 0, 'X');
$redis->lGet('key1', 0); /* 'X' */

rPopLPush

从一个列表最后弹出一个元素,并放入另一个列表的头部。返回值是这个元素。

参数: srckey dstkey

返回值:STRING 类型,移动位置的元素。失败则返回 FALSE。

示例:

$redis->delete('x', 'y');

$redis->lPush('x', 'abc');
$redis->lPush('x', 'def');
$redis->lPush('y', '123');
$redis->lPush('y', '456');

// move the last of x to the front of y.
var_dump($redis->rPopLPush('x', 'y'));
var_dump($redis->lRange('x', 0, -1));
var_dump($redis->lRange('y', 0, -1));

输出:

string(3) "abc"
array(1) {
  [0]=>
  string(3) "def"
}
array(3) {
  [0]=>
  string(3) "abc"
  [1]=>
  string(3) "456"
  [2]=>
  string(3) "123"
}

lLen 和 lSize

返回指定列表的大小。

列表不存在或列表为空时,返回 0。如果数据不是列表类型,返回 FALSE。

示例:

$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->rPush('key1', 'C'); /* key1 => [ 'A', 'B', 'C' ] */
$redis->lSize('key1');/* 3 */
$redis->rPop('key1');
$redis->lSize('key1');/* 2 */

SET 集合操作

  • sAdd:向集合中添加一个或多个元素
  • sCard, sSize:获取集合的元素个数(cardinality )
  • sDiff:求集合的差集
  • sDiffStore:求集合的差集并将结果集存储在一个 key 中
  • sInter:求集合的交集
  • sInterStore:求集合的交集并将结果集存储在一个 key 中
  • sIsMember, sContains:判断某个元素是否在集合中
  • sMembers, sGetMembers:获取集合中的所有元素
  • sMove:将元素从一个集合移动到另一个集合
  • sPop:随机删除并返回一个或多个集合的元素
  • sRandMember:从集合中随机获取一个或多个成员
  • sRem, sRemove:从集合中删除一个或多个元素
  • sUnion:求集合的并集
  • sUnionStore:求集合的并集并将结果集存储在一个 key 中
  • sScan:扫描成员的集合

sAdd

参数:key value

返回值:添加到集合中的元素个数,LONG 类型。如果值已经存在则返回 FALSE。

示例:

$redis->sAdd('key1' , 'member1'); /* 1, 'key1' => {'member1'} */
$redis->sAdd('key1' , 'member2', 'member3'); /* 2, 'key1' => {'member1', 'member2', 'member3'}*/
$redis->sAdd('key1' , 'member2'); /* 0, 'key1' => {'member1', 'member2', 'member3'}*/

sCard, sSize

返回值:key 对应的集合的基数,LONG 类型,如果该集合不存在,则为 0。

示例:

$redis->sAdd('key1' , 'member1');
$redis->sAdd('key1' , 'member2');
$redis->sAdd('key1' , 'member3'); /* 'key1' => {'member1', 'member2', 'member3'}*/
$redis->sCard('key1'); /* 3 */
$redis->sCard('keyX'); /* 0 */

sDiff

参数:

  • Keys: key1, key2, … , keyN:任意数量的集合

返回值:字符串数组,第一个集合相对于所有其他集合的差集。

示例:

$redis->delete('s0', 's1', 's2');

$redis->sAdd('s0', '1');
$redis->sAdd('s0', '2');
$redis->sAdd('s0', '3');
$redis->sAdd('s0', '4');

$redis->sAdd('s1', '1');
$redis->sAdd('s2', '3');

var_dump($redis->sDiff('s0', 's1', 's2'));

返回值:所有在 s0 中且不在 s1 和 s2 中的元素。

array(2) {
  [0]=>
  string(1) "4"
  [1]=>
  string(1) "2"
}

sDiffStore

类似 sDiff,但是将结果存储在第一个 key 对应的集合中。

参数:

  • Key: dstkey,用于存储结果的集合对应的 key
  • Keys: key1, key2, … , keyN:任意数量的集合

返回值:整型 INTEGER,结果集合的数量,如果 key 不存在则返回 FALSE。

示例:

$redis->delete('s0', 's1', 's2');

$redis->sAdd('s0', '1');
$redis->sAdd('s0', '2');
$redis->sAdd('s0', '3');
$redis->sAdd('s0', '4');

$redis->sAdd('s1', '1');
$redis->sAdd('s2', '3');

var_dump($redis->sDiffStore('dst', 's0', 's1', 's2'));
var_dump($redis->sMembers('dst'));

返回值:所有在 s0 中且不在 s1 和 s2 中的元素的个数。

int(2)
array(2) {
  [0]=>
  string(1) "4"
  [1]=>
  string(1) "2"
}

sIsMember, sContains

参数:key value

返回值:如果元素存在则返回 TRUE,否则返回 FALSE。

示例:

$redis->sAdd('key1' , 'member1');
$redis->sAdd('key1' , 'member2');
$redis->sAdd('key1' , 'member3'); /* 'key1' => {'member1', 'member2', 'member3'}*/

$redis->sIsMember('key1', 'member1'); /* TRUE */
$redis->sIsMember('key1', 'memberX'); /* FALSE */

sMembers, sGetMembers

返回值:元素数组,集合的元素。

示例:

$redis->delete('s');
$redis->sAdd('s', 'a');
$redis->sAdd('s', 'b');
$redis->sAdd('s', 'a');
$redis->sAdd('s', 'c');
var_dump($redis->sMembers('s'));

输出:

array(3) {
  [0]=>
  string(1) "c"
  [1]=>
  string(1) "a"
  [2]=>
  string(1) "b"
}

ZSET 有序集合操作

  • zAdd:向 sorted set 添加一个或多个元素,如果已经存在则更新其分数 score
  • zCard, zSize:获取 sorted set 中元素的个数
  • zCount:返回分值在给定范围内的成员个数
  • zIncrBy:增加 sorted set 中某个成员的分值 score
  • zInter:求有序集的交集并将生成的有序集存储在新的 key 中
  • zRange:返回一个 index 索引范围内的成员
  • zRangeByScore, zRevRangeByScore:返回一个 score 范围内的成员
  • zRangeByLex:返回具有相同分数的成员的词典范围(lexicographical range)
  • zRank, zRevRank:确定 sorted set 中成员的索引
  • zRem, zDelete:从 sorted set 中删除一个或多个成员
  • zRemRangeByRank, zDeleteRangeByRank:删除 sorted set 中在指定的索引中的所有成员
  • zRemRangeByScore, zDeleteRangeByScore:删除 sorted set 中在指定的分数中的所有成员
  • zRevRange:返回一个 index 索引范围内的成员,分数从高到低排序
  • zScore:获取指定成员的分值
  • zUnion:求有序集的交集并将生成的有序集存储在新的 key 中
  • zScan:扫描有序集的成员

zAdd

参数:

  • key score: double
  • value: string

返回值:成功添加元素时返回 1,否则返回 0。

示例:

$redis->zAdd('key', 1, 'val1');
$redis->zAdd('key', 0, 'val0');
$redis->zAdd('key', 5, 'val5');
$redis->zRange('key', 0, -1); // array(val0, val1, val5)

zCard 和 zSize

示例:

$redis->zAdd('key', 0, 'val0');
$redis->zAdd('key', 2, 'val2');
$redis->zAdd('key', 10, 'val10');
$redis->zSize('key'); /* 3 */

zCount

返回分值在给定范围 [start,end] 内的成员个数。在开始或结束之前添加括号将其从范围中排除。 +inf-inf 也是有效的。

参数:

  • key
  • start: string
  • end: string

返回值:元素个数,LONG 类型。

示例:

$redis->zAdd('key', 0, 'val0');
$redis->zAdd('key', 2, 'val2');
$redis->zAdd('key', 10, 'val10');
$redis->zCount('key', 0, 3); /* 2, corresponding to array('val0', 'val2') */

zIncrBy

参数:

  • key
  • value: (double) 要设置的分值
  • member

返回值:新的分值,DOUBLE 类型。

示例:

$redis->delete('key');
$redis->zIncrBy('key', 2.5, 'member1'); /* key 或 member1 不存在,所以 member1 的分值默认是 0,现在是 2.5 */
$redis->zIncrBy('key', 1, 'member1'); /* 3.5 */

zRangeByScore 和 zRevRangeByScore

返回存储在指定键中的分数范围为 [start,end] 的元素。在开始或结束之前添加括号将其从范围中排除。

参数:

  • key
  • start: string
  • end: string
  • options: array
    两个可选参数:withscores => TRUElimit => array($offset, $count)

示例:

$redis->zAdd('key', 0, 'val0');
$redis->zAdd('key', 2, 'val2');
$redis->zAdd('key', 10, 'val10');
$redis->zRangeByScore('key', 0, 3); /* array('val0', 'val2') */
$redis->zRangeByScore('key', 0, 3, array('withscores' => TRUE); /* array('val0' => 0, 'val2' => 2) */
$redis->zRangeByScore('key', 0, 3, array('limit' => array(1, 1)); /* array('val2') */
$redis->zRangeByScore('key', 0, 3, array('withscores' => TRUE, 'limit' => array(1, 1)); /* array('val2' => 2) */

zRangeByLex

假设成员具有相同的分数,则返回有序集合中的词典范围的成员。最小值和最大值需要以’(’(不包括),’[‘(包括)开头,或者恰好是值’ - ‘(负inf)或’+’(正inf)。调用该命令时必须使用三个或五个参数,否则将返回 FALSE

参数:

  • key:ZSET 集合对应的键
  • min:希望获得的最小字母数字值
  • max:希望获得的最大字母数字值
  • offset:可选参数,用于从第一个元素以外的其他位置开始
  • limit:可选参数,用于限制返回元素个数

返回值:数组,由在指定范围内的值组成

示例:

foreach(Array('a','b','c','d','e','f','g') as $c)
    $redis->zAdd('key',0,$c);

$redis->zRangeByLex('key','-','[c') /* Array('a','b','c'); */
$redis->zRangeByLex('key','-','(c') /* Array('a','b') */
$redis->zRangeByLex('key','-','[c',1,2) /* Array('b','c') */

zRank 和 zRevRank

返回指定有序集合中给定成员的等级 rank,从 0 开始,分值最小的项目是 0。zRevRank 命令对于分值最高的项目是 0。

参数:key member

返回值:分值

示例:

$redis->delete('z');
$redis->zAdd('key', 1, 'one');
$redis->zAdd('key', 2, 'two');
$redis->zRank('key', 'one'); /* 0 */
$redis->zRank('key', 'two'); /* 1 */
$redis->zRevRank('key', 'one'); /* 1 */
$redis->zRevRank('key', 'two'); /* 0 */

zRem 和 zDelete

参数:key member

返回值:成功则返回 1,失败则返回 0。

示例:

$redis->zAdd('key', 0, 'val0');
$redis->zAdd('key', 2, 'val2');
$redis->zAdd('key', 10, 'val10');
$redis->zDelete('key', 'val2');
$redis->zRange('key', 0, -1); /* array('val0', 'val10') */

zRemRangeByRank 和 zDeleteRangeByRank

删除有序集合中,rank 范围在 [start,end] 的元素。

参数:key start end

返回值:删除的元素的个数,LONG 类型

示例:

$redis->zAdd('key', 1, 'one');
$redis->zAdd('key', 2, 'two');
$redis->zAdd('key', 3, 'three');
$redis->zRemRangeByRank('key', 0, 1); /* 2 */
$redis->zRange('key', 0, -1, array('withscores' => TRUE)); /* array('three' => 3) */

zRemRangeByScore 和 zDeleteRangeByScore

参数:

  • key
  • start: double or “+inf” or “-inf” string
  • end: double or “+inf” or “-inf” string

示例:

$redis->zAdd('key', 0, 'val0');
$redis->zAdd('key', 2, 'val2');
$redis->zAdd('key', 10, 'val10');
$redis->zRemRangeByScore('key', 0, 3); /* 2 */

HASH 哈希表操作

  • hDel:删除一个或多个 hash 字段
  • hExists:判断 hash 字段是否存在
  • hGet:获取一个 hash 字段的值
  • hGetAll:获取一个 hash 中所有字段的值
  • hIncrBy:为整型的 hash 字段值增加指定的大小
  • hIncrByFloat:为浮点型的 hash 字段值增加指定的大小
  • hKeys:获取 hash 中的所有字段
  • hLen:获取 hash 中的字段个数
  • hMGet:获取所有指定的 hash 字段的值
  • hMSet:设置多个 hash 字段的值
  • hSet:设置一个 hash 字段的值
  • hSetNx:仅在字段不存在时,才设置一个 hash 字段的值
  • hVals:获取 hash 中的所有值
  • hScan:扫描 hash key,查找成员
  • hStrLen:获取与 hash 中的字段关联的值的字符串长度

hSet

向指定的 key 对应的 hash 中添加键值对。

参数:key hashKey value

返回值:如果值不存在且添加成功,则返回 LONG 1。如果值已经存在且替换,则返回 0。出错则返回 FALSE。

示例:

$redis->delete('h')
$redis->hSet('h', 'key1', 'hello'); /* 返回 1,在 hash 表"h"中有键值对 'key1' => 'hello' */
$redis->hGet('h', 'key1'); /* 返回 "hello" */

$redis->hSet('h', 'key1', 'plop'); /* 返回 0, 值被替换 */
$redis->hGet('h', 'key1'); /* 返回 "plop" */

hGet

获取 hash 中在指定的 key 中存储的值。如果 hash 表不存在,或 key 不存在,则返回 FALSE。

参数:key hashKey

返回值:如果命令成功执行则返回 STRING 类型的值,否则返回 BOOL 类型的 FALSE。

hLen

返回值:如果 key 不存在或不是 hash 表,则返回 FALSE。否则返回 LONG 类型的元素个数。

示例:

$redis->delete('h')
$redis->hSet('h', 'key1', 'hello');
$redis->hSet('h', 'key2', 'plop');
$redis->hLen('h'); /* 返回 2 */

hDel

参数:key hashKey1 hashKey2 …

返回值:删除的元素的个数,LONG 类型。如果 key 不存在则返回 0.如果 key 对应的不是 hash 表,则返回 FALSE。

hKeys

返回 hash 表中的 key 对应的字符串组成的数组,顺序是随机的,对应于 redis 自己的集合结构的内部表示。

返回值:由 key 对应的字符串组成的数组。类似于 PHP 中的 array_keys() 函数。

示例:

$redis->delete('h');
$redis->hSet('h', 'a', 'x');
$redis->hSet('h', 'b', 'y');
$redis->hSet('h', 'c', 'z');
$redis->hSet('h', 'd', 't');
var_dump($redis->hKeys('h'));

输出:

array(4) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
}

hVals

返回 hash 表中的值对应的字符串组成的数组,顺序是随机的,对应于 redis 自己的集合结构的内部表示。

返回值:由值对应的字符串组成的数组。类似于 PHP 中的 array_keys() 函数。

示例:

$redis->delete('h');
$redis->hSet('h', 'a', 'x');
$redis->hSet('h', 'b', 'y');
$redis->hSet('h', 'c', 'z');
$redis->hSet('h', 'd', 't');
var_dump($redis->hVals('h'));

输出:

array(4) {
  [0]=>
  string(1) "x"
  [1]=>
  string(1) "y"
  [2]=>
  string(1) "z"
  [3]=>
  string(1) "t"
}

hGetAll

获取 hash 中所有的键值对。

示例:

$redis->delete('h');
$redis->hSet('h', 'a', 'x');
$redis->hSet('h', 'b', 'y');
$redis->hSet('h', 'c', 'z');
$redis->hSet('h', 'd', 't');
var_dump($redis->hGetAll('h'));

输出:

array(4) {
  ["a"]=>
  string(1) "x"
  ["b"]=>
  string(1) "y"
  ["c"]=>
  string(1) "z"
  ["d"]=>
  string(1) "t"
}

hExists

参数:key memberKey

示例:

$redis->hSet('h', 'a', 'x');
$redis->hExists('h', 'a'); /*  TRUE */
$redis->hExists('h', 'NonExistingKey'); /* FALSE */

hIncrBy

参数:key member value(integer 类型)

返回值:增加后的新值。

示例:

$redis->delete('h');
$redis->hIncrBy('h', 'x', 2); /* returns 2: h[x] = 2 now. */
$redis->hIncrBy('h', 'x', 1); /* h[x] ← 2 + 1. Returns 3 */

hMSet

非字符串类型会被自动用 (string) 转为字符串。NULL 会被转为空字符串。

参数:key members(数组类型的键值对)

返回值:BOOL

示例:

$redis->delete('user:1');
$redis->hMSet('user:1', array('name' => 'Joe', 'salary' => 2000));
$redis->hIncrBy('user:1', 'salary', 100);

hMGet

参数:key memberKeys(数组)

示例:

$redis->delete('h');
$redis->hSet('h', 'field1', 'value1');
$redis->hSet('h', 'field2', 'value2');
$redis->hMGet('h', array('field1', 'field2')); /* 返回 array('field1' => 'value1', 'field2' => 'value2') */

hScan

扫描 HASH 表,查找成员,支持两个额外参数:模式 pattern,数量 count

参数:

  • key:String 类型
  • iterator:Long(参考)
  • pattern:可选,要匹配的模式
  • count:一次性返回多少键

返回值:匹配的数组

示例:

$it = NULL;
/* Don't ever return an empty array until we're done iterating */
$redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY);
while($arr_keys = $redis->hScan('hash', $it)) {
    foreach($arr_keys as $str_field => $str_value) {
        echo "$str_field => $str_value\n"; /* Print the hash member and value */
    }
}

hStrLen

获取 hash 中指定的 key 对应的字符串长度。

参数:key field

返回值:字符串长度,LONG 类型。如果 key 不存在则返回 0。

PUB/SUB 发布订阅操作

  • pSubscribe:按模式订阅频道 channel
  • publish:向 channel 发送消息
  • subscribe:订阅 channel
  • pubSub:对 pub/sub 子系统的内省 Introspection,获取 Redis 的发布订阅子系统的信息

publish

参数:

  • channel:消息要发送到的频道 channel
  • message:string

示例:

$redis->publish('chan-1', 'hello, world!');

subscribe

参数:

  • channels:数组,由订阅的多个 channel 组成
  • callback:字符串或数组 ($instance, 'method_name')。回调函数接收 3 个参数:redis 实例,channel 名字,消息
  • return value:多种类型。回调函数中的非空返回值将被返回给调用者

示例:

function f($redis, $chan, $msg) {
    switch($chan) {
        case 'chan-1':
            ...
            break;

        case 'chan-2':
            ...
            break;

        case 'chan-2':
            ...
            break;
    }
}

$redis->subscribe(array('chan-1', 'chan-2', 'chan-3'), 'f'); // 订阅 3 个频道

pSubscribe 按模式订阅频道

参数:

  • patterns:要匹配的模式数组
  • callback:字符串,或一个包含对象和方法的数组。会传入 4 个参数:($redis, $pattern, $channel, $message)
  • return value:多种类型。回调函数中的非空返回值将被返回给调用者

示例:

function pSubscribe($redis, $pattern, $chan, $msg) {
    echo "Pattern: $pattern\n";
    echo "Channel: $chan\n";
    echo "Payload: $msg\n";
}

pubSub

参数:

  • keyword:String 类型,可能的值有:”channels”, “numsub” 或 “numpat”
  • argument:参数,可选,对不同的 keyword 不同。对于 “channels” 子命令,可以用模式字符串。对于 “numsub” 可以用 channel 数组

返回值:

  • CHANNELS:返回一个数组,其成员是匹配的 channel
  • NUMSUB返回一个 key/value 数组,其中 keys 是 channel 名字,values 是他们的值
  • NUMPAT:整数返回,包含活动的模式订阅的数量

示例:

$redis->pubSub("channels"); /*所有的 channel */
$redis->pubSub("channels", "*pattern*"); /* 匹配指定模式的 channel */
$redis->pubSub("numsub", Array("chan1", "chan2")); /* 获取 'chan1' 和 'chan2' 的订阅数*/
$redis->pubSub("numpat"); /* 模式订阅的数量 */
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这