使用 PHP 的 Predis 介绍 Redis

Redis 是一个内存型的数据结构型服务器,得益于它內建的数据类型,它比一般的 键/值 型数据库更加强大!

Redis 是在 2009 年由 Salvatore Sanfilippo 发起的项目,由于它的流行性快速发展,一些像 VMware(后来雇佣 Sanfilippo 全职工作于这个项目)GitHub, Craigslist, Disqus, Digg, Blizzard, Instagram 等等这样子的大公司选择了它。

你可以使用 Redis 作为一个会话管理器,如果你在一个负载均衡器后面运行着多个服务器架构的情况下,这会特别有用。Redis 同样拥有一个发布/订阅系统,这对开发一个在线聊天或者实时预定系统会很有帮助。Redis 的文档与更多信息和它所有的命令可以在它的项目网站中找到,redis.io

有很多关于 Redis 和 Memcache 哪一个更好的争论,虽然基准显示对于基本的操作它们都平分秋色。Redis 比 Memache 拥有更多的特性,例如内存型和磁盘持久化,原子命令和支持事务,不是记录每个更改到磁盘,而是用服务端的数据结构代替。

在本文中,我们会通过 Predis 库简要地了解下 Redis 提供的基本但实用的命令。

容易安装

Redis 很容易安装,在它的产品页下载上发布着一个简明的安装介绍。根据我的个人经验,如果你是使用 Ubuntu ,没有 TCL (简单地通过 apt-get install tcl ) ,那么会出现一个错误。一旦 Redis 安装成功,你就可以运行服务器了。

gafitescu@ubun2:~$ /usr/local/bin/redis-server
* The server is now ready to accept connections on port 6379

Redis 对很多语言都有相应的客户端库,在这里可以找到。通常每种语言都有几个可用的,对于 PHP 就有 5 种。在本文中,我会使用 Predis 库,但你也可以查看 phpredis ,它是一个编译并且安装的 PHP 模块。

如果你像我一样在电脑中安装了 git 的话,你所需要做的只是克隆 Predis 仓库而已。否则你需要下载 ZIP 压缩包并且解压它。

gafitescu@ubun2:~$ git clone git://github.com/nrk/predis.git

要测试是否正常工作,创建一个 test.php 文件,使用以下代码来测试你是否可以成功使用 Predis 连接正在运行的 Redis 服务器:

<?php
require "predis/autoload.php";
PredisAutoloader::register();

// since we connect to default setting localhost
// and 6379 port there is no need for extra
// configuration. If not then you can specify the
// scheme, host and port to connect as an array
// to the constructor.
try {
    $redis = new PredisClient();
/*
    $redis = new PredisClient(array(
        "scheme" => "tcp",
        "host" => "127.0.0.1",
        "port" => 6379));
*/
    echo "Successfully connected to Redis";
}
catch (Exception $e) {
    echo "Couldn't connected to Redis";
    echo $e->getMessage();
}

当你运行它的时候,最好希望能够看到 “Successfully connected to Redis” 这个消息。

使用 Redis

在本节中,你会简要地了解到 Redis 提供的最常用的命令。Memcache 也有大部分与它类似的命令,因此,如果你熟悉 Memcache ,那么下面的命令你也会感到熟悉的。

SET,GET 和 EXISTS

Redis 中最常用的命令就是 SET,GET 和 EXISTS 了。你可以使用这些命令去存储和检查会被多次访问的临时信息,典型的 键/值 方式。例如:

<?php
$redis->set("hello_world", "Hi from php!");
$value = $redis->get("hello_world");
var_dump($value);

echo ($redis->exists("Santa Claus")) ? "true" : "false";

set() 方法用来设置某个键的值,在本例中,键是 “hello_world” ,值是 “Hi from PHP!”。get() 方法用来获取某个键的值,同样在本例中 “hello_world”。exists() 方法返回在 Redis 存储中所提供的键是否存在。

Redis 的键并没有限制在字母数字字符和下划线,下面的例子照样可以:

<?php
$redis->set("I 2 love Php!", "Also Redis now!");
$value = $redis->get("I 2 love Php!");

INCR(INCRBY) 和 DECR(DECRBY)

INCR 和 DECR 命令是用来增加和减少值的,这是用来维护计数器的很好的方式。INCR 和 DECR 以 1 来增加/减少它们的值;你也可以使用 INCRBY 和DECRBY 来使用更大的间隔。这里有个例子:

<?php
// increment the number of views by 1 for an article
// with id 234
$redis->incr("article_views_234");

// increment views for article 237 by 5
$redis->incrby("article_views_237", 5);

// decrement views for article 237
$redis->decr("article_views_237");

// decrement views for article 237 by 3
$redis->decrby("article_views_237", 3);

Redis 的数据类型

正如我刚才提到的,Redis 拥有內建的数据类型。你可能会觉得,对于像 Redis 这样的 NOSQL 键值型的存储服务来说,拥有数据类型会很奇怪。但是对于开发者来说,使用更有意义的方式来组织信息和提供更快的操作会非常有帮助的。Redis 的数据类型有:

