本文目录导读:

我来详细说明PHP项目中使用Redis的连接和操作方法。
安装Redis扩展
使用PECL安装
# 安装Redis扩展 pecl install redis # 或者安装特定版本 pecl install redis-5.3.7
在php.ini中启用
extension=redis
Docker环境
RUN pecl install redis && docker-php-ext-enable redis
连接Redis
基础连接
<?php
// 创建Redis实例
$redis = new Redis();
// 连接Redis服务器
$redis->connect('127.0.0.1', 6379);
// 带超时设置
$redis->connect('127.0.0.1', 6379, 5.0); // 5秒超时
// 使用pconnect(持久连接)
$redis->pconnect('127.0.0.1', 6379);
带密码连接
<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// 认证密码
$redis->auth('your_password');
// 或者连接时直接认证
$redis->connect('127.0.0.1', 6379, 5.0, NULL, 0, 0, ['auth' => 'your_password']);
连接池配置
<?php
$redis = new Redis();
// 配置连接池
$redis->connect('127.0.0.1', 6379, 5.0, NULL, 0, 0, [
'prefix' => 'myapp:', // 键前缀
'serializer' => Redis::SERIALIZER_PHP, // 序列化方式
'timeout' => 5.0, // 超时时间
'read_timeout' => 10.0 // 读取超时
]);
基本操作
字符串操作
<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// 设置值
$redis->set('key', 'value');
$redis->set('key', 'value', 3600); // 过期时间3600秒
// 获取值
$value = $redis->get('key');
// 批量设置
$redis->mset(['key1' => 'val1', 'key2' => 'val2']);
// 批量获取
$values = $redis->mget(['key1', 'key2']);
// 自增自减
$redis->incr('counter');
$redis->incrBy('counter', 5);
$redis->decr('counter');
$redis->decrBy('counter', 2);
列表操作
<?php
// 添加元素
$redis->rPush('list_key', 'element1');
$redis->lPush('list_key', 'element2');
// 获取列表
$list = $redis->lRange('list_key', 0, -1);
// 弹出元素
$element = $redis->lPop('list_key');
$element = $redis->rPop('list_key');
// 获取长度
$length = $redis->lLen('list_key');
哈希操作
<?php
// 设置哈希字段
$redis->hSet('user:1', 'name', 'John');
$redis->hSet('user:1', 'age', 30);
// 批量设置
$redis->hMset('user:1', [
'name' => 'Jane',
'age' => 25,
'email' => 'jane@example.com'
]);
// 获取字段
$name = $redis->hGet('user:1', 'name');
$user = $redis->hGetAll('user:1');
$fields = $redis->hMget('user:1', ['name', 'age']);
// 删除字段
$redis->hDel('user:1', 'email');
集合操作
<?php
// 添加元素
$redis->sAdd('set_key', 'member1');
$redis->sAdd('set_key', 'member2', 'member3');
// 获取所有成员
$members = $redis->sMembers('set_key');
// 判断是否存在
$exists = $redis->sIsMember('set_key', 'member1');
// 获取集合大小
$size = $redis->sCard('set_key');
// 删除成员
$redis->sRem('set_key', 'member1');
使用连接管理类
单例模式
<?php
class RedisManager {
private static $instance = null;
private $redis;
private function __construct() {
$this->redis = new Redis();
$this->redis->connect('127.0.0.1', 6379);
if (!empty($password)) {
$this->redis->auth($password);
}
}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
public function getRedis() {
return $this->redis;
}
public function set($key, $value, $ttl = null) {
if ($ttl) {
return $this->redis->setex($key, $ttl, $value);
}
return $this->redis->set($key, $value);
}
public function get($key) {
return $this->redis->get($key);
}
public function delete($key) {
return $this->redis->del($key);
}
public function exists($key) {
return $this->redis->exists($key);
}
}
// 使用示例
$redis = RedisManager::getInstance();
$redis->set('test_key', 'test_value', 3600);
$value = $redis->get('test_key');
配置示例
配置文件 (config/redis.php)
<?php
return [
'host' => env('REDIS_HOST', '127.0.0.1'),
'port' => env('REDIS_PORT', 6379),
'password' => env('REDIS_PASSWORD', null),
'database' => env('REDIS_DATABASE', 0),
'timeout' => env('REDIS_TIMEOUT', 5.0),
'prefix' => env('REDIS_PREFIX', 'myapp:'),
'options' => [
'serializer' => Redis::SERIALIZER_PHP,
'prefix' => 'myapp:',
'serializer' => 0, // 不序列化
],
];
连接类封装
<?php
class RedisConnection {
private $redis;
private $config;
public function __construct($config) {
$this->config = $config;
$this->connect();
}
private function connect() {
$this->redis = new Redis();
$this->redis->connect(
$this->config['host'],
$this->config['port'],
$this->config['timeout']
);
if (!empty($this->config['password'])) {
$this->redis->auth($this->config['password']);
}
if (isset($this->config['database'])) {
$this->redis->select($this->config['database']);
}
}
public function __call($method, $arguments) {
return $this->redis->$method(...$arguments);
}
}
// 使用
$config = require 'config/redis.php';
$redis = new RedisConnection($config);
$redis->set('key', 'value');
echo $redis->get('key');
错误处理
<?php
try {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// 检查连接
if (!$redis->isConnected()) {
throw new Exception('Redis连接失败');
}
// 操作
$redis->set('key', 'value');
} catch (RedisException $e) {
echo "Redis错误: " . $e->getMessage();
} catch (Exception $e) {
echo "一般错误: " . $e->getMessage();
} finally {
if (isset($redis)) {
$redis->close();
}
}
最佳实践建议
- 使用连接池:避免频繁创建连接
- 合理设置过期时间:防止内存泄漏
- 使用Key前缀:方便管理和区分
- 监控连接状态:定期检查连接健康
- 异常处理:捕获并处理所有Redis异常
通过这些示例,你可以在PHP项目中灵活使用Redis,根据项目需求选择合适的连接方式和操作方法。