Redis – 键值缓存存储
Redis 是一种开源的内存键值数据存储,广泛用于数据库缓存。据 Redis 网站(www.Redis.io)介绍,Redis 支持字符串、哈希值、列表、集合和排序列表等数据结构。此外,Redis 还支持复制和事务。
Redis 安装说明可在 http://redis.io/topics/quickstart 找到。 |
要检查 Redis 是否在服务器上正常运行,请在终端运行以下命令启动 Redis 服务器实例:
redis server
然后在另一个终端窗口中发出以下命令:
redis-cli ping
如果上述命令的输出如下,则表示 Redis 服务器已准备就绪,可以运行:

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 的主窗口截图如下:

RDM 提供以下功能:
-
它可连接多个远程 Redis 服务器
-
以不同格式显示特定密钥中的数据
-
为选定数据库添加新键
-
为所选键添加更多数据
-
编辑/删除密钥及其名称
-
支持 SSH 和 SSL,并可在云端使用
还有一些其他工具可以使用,但 RDM 和 Redis-cli 是最好且最容易使用的。