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