插件窝 干货文章 LNMP环境下Redis使用教程

LNMP环境下Redis使用教程

Redis PHP 缓存 327    来源:    2025-05-08

LNMP环境下Redis使用教程

Redis是一款高性能的键值对(Key-Value)内存数据库,在LNMP(Linux+Nginx+MySQL+PHP)环境中常被用作缓存、会话存储等。以下是LNMP环境下Redis的完整使用指南。

一、Redis安装

1. 安装Redis服务器

# Ubuntu/Debian
sudo apt-get update
sudo apt-get install redis-server

# CentOS/RHEL
sudo yum install epel-release
sudo yum install redis

2. 启动Redis服务

sudo systemctl start redis
sudo systemctl enable redis  # 设置开机自启

3. 验证安装

redis-cli ping
# 应该返回 PONG

二、PHP Redis扩展安装

1. 安装PHP Redis扩展

# Ubuntu/Debian
sudo apt-get install php-redis

# CentOS/RHEL
sudo yum install php-pecl-redis

# 或者使用pecl安装
sudo pecl install redis

2. 启用扩展

在php.ini中添加:

extension=redis.so

重启PHP-FPM:

sudo systemctl restart php-fpm

3. 验证PHP Redis扩展

php -m | grep redis
# 或者创建一个phpinfo页面查看

三、Redis基本配置

1. 主要配置文件

Redis配置文件通常位于: - /etc/redis/redis.conf (Ubuntu/Debian) - /etc/redis.conf (CentOS/RHEL)

2. 常用配置项

# 绑定IP地址,默认只监听127.0.0.1
bind 127.0.0.1

# 端口号
port 6379

# 密码认证
requirepass yourpassword

# 最大内存限制
maxmemory 256mb

# 内存满时的策略
maxmemory-policy allkeys-lru

# 持久化设置
save 900 1      # 900秒内至少有1个key被更改则保存
save 300 10     # 300秒内至少有10个key被更改则保存
save 60 10000   # 60秒内至少有10000个key被更改则保存

修改配置后需要重启Redis服务:

sudo systemctl restart redis

四、PHP中使用Redis

1. 基本连接

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// 如果设置了密码
$redis->auth('yourpassword');

// 测试连接
$redis->set('test_key', 'Hello Redis');
echo $redis->get('test_key');
?>

2. 常用操作示例

// 字符串操作
$redis->set('username', 'admin');
$redis->setex('temp_data', 3600, 'expires in 1 hour'); // 带过期时间
$redis->mset(['key1' => 'value1', 'key2' => 'value2']);

// 哈希操作
$redis->hSet('user:1000', 'name', 'John');
$redis->hSet('user:1000', 'email', 'john@example.com');
$user = $redis->hGetAll('user:1000');

// 列表操作
$redis->lPush('tasks', 'task1');
$redis->lPush('tasks', 'task2');
$task = $redis->rPop('tasks');

// 集合操作
$redis->sAdd('tags', 'php');
$redis->sAdd('tags', 'mysql');
$allTags = $redis->sMembers('tags');

// 有序集合
$redis->zAdd('rank', 100, 'user1');
$redis->zAdd('rank', 200, 'user2');
$topUsers = $redis->zRevRange('rank', 0, 9);

3. 使用Redis存储PHP会话

修改php.ini:

session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"

或者代码中设置:

ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://127.0.0.1:6379?auth=yourpassword');

五、Redis与MySQL协同工作

1. 缓存数据库查询结果

function getProductDetails($productId) {
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);

    $cacheKey = "product:$productId";

    // 尝试从Redis获取缓存
    $data = $redis->get($cacheKey);

    if ($data === false) {
        // 缓存未命中,从数据库查询
        $pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');
        $stmt = $pdo->prepare("SELECT * FROM products WHERE id = ?");
        $stmt->execute([$productId]);
        $data = $stmt->fetch(PDO::FETCH_ASSOC);

        // 将结果存入Redis,设置1小时过期
        $redis->setex($cacheKey, 3600, json_encode($data));
    } else {
        // 缓存命中
        $data = json_decode($data, true);
    }

    return $data;
}

2. 缓存失效策略

当数据更新时,需要使相关缓存失效:

function updateProduct($productId, $newData) {
    // 更新数据库
    $pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');
    // ... 执行更新操作

    // 使缓存失效
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    $redis->del("product:$productId");
}

六、Redis高级应用

1. 发布/订阅模式

发布者:

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->publish('news', 'Latest news update!');

订阅者:

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->subscribe(['news'], function ($redis, $channel, $message) {
    echo "Received message on channel $channel: $message\n";
});

2. 使用Redis实现分布式锁

function acquireLock($lockName, $timeout = 10) {
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);

    $identifier = uniqid();
    $end = time() + $timeout;

    while (time() < $end) {
        if ($redis->setnx("lock:$lockName", $identifier)) {
            $redis->expire("lock:$lockName", $timeout);
            return $identifier;
        }
        usleep(100000); // 等待100ms
    }

    return false;
}

function releaseLock($lockName, $identifier) {
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);

    $script = '
        if redis.call("get", KEYS[1]) == ARGV[1] then
            return redis.call("del", KEYS[1])
        else
            return 0
        end
    ';

    return $redis->eval($script, ["lock:$lockName", $identifier], 1);
}

七、Redis监控与维护

1. 监控Redis状态

redis-cli info  # 查看Redis信息
redis-cli info memory  # 查看内存使用情况
redis-cli info clients  # 查看客户端连接

2. 性能测试

redis-benchmark -q -n 100000

3. 数据备份

# 手动执行保存
redis-cli save
# 或者
redis-cli bgsave  # 后台保存

# 备份文件默认在 /var/lib/redis/dump.rdb

八、安全建议

  1. 为Redis设置强密码
  2. 只绑定必要的IP地址(通常127.0.0.1)
  3. 考虑重命名或禁用危险命令(FLUSHALL, CONFIG等)
  4. 定期更新Redis到最新版本
  5. 监控Redis内存使用情况,防止内存耗尽

九、常见问题解决

1. 连接被拒绝

  • 检查Redis服务是否运行:sudo systemctl status redis
  • 检查防火墙设置
  • 检查Redis绑定的IP地址

2. 内存不足

  • 调整maxmemorymaxmemory-policy配置
  • 考虑使用Redis集群
  • 优化数据结构,减少内存使用

3. PHP无法加载Redis扩展

  • 确认扩展文件存在
  • 检查php.ini加载路径
  • 确保PHP版本与扩展版本兼容

通过本教程,您应该能够在LNMP环境中成功安装、配置和使用Redis,提升应用性能。