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的問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM