Redis在WEB開發中的應用與實踐php
1、Redis概述:linux
Redis是一個功能強大、性能高效的開源數據結構服務器,Redis最典型的應用是NoSQL。但事實上Redis除了做爲NoSQL數據庫使用以外,還能普遍應用消息隊列,數據堆棧以及數據緩存等衆多場合。Redis與Memcached相相似,都是以鍵值對(key-value)存放數據的,可是Redis支持的數據類型及特性遠比Memcached豐富。git
在緩存應用方面,Redis一樣也是一個內存數據庫,擁有Memcached的快速、穩定等特性,而且支持數據快照功能,開發人員能夠經過配置文件制定數據快照時間間隔,Redis會將數據快照自動存放於硬盤中,這樣就算服務器忽然中止服務,Redis也極少會出現丟失數據的現象。因此近些年來愈來愈多的大型物聯網公司開始使用Rdeis做爲緩存服務器。github
相比於MongoDB,Redis是更加完全的Key-Value存儲系統,它沒有專門的查詢語言,也沒有明確的數據類型。一個字符串,能夠代替全部的儲存類型,例如直接使用string類型存放傳統文本、代碼、序列等;也能夠直接存放數據流,例如圖片、視頻等,而且沒有數據大小的限制。雖然沒有數據類型的限制,單位了方便數據管理,Redis提供了多種數據結構類型,分別爲string(字符串)、list(列表)、sets(集合)或者是ordered sets(有序集合)。全部的數據類型都支持push/pop、add/remove、服務端並集、交集、sets集合差異等操做,這些操做都具備原子性的,Redis還支持各類不一樣的排序功能。redis
與Memcached同樣,Redis的儲存方式給予內存的,全部的數據讀寫都在內存中完成。單Memcache使用的libevent庫,而Redis則原生使用epoll異步通訊模型,因此在性能上比Memcache更加優秀。同時,Redis還提供了Virtual Memory功能,使得數據可以在指定間隔時間內保存到硬盤(由後臺自動完成),避免數據在內存中丟失。數據庫
與MongoDB同樣,雖然統稱爲NoSQL,但Redis不管在使用方式上,仍是數據處理流程上都有較大的區別。MySQL、Redis、MongoDB、Memcache之間的屬性對好比表1所示:緩存
表1 儲存屬性概念安全
數據庫服務器 |
數據庫session |
數據表 |
字段 |
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緩存系統。
2、Redis的安裝(linux下安裝)
一、下載Redis:地址是http://www.redis.io/download,這裏使用的是版本3.0.5
二、安裝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/
三、啓動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端口經過。
四、安裝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的問題。