PHP项目Redis字符串类型如何操作

wen PHP项目 26

本文目录导读:

PHP项目Redis字符串类型如何操作

  1. 连接Redis(基础配置)
  2. 核心字符串操作方法
  3. 高级场景示例
  4. 注意事项

在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('请求过于频繁');
}

注意事项

  1. 连接复用:生产环境中使用长连接或连接池
  2. 错误处理:总是检查操作是否成功
    if (!$redis->set('key', 'value')) {
     // 处理错误
    }
  3. 序列化:存储对象时记得序列化
    $redis->set('user', serialize($userObj));
    $userObj = unserialize($redis->get('user'));
  4. TTL管理:合理设置过期时间,避免内存泄漏
  5. 原子操作:使用 incr/decr 代替 get+set 进行数值操作,确保并发安全

是PHP操作Redis字符串类型的完整指南,涵盖了从基础到高级的所有常用场景。

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