李彬 朱亞興
摘 要:本文基于Redis的高速緩存機制在外勤通系統(tǒng)中的應用進行了研究,詳細說明了Redis這個高速緩存數(shù)據(jù)庫的支持持久化,豐富的數(shù)據(jù)結構,主從復制以及Virtual Memory功能等特性。
關鍵詞:Redis;Memcached;高速緩存
1 引言
在低碳經(jīng)濟的時代背景下,全球各大行業(yè)都在尋求節(jié)能、環(huán)保、高效的管理模式。這既是保證企業(yè)正常生產經(jīng)營,實現(xiàn)公司健康可持續(xù)發(fā)展的長久之計,也是企業(yè)適應市場需要,降低成本,增加效益,改善環(huán)境,提高企業(yè)競爭力的必要選擇。我們開發(fā)的外勤通系統(tǒng)就是遵循綠色辦公的宗旨,為所有具有外巡,外服的戶外工作業(yè)務的中小企業(yè)降低成本,企業(yè)初期零投入,不需服務器、系統(tǒng)研發(fā)等軟硬件投入;將定位技術與智能手機客戶端相結合,利用運營商的GSM/WCDMA等無線網(wǎng)絡,為企業(yè)提供對外勤人員實時、精準的管理手段。企業(yè)能隨時掌握在外工作人員的具體位置和行走軌跡,同時實現(xiàn)考勤簽到、快速審批、位置標注、語音群聊,數(shù)據(jù)上報,區(qū)域預警,更好地進行地理化分析、業(yè)績審視,改變傳統(tǒng)的辦公模式,實現(xiàn)無紙化和移動化辦公,快速響應客戶需求和有效管理員工,管理更加方便和人性化,深度鞏固企業(yè)在市場中主體地位和增強企業(yè)核心競爭力。
外勤通系統(tǒng)在給所有客戶帶來方便的同時,也需要面對網(wǎng)站訪問量漸增大、內容不斷豐富和用戶期望值不斷提高,用戶應用需要提供更快的訪問速度和承受更大的負荷量,所有這些都依賴于網(wǎng)站服務器的基礎設施,擴展服務器或者鏡像服務器是一個基本的解決方案,但擴展服務器會增加大量的運行維護工作,同時增加了運營成本,為了解決這個問題高速緩存服務器Cache不失為一個較好的解決方案,本文主要介紹開源內存數(shù)據(jù)庫Redis在高速緩存方面的的特性及其應用。
2 Redis
2.1 Redis簡介
Redis是一個基于內存的高性能key/value數(shù)據(jù)庫[1],全名為遠程字典服務(Remote Dictionary Server),與Memcached一樣,為了保證效率,數(shù)據(jù)都是緩存在內存中,也可以這樣說Redis就是用空間來換取時間,從而達到提高響應速度的目的。Memcached是一個免費開源的、高性能的、具有分布式內存對象的緩存系統(tǒng),它通過減輕數(shù)據(jù)庫負載加速動態(tài)Web應用。目前全球很多用戶都在使用它來構建自己的大負載網(wǎng)站或提高訪問量超大網(wǎng)站的響應速度[1]。相對于Redis來說,Memcached具有協(xié)議簡單,便捷的libenent事件處理,內存管理方式的高效性,以及互不通信的分布式等特性。
Redis與Memcached的最大區(qū)別是Redis會周期性把更新的數(shù)據(jù)備份到磁盤上或者把修改操作寫入記錄文件,并在此基礎上實現(xiàn)了主從同步。Redis很大程度補償了Memcached鍵值存儲的不足,在部分場合對關系數(shù)據(jù)庫起到很好的補充作用。Redis提供了更豐富的數(shù)據(jù)類型,如字符串(String),鏈表(List)、集合(Set)、有序集合(Zset)、哈希(Hash)等。
2.2 Redis的特性
Redis和Memached都是C/S結構的遠程Cache實現(xiàn),它們都可以作為緩存,但是Redis又有自己獨特的地方。這里重點講解Redis區(qū)別于Memcached的特征。
2.2.1 支持持久化
Redis和Memeache一樣都是把數(shù)據(jù)全部存在內存中,但是Redis會根據(jù)數(shù)據(jù)的更新量和更新間隔時間定期進行異步更新,將數(shù)據(jù)保存在磁盤上,實現(xiàn)數(shù)據(jù)的持久化操作。另外也可以通過配置redis.conf文檔配置持久化操作的時間間隔和臨界數(shù)據(jù)量,這樣Redis就自動在一定的時間間隔和數(shù)據(jù)超過臨界值時進行持久化操作。如果在Redis 宕機或者突然斷電的情況下,保存在Redis中的數(shù)據(jù)還是會丟失,所以Redis還提供了一種附加檔案功能AOF[2]。
通過把redis.cong中的appendonly屬性設置為“yes”來使用AOF功能,配置好AOF之后Redis每次接受到持久化命令時,就會將命令添加在配置文檔中,重新啟動Redis時,配置文檔中的指令會重新執(zhí)行,從而達到恢復Redis數(shù)據(jù)庫的狀態(tài)。
2.2.2 豐富的數(shù)據(jù)結構
Redis的數(shù)據(jù)結構非常豐富,Redis支持簡單的key/value類型數(shù)據(jù),其中Key是String類型,而value除了常規(guī)的String之外,還包括list,set,zset,hash等。這些新的屬性都是在Redis2.0中才有。Redis對所有的數(shù)據(jù)類型都提供 push/pop、add/remove、執(zhí)行服務端的并集、交集等功能,這些操作都是具有原子性的,它還支持各種不同的排序能力[1]。
2.2.3 支持主從復制
Redis的主從復制可以通過配置redis.conf文件中的Replication字段來實現(xiàn),Redis的主從復制具有如下特點:
(1)支持多級主從(master/slave),即一個主服務器可以連接多個從服務器
(2)從服務器可以再連接其他的從服務器
(3)主服務器和從服務器同步的數(shù)據(jù)復制是非阻塞的
其中利用Redis的主從復制特性,可以實現(xiàn)以下功能:
(1)實現(xiàn)讀寫分離,如用主服務實現(xiàn)讀操作,從服務實現(xiàn)寫操作。
(2)備份數(shù)據(jù),利用主從服務器的方便性來備份,專門做臺從服務器用于備份功能。
2.2.4 Virtual Memory功能
由于Redis受到了物理內存的限制,數(shù)據(jù)庫的容量有限,對于海量數(shù)據(jù)的高性能讀寫并不適合。Virtual Memory的功能就是為了解決這個問題而生,Virtual Memory功能也是Redis 2.0新增的功能,目的就是為了提高Redis對海量數(shù)據(jù)的高性能讀寫能力,它把很少使用的value保存再磁盤中,而只把key存在內存中,從而達到提高系統(tǒng)性能的目的。
3 Redis的應用
隨著外勤通系統(tǒng)客戶量不斷增加,每天客戶上傳和請求的數(shù)據(jù)量也是呈幾百,幾千倍的增加,面對不斷增加的龐大信息量數(shù)據(jù)庫的負擔越來越重,單純的靠增加服務器的數(shù)量所產生的運營和維護費用又特別大,而在速度就是市場的互聯(lián)網(wǎng)時代,快速相應是一個不變的需求。Redis由于其豐富數(shù)據(jù)結構,良好的性能,優(yōu)良的數(shù)據(jù)持久化能力占領了越來越大市場。我們的外勤通系統(tǒng)也引入了對Redis的應用。
Redis在外勤通系統(tǒng)中的應用主要表現(xiàn)在一下幾個方面:
⑴在應用集群中,作為中央會話,保存web中會話,保存終端鑒權后的token,通過鑒權之后不同的用戶登錄就展示不同的功能模塊。
save(String key, String value, Integer seconds){
Jedis jedis = null;
try {
jedis=(Jedis) pool.getResource();
jedis.set(key, value);
jedis.expire(key, seconds);
} catch (Exception e) {
e.printStackTrace();
}finally{
pool.returnResource(jedis);
}
}
⑵在通信中,作為發(fā)布訂閱隊列使用,web 發(fā)布消息,進入Redis 發(fā)布訂閱頻道,通信中心消費此頻道消息,所有的信息發(fā)布都在Redis中進行,從而提高了響應的速度。
public boolean sendMsg(String msg){
boolean rebool = true;
Jedis jedis = null;
try {
jedis=(Jedis) pool.getResource();
jedis.publish("kingfisher.*", msg);
} catch (Exception e) {
e.printStackTrace();
rebool = false;
}finally{
pool.returnResource(jedis);
}
return rebool;
}
⑶在重發(fā)消息以及離線消息的集合索引和隊列,保證在終端關機或者不在服務區(qū)范圍內沒有接受到的信息有一個重發(fā)機制,Redis中會保存近100小時之內的用戶信息,從而實現(xiàn)快速轉發(fā),超過100小時會自動清空Redis。
def sended(mobile,msgstr,msg):
row = MysqlDao().findClient(mobile)
if row is not None:
pool = MyRedis.getPool()
r = redis.Redis(connection_pool=pool)
r.sadd('sended_%s' % mobile,msg.bid)
r.set('s_msg_%s' % msg.bid,msgstr)
r.expire('s_msg_%s' % msg.bid,36000) #超過100小時不再為客戶端保留信息
⑷應用MONGODB附近位置的檢索
⑸應用mongodb gridFS=對文件中轉(PC ANDROID IOS)
⑹應用mongodb mapreduce并行計算,用戶從redis中調度生成當天用戶訪問行為,調度生成當天服務運行行為以及調度生成當天小時行為。
4 展望
外勤通系統(tǒng)由于其通用,高效,低碳等特點自推出以來就備受關注,現(xiàn)在外勤通的客戶群已經(jīng)達到了2000多人,隨著客戶的不斷增加,服務器的壓力也越來越大,引入了Redis之后系統(tǒng)的響應速度大大提高。但是隨著外勤通系統(tǒng)版本的不斷升級,客戶群的持續(xù)增加數(shù)據(jù)庫的壓力還是一個潛在的問題,為了更好的滿足客戶的需求,對服務器的優(yōu)化將是一個長期的工作。
[參考文獻]
[1]王心妍.emcached和Redis在高速緩存方面的應用[J].無線互聯(lián)科技,2012(9).
[2]楊艷,李煒,王純.內存數(shù)據(jù)庫在高速緩存方面的應用[J].現(xiàn)代電信科技,2011(12).