Redis是一款高性能的键值对(Key-Value)内存数据库,在LNMP(Linux+Nginx+MySQL+PHP)环境中常被用作缓存、会话存储等。以下是LNMP环境下Redis的完整使用指南。
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install redis-server
# CentOS/RHEL
sudo yum install epel-release
sudo yum install redis
sudo systemctl start redis
sudo systemctl enable redis # 设置开机自启
redis-cli ping
# 应该返回 PONG
# Ubuntu/Debian
sudo apt-get install php-redis
# CentOS/RHEL
sudo yum install php-pecl-redis
# 或者使用pecl安装
sudo pecl install redis
在php.ini中添加:
extension=redis.so
重启PHP-FPM:
sudo systemctl restart php-fpm
php -m | grep redis
# 或者创建一个phpinfo页面查看
Redis配置文件通常位于:
- /etc/redis/redis.conf
(Ubuntu/Debian)
- /etc/redis.conf
(CentOS/RHEL)
# 绑定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 = new Redis();
$redis->connect('127.0.0.1', 6379);
// 如果设置了密码
$redis->auth('yourpassword');
// 测试连接
$redis->set('test_key', 'Hello Redis');
echo $redis->get('test_key');
?>
// 字符串操作
$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);
修改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');
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;
}
当数据更新时,需要使相关缓存失效:
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 = 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";
});
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-cli info # 查看Redis信息
redis-cli info memory # 查看内存使用情况
redis-cli info clients # 查看客户端连接
redis-benchmark -q -n 100000
# 手动执行保存
redis-cli save
# 或者
redis-cli bgsave # 后台保存
# 备份文件默认在 /var/lib/redis/dump.rdb
sudo systemctl status redis
maxmemory
和maxmemory-policy
配置通过本教程,您应该能够在LNMP环境中成功安装、配置和使用Redis,提升应用性能。