PHP项目Redis如何连接使用

wen PHP项目 26

本文目录导读:

PHP项目Redis如何连接使用

  1. 安装Redis扩展
  2. 连接Redis
  3. 基本操作
  4. 使用连接管理类
  5. 配置示例
  6. 错误处理
  7. 最佳实践建议

我来详细说明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();
    }
}

最佳实践建议

  1. 使用连接池:避免频繁创建连接
  2. 合理设置过期时间:防止内存泄漏
  3. 使用Key前缀:方便管理和区分
  4. 监控连接状态:定期检查连接健康
  5. 异常处理:捕获并处理所有Redis异常

通过这些示例,你可以在PHP项目中灵活使用Redis,根据项目需求选择合适的连接方式和操作方法。

抱歉,评论功能暂时关闭!