Redis 是一款高性能的 Key-Value 数据库,整个数据库都在内存上进行读写操作。由于这个特性,它与 SQL 相比在速度上肯定是更胜一筹。

这几天,我注意到了自己的音乐 API 速度问题,打算从根源上解决。此前有人和我提到了 Redis,用它充当数据库会很快,但我那时候多是拿不会为由婉拒了。可现在有了这个需求,也就驱使了我去探索学习。我的 Redis 学习之路,就这样开始了。

我的音乐 API 的原理很简单,和其他人的 API 一样,主要利用了某易官方提供的 API 接口(即便是官方,但人家并没有公开使用文档)所提供的数据。即服务器负责请求,取得结果后返回给客户端,避免了前端的跨域大坑。

但我的 API 相对他人的区别在于进行了二次处理,只筛选了其中我认为有用的信息。如果你直接使用官方接口,获得的信息往往是一大串的各种重复的甚至空白的无效内容。这对于我来说就是显得非常臃肿了,写的程序也就一样变得臃肿了起来。如果直接对这个原始内容进行缓存,无效内容会占用大量资源。而通过二次处理得到的内容就精简了许多,再结合 Redis 这个好搭档,这响应速度肯定就上去啦!

安装 Redis

要在 PHP 程序上使用 Redis,首先让我们在服务器上先安装 Redis。在 CentOS 下,通过 yum 就可以完成我们的任务。

yum install redis

如果提示项目不存在(No package redis available),可以通过安装 EPEL(Extra Packages for Enterprise Linux,可以理解成一个第三方软件源)来解决。

yum install epel-release
yum install redis

至此,Redis 就安装完成了。

安装 PHP 扩展

pecl install redis

如果已经安装,一般会提示如下内容:

pecl/redis is already installed and is the same as the released version 4.3.0

这样就说明 Redis 的 PHP 扩展已经安装

确认扩展是否安装

确认 redis.so 存在于 PHP 扩展目录内:

[[email protected] ~]# cd /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/
[[email protected] no-debug-non-zts-20160303]# ls
memcached.so  memcache.so  opcache.a  opcache.so  redis.so

PS:后面的 “20160303” 目录对应的是你的 PHP 版本,因人而异。

可以看到有一个 redis.so 文件,说明扩展已经安装成功。但我们还不确认它是否启用。我们可以通过 phpinfo() 函数来进行确认。如果 Redis 扩展没有启用,引用了 Radis 相关函数的 PHP 文件在执行时则有可能会导致服务器返回 500 错误。

若要启用 Redis 扩展,我们首先需要做的就是检查 PHP 的配置文件 - php.ini。我们在 phpinfo() 页面可以确认配置文件的路径。

php.ini 路径

确认路径后,我们使用 VIM 编辑器对其进行编辑操作。

vim /usr/local/php/etc/php.ini

然后输入 :\extension_dir 可以搜索到扩展路径的相关配置内容,在我的环境上,它默认被注释了。

736 ; Directory in which the loadable extensions (modules) reside.
737 ; http://php.net/extension-dir
738 ; extension_dir = "./"
739 ; On windows:
740 ; extension_dir = "ext"

我们需要修改其路径,改为前面我们找到的扩展目录地址,再引用 redis.so 文件。

738   extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/"
740   extension = redis.so

输入 :wq 保存配置文件,重启 PHP 服务。

service php-fpm restart

再次访问 phpinfo() 页面,可以看到 Redis 扩展已经成功启用。

Redis 扩展状态

测试连接

使用 VIM 或其他编辑器编写一段 PHP 文件,保存后在浏览器上运行查看输出结果。

// 初始化
$redis = new Redis();

// 连接 Redis
$redis -> connect('127.0.0.1', 6379);

// 若已成功连接,就能查看其 Ping 消息
echo "Server is running: " . $redis -> ping();

简单优化

刚刚安装好的 Redis 还需要点小配置,由于我的机器内存并不多,为了防止突发事件导致内存爆炸,我们给它设置一下,限制它可以占用多少内存。

首先使用 VIM 编辑 Redis 的配置文件:

[[email protected] ~]# vim /etc/redis.conf

使用 :\maxmemory 搜索最大内存的相关配置内容:

# In short... if you have slaves attached it is suggested that you set a lower
# limit for maxmemory so that there is some free RAM on the system for slave
# output buffers (but this is not needed if the policy is 'noeviction').
#
# maxmemory <bytes>

可以看到它也默认被注释了,我们另起一行。由于我的机器内存小,我就给了它 400 MB 的最大内存,把 MB 换算成 B 就是 400000000 B 了。(1 MB = 1000000 B)

maxmemory 400000000

:wq 保存,重启 Redis 服务。

service redis restart

至此,内存限制已经配置完成。可以正式开始在项目中使用 Redis 了。

常用方法

判断是否安装 Redis 扩展:

extension_loaded("redis") // 返回 true 或 false

判断 Redis 数据库内是否包含一个键:

$redis = new Redis();
...
$redis -> exists("键名") // 返回 true 或 false

设置一个键与值:

$redis = new Redis();
...
$redis -> set("键名", "值");

获取一个键的值:

$redis = new Redis();
...
$redis -> get("键名");

创建一个列表,并在列表前面添加值:

$redis = new Redis();
...
$redis -> lpush("键名", "值");

创建一个列表,并在列表后面添加值:

$redis = new Redis();
...
$redis -> rpush("键名", "值");

取出一个列表的所有值:

$redis = new Redis();
...
$redis -> lrange("键名", "从哪开始取值", "取到哪里结束");

修改一个列表的指定索引的值:

$redis = new Redis();
...
$redis -> lset("键名", "索引值", "替换后的值");

清除一个键的值:

$redis -> del("键名");

清除所有库的所有值:

$redis -> flushall()

参考资料

《PHP 使用 Redis》- Mr.Peter
《Redis 快速入门详解》- 王六六
《Linux 下 Yum 安装 Redis 以及使用》- 羽哲