Redis在WEB开发中的应用与实践

时间:2023-11-09 21:11:50

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的问题。