Redis在WEB开发中的应用与实践
一、Redis概述:
Redis是一个功能强大、性能高效的开源数据结构服务器,Redis最典型的应用是NoSQL。但事实上Redis除了作为NoSQL数据库使用之外,还能广泛应用消息队列,数据堆栈以及数据缓存等众多场合。Redis与Memcached相类似,都是以键值对(key-value)存放数据的,但是Redis支持的数据类型及特性远比Memcached丰富。
在缓存应用方面,Redis同样也是一个内存数据库,拥有Memcached的快速、稳定等特性,并且支持数据快照功能,开发人员可以通过配置文件制定数据快照时间间隔,Redis会将数据快照自动存放于硬盘中,这样就算服务器突然停止服务,Redis也极少会出现丢失数据的现象。所以近些年来越来越多的大型物联网公司开始使用Rdeis作为缓存服务器。
相比于MongoDB,Redis是更加彻底的Key-Value存储系统,它没有专门的查询语言,也没有明确的数据类型。一个字符串,可以代替所有的储存类型,例如直接使用string类型存放传统文本、代码、序列等;也可以直接存放数据流,例如图片、视频等,并且没有数据大小的限制。虽然没有数据类型的限制,单位了方便数据管理,Redis提供了多种数据结构类型,分别为string(字符串)、list(列表)、sets(集合)或者是ordered sets(有序集合)。所有的数据类型都支持push/pop、add/remove、服务端并集、交集、sets集合差别等操作,这些操作都具有原子性的,Redis还支持各种不同的排序功能。
与Memcached一样,Redis的储存方式给予内存的,所有的数据读写都在内存中完成。单Memcache使用的libevent库,而Redis则原生使用epoll异步通信模型,所以在性能上比Memcache更加优秀。同时,Redis还提供了Virtual Memory功能,使得数据能够在指定间隔时间内保存到硬盘(由后台自动完成),避免数据在内存中丢失。
与MongoDB一样,虽然统称为NoSQL,但Redis无论在使用方式上,还是数据处理流程上都有较大的区别。MySQL、Redis、MongoDB、Memcache之间的属性对比如表1所示:
表1 储存属性概念
数据库 |
数据库 |
数据表 |
字段 |
MySQL |
库 |
表 |
字段、列 |
Redis |
库 |
Key |
无 |
MongoDB |
库 |
集合 |
文档属性 |
Memcached |
无 |
Key |
无 |
与MongoDB相比,Redis主要优点分别如下:
☞ Redis数据储存在内存中完成,所以在数度上比较有优势,MongoDB使用memory-mapped处理方式本质上还是磁盘操作
☞ Redis与MongoDB在设计之初均考虑到分布式处理能力,所以这两者都提供了集群部署配置接口,但相对而言Redis及全部输更加容积及稳定。
☞ Redis提供了简单的事务支持,MongoDB不支持事务。
Redis并非只有有点,也有缺点,这些缺点是明显的,分别如下:
☞ Redis没有字段的概念,所以在数据查询上功能比较弱,支持的特性比较简单。
☞ Redis单个value的最大容量可达1GB,虽然MongoDB单个文档最大容量为16MB,但MongoDB提供了GridFS用于实现超大文件存储。
☞ 由于Redis本质上是一个内存书库,所以内存硬件的容量大小直接决定了Redis可用的数据库空间(Redis2.0新增了Virtual Memory功能解决了容量问题,但虚拟内存本质上就是磁盘)。
☞ Redis虽然在内存中查询数据,但为了确保数据的安全,Redis默认情况下使用子线程对数据进行持久化处理,如果配置不当(默认刷新间隔为20秒),将会是系统运行效率适得其反。
☞ MongoDB提供了mapreduce数据分析功能,Redis则没有数据分析功能。
随着大数据的爆发,无论是Redis还是MongoDB,都将会迎来越来越多的功能更新,选择哪一个作为NoSQL数据库,要看项目需要及开发人员技术水平。现在对这两种数据库进行总结及对比还为时过早。而Memcache已经好久没更新了,所以无论从性能、功能还是后续更新考虑,Redis都是Memcach的理想替代品,除此之外Redis还非常适用于以下场合:
(1) 海量的简单读写
根据Redis官方的测试结果,在50个并发的情况下请求10万次,写的书都市11000次/s,读的速度是81000次/s。所以用于处理类似于微博热点事件、交单排序、关注排行之类实时但功能单一的局部应用是最理想的
(2) 实时的反垃圾系统
反垃圾系统通常都是基于关键词的,使用Redis储存关系词,能够利用Redis的高性能,为监控系统提供稳定及精确的实时监控功能,典型的由邮件系统、评论系统等。
(3) 公开的统计系统
利用Redis的简单易用的群体部署功能,能够轻易地开发大规模的统计系统,例如广告系统、万展统计系统、简单的股市分析系统等。
(4) 消息队列
消息队列是提高关系型数据库数据插入的有效手段,Redis是NoSQL中为数不多支持消息队列的数据库。常用的应有由网站邮件、站内短信、品论系统等。
(5) 消息堆栈系统
消息堆栈与消息队列在处理顺序上是相反的,消息队列的规则为先进先出;而消息堆栈则是先进后出。典型的应用有论坛回帖排序等。
(6) 日志或缓存系统
Virtual Memory功能非常适用于存放安全日志、网站日志以及数据缓存等。国内的新浪微博所构建的缓存系统是全球最大的Redis缓存系统。
二、Redis的安装(linux下安装)
1、下载Redis:地址是http://www.redis.io/download,这里使用的是版本3.0.5
2、安装Redis,下载完成后,就可以安装Redis,在安装之前需要确保当前平台已经安装编译工具:
[root@localhost data]# tar zxvf redis-3.0.5.tar.gz
[root@localhost data]# cd redis-3.0.5
[root@localhost src]# make
[root@localhost redis-3.0.5]# cd src/
[root@localhost src]# make install
安装完成后,创建/usr/local/redis/bin目录,并将Redis客户端复制到该目录下,便于操作与管理:
[root@localhost src]# mkdir -p /usr/local/redis/bin
[root@localhost src]# mkdir -p /usr/local/redis/etc
[root@localhost src]# cp -pf redis-benchmark /usr/local/redis/bin/
[root@localhost src]# cp -pf redis-cli /usr/local/redis/bin/
[root@localhost src]# cp -pf redis-check-dump /usr/local/redis/bin/
[root@localhost src]# cp -pf redis-check-aof /usr/local/redis/bin/
[root@localhost src]# cp -pf redis-server /usr/local/redis/bin/
[root@localhost src]# cp -pf ../redis.conf /usr/local/redis/etc/
3、启动Redis
同样,在linux系统下启动Redis时需要指定配置文件,只需要将配置项daemonize设为true即可,该选项可以把Redis推送到后台运行,操作如下:
保存redis.conf配置文件,启动Redis,操作如下:
[root@localhost ~]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
启动完成后,可以通过查看Redis注程序是否存在,以确定Redis是否安装成功。
Redis默认使用6379通信端口,可以使用netstat –anput命令检测Redis是否运行成功,如果开启了防火墙,需要允许6379端口通过。
4、安装Redis扩展
Redis是一个完善、功能强大且易容的NoSQL数据库,之所以能够被广泛使用,与Redis官方提供稳定、可靠的API分不开。Redis项目提供了包括Java、C#、C++、PHP、JavaScript等主流语言的API,可以在http://www.redis.io/clients下载相应的安装包。对于PHP而言,只下载PHP类文件或者为PHP解释引擎安装扩展模块即可,显然安装扩展模块更加方便。下载地址为http://github.com/nicolasff/phpredis
在linux下安装phpredis扩展,使用PHP内置的phpize工具,可以很方便地为PHP引擎添加扩展模块。
(1) 下载phpredis
[root@localhost ~]# wget http://soft.beauty-soft.net/lib/phpredis-master.tar.gz
[root@localhost ~]# tar zxvf phpredis-master.tar.gz
[root@localhost ~]# cd phpredis-master
(2) 使用phpize工具安装phpredis
假设PHP安装的路径为/usr/local/php/,那么phpize的路径就位于/usr/local/php/bin/phpize,过程如下:
[root@localhost phpredis-master]# /usr/bin/phpize
[root@localhost phpredis-master]# ./configure --with-php-config=/usr/bin/php-config
[root@localhost phpredis-master]# make
[root@localhost phpredis-master]# make install
完成!
(3) 在配置文件中加入Redis扩展
最后只需要在php.ini配置文件中加入Redis扩展模块即可(php.ini路径可以通过phpinfo函数查看,通常为安装目录下的etc目录,例如:/usr/local/php/etc/)。
保存php.ini文件,重启Web服务器,整个安装流程就完成了,要检测是否安装成功,可以使用phpinfo函数检查是否存在Redis信息。
(4) 测试Redis
验证Redis数据库及phpredis扩展模块是否正确运行的最直接最有效的方法就是使用PHP代码进行测试,测试代码如下:
运行结果:
(5) TP框架使用Redis
在ThinkPHP中使用Redis缓存驱动与使用其他缓存启动并没有区别,只需要在配置文件配置好与Redis的配置项,在使用时直接切换即可,与Redis相关的配置项如下:
☞ REDIS_HOST:Redis服务器IP地址,例如:127.0.0.1;
☞ REDIS_PORT:Redis服务器开放端口,默认6379;
☞ DATA_CACHE_TIME:缓存有效时间,默认为0不限制。
此外,还可以直接通过Cache中间件中的getInstance方法初始化Redis配置信息,如下所示:
结果:
这里的set和get方法不是phpredis模块中的方法(phpredis模块也含有set和get方法),而是Cache缓存中间件所提供的缓存统一处理方法。
总结
从Redis的简介、安装到Redis的使用,再结合ThinkPHP框架的使用,可以考虑用Redis存储session来解决多台服务器共享session的问题。