PHP使用Redis实战实录2:Redis扩展方法和PHP连接Redis的多种方案
作者:mmseoamin日期:2023-12-20

PHP使用Redis实战实录系列

  • PHP使用Redis实战实录1:宝塔环境搭建、6379端口配置、Redis服务启动失败解决方案
  • PHP使用Redis实战实录2:Redis扩展方法和PHP连接Redis的多种方案

    Redis扩展方法和PHP连接Redis的多种方案

    • 一、Redis扩展方法
    • 二、php操作Redis语法
    • 三、PHP连接Redis
      • 1.PHP中使用带密码的连接Redis
      • 2.PHP连接Redis抛出异常
      • 3.PHP连接Redis:$redis->ping()
      • 4.PHP连接Redis 条件语句写法
      • 四、避坑指南
        • NOAUTH Authentication required 错误

          PHP 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 PHP redis 驱动,且你的机器上能正常使用 PHP:

          echo phpinfo();
          

          PHP使用Redis实战实录2:Redis扩展方法和PHP连接Redis的多种方案,在这里插入图片描述,第1张

          出现上面提示,代表可以正常使用PHP操作Redis。

          一、Redis扩展方法

          Redis扩展提供了一系列方法用于与Redis服务器进行交互。以下是一些常用的$redis对象可用的方法:

          1. 连接和关闭连接:

            • connect($host, $port, $timeout): 连接到Redis服务器。
            • close(): 关闭Redis连接。
            • 数据操作:

              • set($key, $value): 设置指定键的值。
              • get($key): 获取指定键的值。
              • del($key1, $key2, ...): 删除一个或多个键。
              • incr($key): 增加键对应的值。
              • decr($key): 减少键对应的值。
              • exists($key): 检查键是否存在。
              • 其他诸如append、strlen、mset、mget等等。
              • 列表操作:

                • lpush($key, $value1, $value2, ...): 在列表左侧插入一个或多个值。
                • rpush($key, $value1, $value2, ...): 在列表右侧插入一个或多个值。
                • lpop($key): 弹出列表左侧的值。
                • rpop($key): 弹出列表右侧的值。
                • llen($key): 获取列表长度。
                • 其他诸如lindex、lrange、ltrim等等。
                • 哈希操作:

                  • hset($key, $field, $value): 设置哈希中指定字段的值。
                  • hget($key, $field): 获取哈希中指定字段的值。
                  • hdel($key, $field1, $field2, ...): 删除一个或多个哈希字段。
                  • hgetall($key): 获取哈希中所有字段和对应的值。
                  • 其他诸如hincrby、hkeys、hvals等等。
                  • 集合操作:

                    • sadd($key, $member1, $member2, ...): 向集合添加一个或多个成员。
                    • srem($key, $member1, $member2, ...): 从集合中移除一个或多个成员。
                    • smembers($key): 获取集合的所有成员。
                    • sismember($key, $member): 检查成员是否存在于集合中。
                    • 其他诸如sinter、sunion、sdiff等等。

          这只是Redis提供的一些常见操作方法的示例列表,还有更多其他方法可供使用。具体可以参考Redis扩展的文档或官方网站来了解更多关于Redis操作的详细信息。

          二、php操作Redis语法

          在PHP中,可以使用Redis扩展来操作Redis服务器。下面是一些常用的PHP操作Redis的语法示例:

          1. 连接到Redis服务器:
          $redis = new Redis();
          $redis->connect('127.0.0.1', 6379);
          // 或者使用连接池连接
          $redis = new Redis();
          $redis->pconnect('127.0.0.1', 6379);
          
          1. 设置和获取键值对:
          // 设置键的值
          $redis->set('key', 'value');
          // 获取键的值
          $value = $redis->get('key');
          
          1. 删除键:
          $redis->del('key');
          
          1. 判断键是否存在:
          if ($redis->exists('key')) {
              // 键存在的处理逻辑
          } else {
              // 键不存在的处理逻辑
          }
          
          1. 进行哈希操作:
          // 设置哈希表字段的值
          $redis->hset('hash_key', 'field', 'value');
          // 获取哈希表字段的值
          $value = $redis->hget('hash_key', 'field');
          // 删除哈希表字段
          $redis->hdel('hash_key', 'field');
          
          1. 进行列表操作:
          // 在列表左侧插入值
          $redis->lpush('list_key', 'value1', 'value2');
          // 在列表右侧插入值
          $redis->rpush('list_key', 'value3', 'value4');
          // 弹出列表左侧的值
          $value = $redis->lpop('list_key');
          // 弹出列表右侧的值
          $value = $redis->rpop('list_key');
          
          1. 进行集合操作:
          // 向集合添加成员
          $redis->sadd('set_key', 'member1', 'member2');
          // 从集合中移除成员
          $redis->srem('set_key', 'member1');
          // 检查成员是否存在于集合中
          if ($redis->sismember('set_key', 'member1')) {
              // 成员存在的处理逻辑
          } else {
              // 成员不存在的处理逻辑
          }
          
          1. 键设置过期时间

            在Redis中,你可以使用EXPIRE命令为一个键设置过期时间,从而控制该键的有效期。以下是一些在Redis中设置键的有效期的方法:

          2. EXPIRE key seconds:设置key的过期时间为seconds秒。当seconds秒钟过去后,键将会自动过期并被删除。

          例如,下面的代码将名为mykey的键设置为过期时间为60秒:

          $redis->expire('mykey', 60);
          
          1. PEXPIRE key milliseconds:类似于EXPIRE命令,但时间以毫秒为单位。

          例如,下面的代码将名为mykey的键设置为过期时间为3000毫秒(即3秒):

          $redis->pexpire('mykey', 3000);
          
          1. EXPIREAT key timestamp:设置key的过期时间戳,以秒为单位。timestamp参数是一个UNIX时间戳,表示键的过期时间点。

          例如,下面的代码将名为mykey的键设置为在1612266625秒之后过期:

          $redis->expireat('mykey', 1612266625);
          
          1. PEXPIREAT key milliseconds-timestamp:类似于EXPIREAT命令,但时间戳以毫秒为单位。

          例如,下面的代码将名为mykey的键设置为在1654123456789毫秒之后过期:

          $redis->pexpireat('mykey', 1654123456789);
          

          这些命令可用于设置Redis中键的过期时间。一旦过期时间到达,键将被自动删除。注意,只有在键被设置为字符串、哈希表、列表等类型时,过期设置才有效。

          另外,如果你想获取键的剩余过期时间,你可以使用TTL命令或PTTL命令。如ttl('mykey')返回键mykey的剩余过期时间(以秒为单位),pttl('mykey')返回键mykey的剩余过期时间(以毫秒为单位)。如果键已过期或不存在,这些命令返回负数。

          这些是一些常用的Redis操作示例,你可以根据具体的业务需求,使用相应的方法来进行操作。记得在操作完成后,及时关闭Redis连接,以释放资源。

          三、PHP连接Redis

          1.PHP中使用带密码的连接Redis

          若要在PHP中使用带密码的连接Redis,你可以使用Redis扩展的auth方法进行身份验证。以下是设置密码并连接到Redis服务器的示例代码:

          connect('127.0.0.1', 6379);
          // 身份验证
          $redis->auth('your_password');
          // 执行一些操作
          $redis->set('key', 'value');
          $value = $redis->get('key');
          echo $value; // 输出 'value'
          ?>
          

          在上述代码中,your_password是在Redis服务器上设置的密码。使用auth方法将密码传递给Redis实例进行身份验证。如果密码不正确或与服务器配置不匹配,将会引发REDIS_AUTH异常。因此,确保提供正确的密码以及与服务器配置相匹配的密码。

          同样地,如果在使用Laravel框架,你可以在config/database.php文件中配置Redis连接的密码。在对应的'redis'配置数组中添加'password' => 'your_password'以设置密码。

          记得使用适当的安全措施来保护Redis密码,如避免将密码明文存储在代码中或通过不安全的方式传输密码。

          2.PHP连接Redis抛出异常

          try {
              $redis = new Redis();
              // 连接到Redis服务器
              $redis->connect('127.0.0.1', 6379);
              // 身份验证
              $redis->auth('kYABzc8u3zNs7cq');
              // 执行一些操作
              $redis->set('key', 'lockdata');
              $value = $redis->get('key');
              echo $value; // 输出 'value'
              // 关闭Redis连接
              $redis->close();
          } catch (RedisException $e) {
              echo "连接Redis时发生异常:" . $e->getMessage();
          }
          

          3.PHP连接Redis:$redis->ping()

          $redis->ping()是Redis扩展提供的一个方法,用于检测与Redis服务器的连接是否存活。

          它的使用很简单,只需要调用$redis->ping()方法即可。若连接正常且服务器可响应,则该方法返回字符串PONG。若连接异常或服务器未响应,则会抛出RedisException异常。

          以下是一个示例:

          $redis = new Redis();
          $redis->connect('127.0.0.1', 6379);
          try {
              $response = $redis->ping();
              if ($response === 'PONG') {
                  echo "Redis连接正常";
              } else {
                  echo "Redis连接异常或服务器未响应";
              }
          } catch (RedisException $e) {
              echo "Redis连接异常:" . $e->getMessage();
          }
          $redis->close();
          

          在上述示例中,我们首先创建一个Redis对象,然后使用connect()方法连接到Redis服务器。接下来,我们调用ping()方法来检测连接状态,并通过返回的响应值进行判断。如果返回值为PONG,则表示连接正常;如果返回值为其他内容,或抛出了异常,则表示连接异常或服务器未响应。

          记得在使用ping()方法前确保已经成功建立了与Redis服务器的连接,并在使用完成后及时关闭连接以释放资源。

          4.PHP连接Redis 条件语句写法

          如果你不想使用try语句来捕获异常,你可以通过检查连接和操作返回的结果来判断是否发生了异常。以下是一个示例代码:

          $redis = new Redis();
          // 连接到Redis服务器
          $connected = $redis->connect('127.0.0.1', 6379);
          if ($connected === false) {
              echo "无法连接到Redis服务器";
          } else {
              // 执行一些操作
              $setResult = $redis->set('key', 'value');
              if ($setResult === false) {
                  echo "设置键值对发生了异常";
              } else {
                  $value = $redis->get('key');
                  if ($value === false) {
                      echo "获取键值对发生了异常";
                  } else {
                      echo $value; // 输出 'value'
                  }
              }
              // 关闭Redis连接
              $redis->close();
          }
          

          在上述示例中,我们首先检查$redis->connect()方法的返回值来确定是否成功连接到Redis服务器。如果连接失败,我们可以输出相应的错误信息。如果连接成功,我们再执行一些操作,如$redis->set()、$redis->get()等,并检查每个操作的返回结果来判断是否发生了异常。

          使用这种写法,你可以根据返回结果进行逻辑判断和处理,而无需使用try和catch块来捕获异常。这种写法相对简单,但在处理多个操作和嵌套逻辑时可能会导致代码变得复杂。

          记得在代码中适当处理连接和操作过程中的异常,确保你的程序具备健壮性并能正确处理错误情况。

          四、避坑指南

          NOAUTH Authentication required 错误

          Fatal error: Uncaught exception ‘RedisException’ with message ‘NOAUTH Authentication required.’ in /www/wwwroot/redis.lockdata.cn/index.php:12 Stack trace: #0 /www/wwwroot/redis.lockdata.cn/index.php(12): Redis->set(‘key1’, ‘value1’) #1 {main} thrown in /www/wwwroot/redis.lockdata.cn/index.php on line 12

          **原因:**未配置Redis密码导致。

          // 身份验证
          $redis->auth('kYABzc8u3zNs7cq');
          

          @漏刻有时