文章版權由做者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/html
MySQL自己是適合進行海量數據存儲的,經過Memcached將熱點數據加載到cache從而加速訪問,不少公司目前都採用這樣的架構,但隨着業務數據量和訪問量的持續增加,咱們遇到了不少問題:java
a.MySQL須要不斷進行拆庫拆表,Memcached也需不斷跟着擴容,擴容和維護工做佔據大量開發時間。mysql
b.Memcached與MySQL數據庫數據一致性問題。git
c.Memcached數據命中率低或宕機,大量訪問直接穿透到DB,MySQL沒法支撐。github
d.跨機房cache同步問題。redis
爲解決以上問題,咱們開始選擇用Redis來替代Memcached。算法
Redis是一種典型的NoSQL數據庫服務器,它能夠做爲服務程序獨立運行於本身的服務器主機。在不少時候,人們只是將Redis視爲Key/Value數據庫服務器,可是在目前的版本中,Redis除了Key/Value以外還支持List、Hash、Set和Ordered Set等數據結構,所以它的用途也更爲寬泛。Redis的License是Apache License,就目前而言,它是徹底免費。sql
咱們常常會將memcached(數據緩存服務器)與Redis來進行對比,由於他們在使用方式上比較類似,並且也均是免費,均使用了內存來進行數據緩存。可是它們之間的最大區別在於memcached只是提供了數據緩存服務,一旦服務器宕機,以前在內存中緩存的數據也將所有消失, memcached沒有提供任何形式的數據持久化功能,而Redis則提供了這樣的功能。第二,Redis提供了更爲豐富的數據存儲結構,如Hash和Set等。數據庫
項目中常常在以下幾個場景中使用Redis:Session共享,數據採集統計等。windows
Redis對於Linux是官方支持的,安裝和使用參考官網(http://redis.io/download),可是Redis官方是不支持windows的,好在 Microsoft Open Tech group 在 GitHub上開發了一個Win64的版本,項目地址是:https://github.com/MSOpenTech/redis。打開後,直接使用瀏覽器下載或Git克隆便可:
直接雙擊redis-server.exe即啓動一個redis服務實例,可是若是想以windows服務形式運行,須要執行一下命令:
//註冊至服務管理中
redis-server --service-install redis.windows.conf --loglevel verbose --service-name Redis6379
成功後,開啓服務便可:
Redis如mysql數據庫同樣,能夠支持主從數據庫配置,並且配置方式十分簡單。將原有Redis安裝文件再複製一份,打開Config文件,修改對應slaveof配置便可:
以上面提到的指令註冊服務,運行該從數據庫:
Redis默認是沒有密碼的,爲了數據的安全性須要咱們本身啓動權限控制和密碼配置等。
打開config文件,找到bind關鍵字,修改其中綁定的IP便可:
一樣打開config文件,找到requirepass關鍵字,將對應部分修改成指定密碼:
注意,若是咱們對主數據庫設定了密碼,那麼slave數據庫上在監聽主數據庫的配置中也要加上對應的密碼:
這裏咱們使用RedisDesktopManager來管理Redis數據庫。在官網上(https://redisdesktop.com/download)下載完該工具後,本地安裝後鏈接至數據庫上:
單擊主數據庫文件中的redis-cli.exe,輸入測試命令:
在輸入獲取Value的命令,發現已經成功:
同時,在可視化工具中能看到,主從數據庫中均已同步:
使用Java操做Redis須要jedis-2.1.0.jar,下載地址:http://files.cnblogs.com/liuling/jedis-2.1.0.jar.zip。
若是須要使用Redis鏈接池的話,還需commons-pool-1.5.4.jar,下載地址:http://files.cnblogs.com/liuling/commons-pool-1.5.4.jar.zip。
Redis中能夠存儲各類數據類型,不一樣數據類型有其使用場景,具體各數據類型的使用在操做文檔中均能查找(http://redisdoc.com/index.html):
這裏以幾個經常使用類型做爲介紹。
String是最經常使用的一種數據類型,普通的key/value存儲均可以歸爲此類,value其實不只是String,也能夠是數字:好比想知道何時封鎖一個IP地址(訪問超過幾回)。INCRBY命令讓這些變得很容易,經過原子遞增保持計數。
在Redis中,List類型是按照插入順序排序的字符串鏈表。和數據結構中的普通鏈表同樣,咱們能夠在其頭部(left)和尾部(right)添加新的元素。在插入時,若是該鍵並不存在,Redis將爲該鍵建立一個新的鏈表。與此相反,若是鏈表中全部的元素均被移除,那麼該鍵也將會被從數據庫中刪除。List中能夠包含的最大元素數量是4294967295。
從元素插入和刪除的效率視角來看,若是咱們是在鏈表的兩頭插入或刪除元素,這將會是很是高效的操做,即便鏈表中已經存儲了百萬條記錄,該操做也能夠在常量時間內完成。然而須要說明的是,若是元素插入或刪除操做是做用於鏈表中間,那將會是很是低效的。相信對於有良好數據結構基礎的開發者而言,這一點並不難理解。
在Redis中,咱們能夠將Set類型看做爲沒有排序的字符集合,和List類型同樣,咱們也能夠在該類型的數據值上執行添加、刪除或判斷某一元素是否存在等操做。須要說明的是,這些操做的時間複雜度爲O(1),即常量時間內完成次操做。Set可包含的最大元素數量是4294967295。
和List類型不一樣的是,Set集合中不容許出現重複的元素,這一點和C++標準庫中的set容器是徹底相同的。換句話說,若是屢次添加相同元素,Set中將僅保留該元素的一份拷貝。和List類型相比,Set類型在功能上還存在着一個很是重要的特性,即在服務器端完成多個Sets之間的聚合計算操做,如unions、intersections和differences。因爲這些操做均在服務端完成,所以效率極高,並且也節省了大量的網絡IO開銷。
咱們能夠將Redis中的Hashes類型當作具備String Key和String Value的map容器。因此該類型很是適合於存儲值對象的信息。如Username、Password和Age等。若是Hash中包含不多的字段,那麼該類型的數據也將僅佔用不多的磁盤空間。每個Hash能夠存儲4294967295個鍵值對。
Redis提供瞭如下幾種持久化方式:
a.RDB持久化:
該機制是指在指定的時間間隔內將內存中的數據集快照寫入磁盤。
b.AOF持久化:
該機制將以日誌的形式記錄服務器所處理的每個寫操做,在Redis服務器啓動之初會讀取該文件來從新構建數據庫,以保證啓動後數據庫中的數據是完整的。
c.無持久化:
咱們能夠經過配置的方式禁用Redis服務器的持久化功能,這樣咱們就能夠將Redis視爲一個功能增強版的memcached了。
d.同時應用AOF和RDB。
Redis3.2版本中增長了對GEO(地理位置)的支持。目前其提供瞭如下幾種操做方式:
a.geoadd:增長某個地理位置的座標。
b.geopos:獲取某個地理位置的座標。
c.geodist:獲取兩個地理位置的距離。
d.georadius:根據給定地理位置座標獲取指定範圍內的地理位置集合。
e.georadiusbymember:根據給定地理位置獲取指定範圍內的地理位置集合。
f.geohash:獲取某個地理位置的geohash值。
由於其面向的爲主流互聯網環境,因此其支持的地理座標系指定爲WGS84座標系,其中的geohash編碼算法與我在以前的博客中所提到的一致:WebGIS中GeoHash編碼的研究和擴展(http://www.cnblogs.com/naaoveGIS/p/5164187.html)。除了咱們本身寫代碼完成該算法,也有已經開源封裝好的源碼:https://github.com/kungfoo/geohash-java。
-----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/
若是您以爲本文確實幫助了您,能夠微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^