安装步骤参考链接
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');
$redis->connect('127.0.0.1', 6379, 2.5);
$redis->connect('/tmp/redis.sock');
$redis->connect('127.0.0.1', 6379, 1, NULL, 100);
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);
$redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_IGBINARY);
$redis->setOption(Redis::OPT_PREFIX, 'myAppName:');
$redis->setOption(Redis::OPT_SCAN, Redis::SCAN_NORETRY);
$redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY);
getOption
返回设置的选项。
示例:
$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 操作会返回关联数组: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:布尔值,取决于操作是否成功
示例:
$redis->slowLog('get', 10);
$redis->slowLog('get');
$redis->slowLog('reset');
$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
<?php
...
$arr = $redis->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');
$redis->set('key','value', 10);
$redis->set('key', 'value', Array('nx', 'ex'=>10));
$redis->set('key', 'value', Array('xx', 'px'=>1000));
setex 和 psetex
参数:Key TTL Value
示例:
$redis->setEx('key', 3600, 'value');
$redis->pSetEx('key', 100, 'value');
del、delete 和 unlink
参数:key 的数组,或直接用不限数量的 key。
注意:unlink 方法与使用 del 完全相同,unlink 命令是非阻塞的,并且将异步执行实际删除。需要 > = 4.0.0 的版本才支持。
返回值:已删除的 key 的个数。
示例:
$redis->delete('key1', 'key2');
$redis->delete(array('key3', 'key4'));
$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');
$newValue = $redis->get('x')' // 返回 'lol'
move
将 key 移动到另一个数据库。Redis 中的数据库编号从 0 开始。
参数:
- key
- dbindex,整型,要移动到的数据库的编号
返回值:BOOL 值,成功返回 TRUE,失败返回 FALSE。e.
示例:
$redis->select(0);
$redis->set('x', '42');
$redis->move('x', 1);
$redis->select(1);
$redis->get('x');
expire、setTimeout 和 pexpire
参数:
示例:
$redis->set('x', '42');
$redis->setTimeout('x', 3);
sleep(5);
$redis->get('x');
expireAt 和 pexpireAt
参数:
示例:
$redis->set('x', '42');
$now = time();
$redis->expireAt('x', $now + 3);
sleep(5);
$redis->get('x');
keys 和 getKeys
参数:pattern 模式,字符串类型,通配符是“*”。
返回值:STRING 类型组成的数组。
示例:
$allKeys = $redis->keys('*');
$keyWithUserPrefix = $redis->keys('user*');
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');
$redis->get('key');
getRange
获取子字符串。注意:substr 已经废弃。
参数:key start end
示例:
$redis->set('key', 'string value');
$redis->getRange('key', 0, 5);
$redis->getRange('key', -5, -1);
setRange
用指定的字符串替换 key 对应字符串的一部分。
参数:key offset value
返回值:修改后的字符串的长度。
示例:
$redis->set('key', 'Hello world');
$redis->setRange('key', 6, "redis");
$redis->get('key');
strLen
示例:
$redis->set('key', 'value');
$redis->strlen('key');
getBit
返回字符串中的一个位。
参数:key offset
返回值:位值,0 或 1,LONG 类型
示例:
$redis->set('key', "\x7f");
$redis->getBit('key', 0);
$redis->getBit('key', 1);
setBit
改变字符串的一个位。
参数:key offset value: bool or int (1 or 0)
返回值:要替换的位在替换前的值,0 或 1,LONG 类型
示例:
$redis->set('key', "*");
$redis->setBit('key', 5, 1);
$redis->setBit('key', 7, 1);
$redis->get('key');
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'));
var_dump($redis->sort('s', array('sort' => 'desc')));
var_dump($redis->sort('s', array('sort' => 'desc', 'store' => 'out')));
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);
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’)
示例:
$redis->lPush('key1', 'A');
$redis->delete('key2');
$redis->blPop('key1', 'key2', 10);
$redis->blPop(array('key1', 'key2'), 10);
$redis->brPop('key1', 'key2', 10);
$redis->brPop(array('key1', 'key2'), 10);
$redis->delete('key1');
$redis->blPop('key1', 10);
$redis->lPush('key1', 'A');
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');
$redis->lGet('key1', 0);
$redis->lGet('key1', -1);
$redis->lGet('key1', 10);
lInsert
在列表中指定的值之前或之后插入值。
参数选项指定插入的位置(之前或之后)。如果列表不存在,或者指定的值不存在,则不插入该值。
参数:
- key
- position Redis::BEFORE | Redis::AFTER
- pivot,指定的值
- value
返回值:成功则返回列表中的元素个数,如果 pivot 不存在则返回 -1.
示例:
$redis->delete('key1');
$redis->lInsert('key1', Redis::AFTER, 'A', 'X');
$redis->lPush('key1', 'A');
$redis->lPush('key1', 'B'
请发表评论