这篇文章上次修改于 976 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
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 扩展目录内:
[root@paul ~]# cd /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/
[root@paul 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()
页面可以确认配置文件的路径。
确认路径后,我们使用 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 扩展已经成功启用。
测试连接
使用 VIM 或其他编辑器编写一段 PHP 文件,保存后在浏览器上运行查看输出结果。
// 初始化
$redis = new Redis();
// 连接 Redis
$redis -> connect('127.0.0.1', 6379);
// 若已成功连接,就能查看其 Ping 消息
echo "Server is running: " . $redis -> ping();
简单优化
刚刚安装好的 Redis 还需要点小配置,由于我的机器内存并不多,为了防止突发事件导致内存爆炸,我们给它设置一下,限制它可以占用多少内存。
首先使用 VIM 编辑 Redis 的配置文件:
[root@paul ~]# 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 以及使用》- 羽哲
已有 3 条评论
太专业了,真想像博主一样成为技术达人
有没有 Ubuntu 系统的 Redis 教程
@loin Ubuntu 和 CentOS 差不多的,把 yum 改成 apt 试试?