zoukankan      html  css  js  c++  java
  • Redis在WEB开发中的应用与实践

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

  • 相关阅读:
    线程中消费者生产者的实例代码(synchronized关键字)
    ThreadLocal管理Connection
    ThreadLocal的练习代码
    JDK中线程组ThreadGroup
    创建线程的三种方式
    ES练习代码
    window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法
    ES配置文件中文版
    springmvc工作原理
    IE不兼容document.getElementsByClassName
  • 原文地址:https://www.cnblogs.com/timothy-lai/p/5527819.html
Copyright © 2011-2022 走看看