Redis – 键值缓存存储

Redis 是一种开源的内存键值数据存储,广泛用于数据库缓存。据 Redis 网站(www.Redis.io)介绍,Redis 支持字符串、哈希值、列表、集合和排序列表等数据结构。此外,Redis 还支持复制和事务。

Redis 安装说明可在 http://redis.io/topics/quickstart 找到。

要检查 Redis 是否在服务器上正常运行,请在终端运行以下命令启动 Redis 服务器实例:

redis server

然后在另一个终端窗口中发出以下命令:

redis-cli ping

如果上述命令的输出如下,则表示 Redis 服务器已准备就绪,可以运行:

image 2023 11 05 20 44 47 724

Redis 提供了一个命令行,其中提供了一些有用的命令。在 Redis 服务器上执行命令有两种方法。你可以使用前一种方法,或者直接键入 redis-cli 并点击 Enter;我们将看到 Redis 命令行,然后键入将要执行的 Redis 命令。

默认情况下,Redis 使用的 IP 地址为 127.0.0.1,端口为 6379。虽然可以启用远程连接,但不允许远程连接。Redis 会存储数据库中已创建的数据。数据库名称是整数,如 0、1、2 等。

我们不会在此详细介绍 Redis,但会讨论一些值得注意的命令。请注意,所有这些命令都可以用前面的方法执行,或者我们可以直接进入 redis-cli 命令窗口,键入命令而无需输入 redis-cli。此外,以下命令可以直接在 PHP 中执行,这样就可以直接从 PHP 应用程序中清除缓存:

  • SELECT(选择):该命令可更改当前数据库。默认情况下,redis-cli 将在数据库 0 处打开。 因此,如果我们想转到数据库 1,将运行以下命令: SELECT 1

  • FLUSHDB:该命令会刷新当前数据库。将删除当前数据库中的所有键或数据。

  • FLUSHALL:该命令将刷新所有数据库,无论在哪个数据库中执行。

  • KEYS:该命令列出当前数据库中与某个模式匹配的所有键。下面的命令列出了当前数据库中的所有键。 KEYS *

现在,是时候在 PHP 中使用 Redis 进行一些操作了。

在编写本主题时,PHP 7 还没有内置的 Redis 支持。为了本书的目的,我们为 PHP 7 编译了 PHPRedis 模块,它运行得非常好。该模块可在 https://github.com/phpredis/phpredis 上找到。

与 Redis 服务器连接

如前所述,默认情况下,Redis 服务器的 IP 地址为 127.0.0.1,端口为 6379。因此,为了建立连接,我们将使用这些详细信息。请看下面的代码:

$redisObject = new Redis();
if( !$redisObject->connect('127.0.0.1', 6379))
    die("Can't connect to Redis Server");

在第一行中,我们实例化了一个 Redis 对象,名为 redisObject,然后在第二行中使用该对象连接到 Redis 服务器。主机是本地 IP 地址 127.0.0.1,端口是 6379。如果连接成功,connect() 方法返回 TRUE,否则返回 FALSE

从 Redis 服务器存储和获取数据

现在,我们已连接到 Redis 服务器。让我们在 Redis 数据库中保存一些数据。在我们的示例中,我们要在 Redis 数据库中存储一些字符串数据。代码如下:

//Use same code as above for connection.
//Save Data in to Redis database.
$rdisObject->set('packt_title', 'Packt Publishing');

//Lets get our data from database
echo $redisObject->get('packt_title');

set 方法将数据存储到当前的 Redis 数据库中,它需要两个参数:键和值。键可以是任何唯一的名称,而值则是我们需要存储的内容。因此,我们的键是 packt_title,值是 Packt Publishing。除非另有明确设置,否则默认数据库始终设置为 0(零)。因此,前面的 set 方法将以 packt_title 为键把我们的数据保存到数据库 0。

现在,get 方法用于从当前数据库中获取数据。它将 key 作为参数。因此,前面代码的输出将是我们保存的字符串数据 Packt Publishing

现在,数组或来自数据库的数据集怎么办?我们可以用多种方式在 Redis 中存储它们。让我们先试试普通的字符串方式,如图所示:

//Use same connection code as above.

/* This $array can come from anywhere, either it is coming from
database or user entered form data or an array defined in code */

$array = ['PHP 5.4', PHP 5.5, 'PHP 5.6', PHP 7.0];

//Json encode the array
$encoded = json_encode($array);

//Select redis database 1
$redisObj->select(1);

//store it in redis database 1
$redisObject->set('my_array', $encoded);

//Now lets fetch it
$data = $redisObject->get('my_array');

//Decode it to array
$decoded = json_decode($data, true);

print_r($decoded);

前面代码的输出将是相同的数组。出于测试目的,我们可以注释掉 set 方法,然后检查 get 方法是否获取了数据。请记住,在前面的代码中,我们将数组存储为 json 字符串,然后将其获取为 json 字符串,并将其解码为数组。这是因为我们使用了字符串数据类型可用的方法,而字符串数据类型无法存储数组。

此外,我们使用了 select 方法来选择另一个数据库并使用它来代替 0

对 Redis 的完整讨论超出了本书的范围。因此,我们提供了一个介绍。需要注意的是,如果你使用任何框架,你都可以使用 Redis 的内置库,而且任何数据类型都可以轻松使用。

Redis 管理工具

Redis 管理工具提供了一种管理 Redis 数据库的简便方法。这些工具提供的功能可以检查每个键,并轻松清除缓存。Redis 自带的一个默认工具叫 Redis-cli,我们在前面已经讨论过。现在,让我们来讨论一款既出色又易用的可视化工具-- Redis Desktop Manage(RDM)。RDM 的主窗口截图如下:

image 2023 11 05 20 56 29 642

RDM 提供以下功能:

  • 它可连接多个远程 Redis 服务器

  • 以不同格式显示特定密钥中的数据

  • 为选定数据库添加新键

  • 为所选键添加更多数据

  • 编辑/删除密钥及其名称

  • 支持 SSH 和 SSL,并可在云端使用

还有一些其他工具可以使用,但 RDM 和 Redis-cli 是最好且最容易使用的。