Redis
目录
Redis 连接池配置方式已经在连接池里讲过,这里就不重复了,直接说使用方法。
连接池配置
连接池适用于 Swoole 环境
标准写法:
从 imi v1.2.1 版本开始支持
<?php
return [
'redis' => [
'defaultPool' => 'alias1', // 默认连接池
'quickFromRequestContext' => true, // 从当前上下文中获取公用连接
],
'pools' => [
// 连接池名称
'alias1' => [
'pool' => [
// 协程池类名
'class' => \Imi\Swoole\Redis\Pool\CoroutineRedisPool::class,
// 同步池类名,一般用不着
// 'class' => \Imi\Redis\SyncRedisPool::class,
'config' => [
// 池子中最多资源数
// 'maxResources' => 10,
// 池子中最少资源数
// 'minResources' => 2,
// 资源回收时间间隔,单位:秒
// 'gcInterval' => 60,
// 获取资源最大存活时间,单位:秒
// 'maxActiveTime' => 3600,
// 等待资源最大超时时间,单位:毫秒
// 'waitTimeout' => 3000,
// 心跳时间间隔,单位:秒
// 'heartbeatInterval' => null,
// 当获取资源时,是否检查状态
// 'checkStateWhenGetResource' => true,
// 每次获取资源最长使用时间,单位:秒;为 null 则不限制
// 'maxUsedTime' => null,
// 资源创建后最大空闲回收时间,单位:秒;为 null 则不限制
// 'maxIdleTime' => null,
// 当前请求上下文资源检查状态间隔,单位:支持小数的秒;为 null 则不限制
// 'requestResourceCheckInterval' => 30,
// 负载均衡-轮询
// 'resourceConfigMode' => ResourceConfigMode::ROUND_ROBIN,
// 负载均衡-随机
// 'resourceConfigMode' => ResourceConfigMode::RANDOM,
],
],
// 数组资源配置
'resource' => [
// --- 单机模式配置 ---
// 'mode' => \Imi\Redis\Enum\RedisMode::STANDALONE,
// --- Tcp 连接参数示范 ---
// 'host' => '127.0.0.1',
// 'port' => 6379,
// --- Unix Socket 连接参数示范(仅支持单机模式) ---
// 'host' => '/var/run/redis/redis-server.sock',
// 是否自动序列化变量
// 'serialize' => true,
// 密码
// 'password' => null,
// 第几个库
// 'db' => 0,
// --- 哨兵模式配置 ---
'mode' => \Imi\Redis\Enum\RedisMode::SENTINEL,
'master' => 'master 名称',
'nodes' => [
// 支持两种格式
// 格式一
'127.0.0.1:6379',
// 格式二
[
'host' => '127.0.0.1'
'port' => 6379,
],
],
'timeout' => null,
'retryInterval' => null,
'readTimeout' => null,
// --- 集群模式配置 ---
'mode' => \Imi\Redis\Enum\RedisMode::CLUSTER,
'seeds' => [
'127.0.0.1:6379',
'127.0.0.1:6380',
],
'name' => null,
'persistent' => null,
'timeout' => null,
'readTimeout' => null,
],
// uri资源配置,以分号;分隔多个,参数使用query参数格式,特殊字符需要转码
// 'resource' => 'tcp://192.168.0.222?timeout=60&db=1;tcp://192.168.0.222',
// uri资源配置,Unix Socket 连接参数示范(仅支持单机模式)
// 'resource' => 'unix:///var/run/redis/redis-server.sock?db=1',
],
],
];
单例配置
用于 php-fpm、Workerman 下
<?php
return [
'redis' => [
'defaultPool' => 'alias1', // 默认连接名
'quickFromRequestContext' => true, // 从当前上下文中获取公用连接
'connections' => [
'alias1' => [
// --- Tcp 连接参数示范 ---
// 'host' => '127.0.0.1',
// 'port' => 6379,
// --- Unix Socket 连接参数示范(仅支持单机模式) ---
// 'host' => '/var/run/redis/redis-server.sock',
// 是否自动序列化变量
// 'serialize' => true,
// 密码
// 'password' => null,
// 第几个库
// 'db' => 0,
// 当获取资源时,是否检查状态
// 'checkStateWhenGetResource' => true,
// 心跳时间间隔,单位:秒
// 'heartbeatInterval' => null,
],
],
],
];
基本使用
与原生 Redis 类操作方式基本一致,这里无需多说。
获取对象
use \Imi\Redis\RedisManager;
$redis = RedisManager::getInstance();
$redis->set('imi:redis:test', date('Y-m-d H:i:s'));
$datetime = $redis->get('imi:redis:test');
获取新对象
每次调用都尝试从连接池中获取新的对象,要注意每次用完需要手动释放!
use \Imi\Redis\RedisManager;
$redis = RedisManager::getNewInstance();
// $redis = RedisManager::getNewInstance($poolName);
RedisManager::release($redis);
获取默认连接池名称
use \Imi\Redis\RedisManager;
echo RedisManager::getDefaultPoolName();
便捷操作
Redis::方法名()
use \Imi\Redis\Redis;
Redis::set('imi:redis:test', date('Y-m-d H:i:s'));
$datetime = Redis::get('imi:redis:test');
回调方式使用Redis
$result = Redis::use(function(\Imi\Redis\RedisHandler $redis){
$redis->set('a', 1);
return true;
}); // true
进阶使用
$redis = RedisManager::getInstance();
$redis->方法名();
或
\Imi\Redis\Redis::方法名();
evalEx
imi 封装了一个基于 evalSha
和 eval
的便捷方法,优先使用 evalSha
尝试,失败则使用 eval
方法。
定义:public function evalEx($script, $args = null, $num_keys = null)
return false !== $redis->evalEx(<<<SCRIPT
redis.call('set', 'a', '123')
return redis.call('get', 'a')
SCRIPT
);
scanEach
scan
方法的扩展简易遍历方法
参数与 scan
基本一致,无需传递 it
参数
foreach(Redis::scanEach('imi:scanEach:*', 10) as $value)
{
var_dump($value);
}
hscanEach
hscan
方法的扩展简易遍历方法
参数与 hscan
基本一致,无需传递 it
参数
foreach(Redis::hscanEach($key, 'value:*', 10) as $k => $value)
{
var_dump($k, $value);
}
sscanEach
sscan
方法的扩展简易遍历方法
参数与 sscan
基本一致,无需传递 it
参数
foreach(Redis::sscanEach($key, '*', 10) as $value)
{
var_dump($value);
}
zscanEach
zscan
方法的扩展简易遍历方法
参数与 zscan
基本一致,无需传递 it
参数
foreach(Redis::zscanEach($key, '*', 10) as $score)
{
var_dump($value);
}