本文目录导读:

在PHP项目中使用Redis操作字符串类型,主要通过 Redis 类的以下方法实现,以下是常用操作的代码示例和说明:
连接Redis(基础配置)
<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// 如果有密码
// $redis->auth('yourpassword');
?>
核心字符串操作方法
设置和获取值
// 设置单个键值
$redis->set('key', 'value');
// 设置带过期时间(单位:秒)
$redis->setex('expire_key', 3600, 'expires in 1 hour');
// 设置带过期时间(毫秒)
$redis->pSetEx('pxkey', 5000, 'expires in 5 seconds');
// 获取值
$value = $redis->get('key');
echo $value; // 输出: value
// 当键不存在时设置(防止覆盖)
$redis->setnx('lock_key', 'locked');
// 批量设置/获取
$redis->mset(['key1' => 'val1', 'key2' => 'val2']);
$values = $redis->mget(['key1', 'key2', 'key3']); // key3不存在返回false
数值操作
// 原子递增/递减
$redis->set('counter', 10);
$redis->incr('counter'); // 11
$redis->incrBy('counter', 5); // 16
$redis->decr('counter'); // 15
$redis->decrBy('counter', 3); // 12
// 浮点数递增
$redis->incrByFloat('float_key', 1.5);
字符串修改操作
$redis->append('msg', ' World');
echo $redis->get('msg'); // Hello World
// 获取子字符串(索引从0开始)
$redis->set('text', 'abcdef');
$sub = $redis->getRange('text', 1, 3); // 'bcd'
// 替换指定位置的字符串
$redis->setRange('text', 2, 'XYZ');
echo $redis->get('text'); // 'abXYZef'
// 获取字符串长度
$len = $redis->strlen('text'); // 7
原子操作(并发安全)
// 获取并设置(适用于计数器等场景)
$oldValue = $redis->getSet('counter', 100);
// 对比交换(CAS操作)
$redis->watch('stock');
$current = $redis->get('stock');
// 中间有其他修改则会失败
$redis->multi();
$redis->set('stock', $current - 1);
$redis->exec();
高级场景示例
缓存管理
class RedisCache {
private $redis;
public function __construct() {
$this->redis = new Redis();
$this->redis->connect('127.0.0.1', 6379);
}
public function getData($key, $callback, $ttl = 3600) {
if ($data = $this->redis->get($key)) {
return json_decode($data, true);
}
$data = $callback();
$this->redis->setex($key, $ttl, json_encode($data));
return $data;
}
}
// 使用示例
$cache = new RedisCache();
$users = $cache->getData('users_cache', function() {
return Database::getAllUsers();
});
分布式锁
class RedisLock {
public static function acquire($key, $ttl = 10) {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// 使用setnx实现原子性加锁
return $redis->setnx("lock:$key", time() + $ttl);
}
public static function release($key) {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->del("lock:$key");
}
}
// 使用示例
if (RedisLock::acquire('user_edit_123')) {
// 执行关键操作
RedisLock::release('user_edit_123');
}
限流计数器
class RateLimiter {
public static function check($key, $maxRequests, $window) {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$current = $redis->incr($key);
if ($current == 1) {
$redis->expire($key, $window);
}
return $current <= $maxRequests;
}
}
// 接口限流:每分钟最多100次
if (!RateLimiter::check('api:user_' . $userId, 100, 60)) {
http_response_code(429);
die('请求过于频繁');
}
注意事项
- 连接复用:生产环境中使用长连接或连接池
- 错误处理:总是检查操作是否成功
if (!$redis->set('key', 'value')) { // 处理错误 } - 序列化:存储对象时记得序列化
$redis->set('user', serialize($userObj)); $userObj = unserialize($redis->get('user')); - TTL管理:合理设置过期时间,避免内存泄漏
- 原子操作:使用
incr/decr代替get+set进行数值操作,确保并发安全
是PHP操作Redis字符串类型的完整指南,涵盖了从基础到高级的所有常用场景。