字符串类型:Redis 中基本的数据类型,你可以用它来存储很少的几个字符,也可以用它来存储整个文件的内容。
列表:一个简单的根据它插入的顺序排序的列表。你可以从头部或者尾部添加和删除元素。因此你可以使用这种数据类型来实现队列。
哈希表:一个字符串键和字符串值的映射。使用这种方式,你可以实现对象(想一想只有一层深度的 JSON 对象)。
集合:一个无序的字符串集合,你可以添加、删除并且测试是否存在一个元素。唯一的限制是你不能有重复的元素。
有序集合:一个特别的集合类型。区别在于它的每个元素会分配一个分值,用来按照最小到最大来排序集合中的元素。

HSET, HGET 和 HGETALL, HINCRBY, 和 HDEL

这些命令用来处理 Redis 的哈希表数据类型的。

HSET:设置哈希对象中一个键的值
HGET:获取哈希对象中一个键的值
HINCRBY:以特别的值来增加一个哈希对象的键的值。
HDEL:删除哈希对象的一个键。
HGETALL:获取哈希对象的所有数据

这里有一个展示它们用法的例子:

< ?php
$redis->hset("taxi_car", "brand", "Toyota");
$redis->hset("taxi_car", "model", "Yaris");
$redis->hset("taxi_car", "license number", "RO-01-PHP");
$redis->hset("taxi_car", "year of fabrication", 2010);
$redis->hset("taxi_car", "nr_starts", 0);
/*
$redis->hmset("taxi_car", array(
    "brand" => "Toyota",
    "model" => "Yaris",
    "license number" => "RO-01-PHP",
    "year of fabrication" => 2010,
    "nr_stats" => 0)
);
*/
echo "License number: " . 
    $redis->hget("taxi_car", "license number") . "<br>";

// remove license number
$redis->hdel("taxi_car", "license number");

// increment number of starts
$redis->hincrby("taxi_car", "nr_starts", 1);

$taxi_car = $redis->hgetall("taxi_car");
echo "All info about taxi car";
echo "< pre>";
var_dump($taxi_car);
echo "< /pre>";

LPUSH, RPUSH, LPOP, RPOP, LLEN, LRANGE

这是处理 Redis 列表类型的重要的命令。一个 Redis 的列表和 PHP 的数组类似,它对实现队列、栈或者有一定元素数量上限的集合提供了强大的支持。

LPUSH:从前面添加一个元素到队列
RPUSH:从后面添加一个元素到队列。
LPOP:获取并删除队列中的第一个元素。
RPOP:获取并删除队列中的最后一个元素。
LLEN:获取列表的长度。
LRANGE:获取列表中某个范围的元素。

< ?php
$list = "PHP Frameworks List";
$redis->rpush($list, "Symfony 2");
$redis->rpush($list, "Symfony 1.4");
$redis->lpush($list, "Zend Framework");

echo "Number of frameworks in list: " . $redis->llen($list) . "<br>";

$arList = $redis->lrange($list, 0, -1);
echo "< pre>";
print_r($arList);
echo "</ pre>";

// the last entry in the list
echo $redis->rpop($list) . "<br>";

// the first entry in the list
echo $redis->lpop($list) . "<br>";

EXPIRE , EXPIREAT , TTL 和 PERSIST

通常地,当你设置一个键时,你不想让它永远存在,因为在一段时间后它似乎就没有什么关联了。你需要更新或者删除它来减少内存的使用以提高性能。Redis 提高四个命令来让你简单地管理你的数据。

EXPIRE:设置一个超时时间(秒为单位),超过之后该键会被删除。
EXPIREAT:使用 UNIX 时间戳设置一个超时时间,超过该时间之后该键会被删除。
TTL:查询键还剩多少时间超时。
PERSIST:删除一个键的超时设置。

< ?php
// set the expiration for next week
$redis->set("expire in 1 week", "I have data for a week");
$redis->expireat("expire in 1 week", strtotime("+1 week"));
$ttl = $redis->ttl("expire in 1 week"); // will be 604800 seconds

// set the expiration for one hour
$redis->set("expire in 1 hour", "I have data for an hour");
$redis->expire("expire in 1 hour", 3600);
$ttl = $redis->ttl("expire in 1 hour"); // will be 3600 seconds

// never expires
$redis->set("never expire", "I want to leave forever!");

总结

我们在本文中学习到了很少的一些 Redis 命令,但是你可以在 Redis 网站中查看全部的命令。Redis 确实不是 Memcache 的代替物,因为它提供了更多的功能。

原文连接

(完)

本文作者: chenishr

本文标题:《使用 PHP 的 Predis 介绍 Redis》

本文地址: http://blog.chenishr.com/?p=595

©版权所有,除非注明, 永在路上文章均为原创,转载请以链接形式注明出处和作者细信息。

发表评论

电子邮件地址不会被公开。 必填项已用*标注