安装 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
参数:可选,例如 COMMANDSTATS
、CPU
。
示例:
$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 秒有效期
del、delete 和 unlink
参数: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 => TRUE
,limit => 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"); /* 模式订阅的数量 */