Redis

Redis是線程安全的(因爲是單線程),所有操作都是原子的,不會因併發產生數據異常
Redis速度非常快(因爲使用非阻塞式IO,大部分命令的算法時間複雜度是O(1))
Redis採用-key-value型的基本數據結構
不要使用過長的Key,不要過短,最大Key長度是512MB(Value最大長度也是512MB)
String:
Set:爲一個Key設置Value
Get:獲取某個Key對應的Value,時間複雜度爲O(1)
GetSet:爲一個Key設置Value,並返回該Key的原Value,時間複雜度是O(1)
Mset:爲多個Key設置Value,時間是O(n)

Redis緩存機制:
(1)持久化數據庫的缺點
也就是說,我們日常使用的關係型數據中的數據,全部存儲在我們部署數據庫的機器
的硬盤中。

一般我們的網站開發完成,上線之後,服務器的讀寫效率是網站運行速度的重要條件,
當然還有服務器的帶寬等,但是這些東西都可以通過硬件的更新升級來解決。
其實與網站運行效率息息相關的東西,就是我們的------數據庫。

數據庫處理數據的速度,與網站速度息息相關,而數據查詢、數據處理等等,
都和數據庫處理速度有關。提高數據庫的處理數據的能力,其中一個方案就是
sql語句的優化技術,sql語句寫的處理效率比較高,數據庫處理能力就會上去,
而網站的數據處理能力也會快些。

但是,當網站的處理和訪問量非常大的時候,我們的數據庫的壓力就變大了,數據庫的
連接池,數據庫同時處理數據的能力就會受到很大的挑戰,一旦數據庫承受了其最大承受
能力,網站的數據處理效率就會大打折扣。此時就要使用高併發處理、負載均衡和分佈式數據庫,
而這些技術既花費人力,又花費資金。

如果我們的網站不是非常大的網站,而有想要提高網站的效率,降低數據庫的讀寫次數,我們就
需要引入緩存技術。

(2)緩存
緩存就是在內存中存儲的數據備份,當數據沒有發生本質改變的時候,我們就不讓數據的查詢 去數據庫進行操作,而去內存中取數據,這樣就大大降低了數據庫的讀寫次數,而且從內存中讀數據
的速度比去數據庫查詢要快一些,這樣同時又提高了效率。

使用緩存減輕數據庫的負載:
在開發網站的時候如果有一些數據在短時間之內不會發生變化,而它們還要被頻繁訪問,爲了
提高用戶的請求速度和降低網站的負載,就把這些數據放到一個讀取速度更快的介質上(或者
是通過較少的計算量就可以獲得該數據),該行爲就稱作對該數據的緩存。
該介質可以是文件/數據庫/內存。內存經常用於數據庫緩存。

緩存的兩種形式:
頁面緩存經常用在CMS(content manage system)內存管理系統裏面。
數據緩存經常會用在頁面的具體數據裏面。

緩存分爲兩種:
頁面緩存(smarty靜態化技術)
數據緩存

(3)Redis介紹
我們要學習的一個緩存技術就是----Redis:
Redis是Remote Dictionary Server(遠程數據服務)的縮寫,由意大利人antirez(Salvatore Sanfilippo)開發的一款內存高速緩存數據庫,該軟件使用C語言編寫,它的數據模型爲key-value。
它支持豐富的數據結構(類型),比如String/List/Hash/Set/Sorted Set。

可持久化(一邊運行,一邊把數據往硬盤中備份一份,防止斷電等情況導致數據丟失,等斷電情況恢復之後,Redis再把硬盤中的數據恢復到內存中),保證了數據的安全。

(4)redis和memcache比較
1.Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
2.Redis支持master-slave(主-從)模式應用
3.Redis支持數據持久化,可以將內存中的數據保持在磁盤中,重啓的時候可以再次加載進行使用。
4.Redis單個value的最大限制是1GB,memcached只能保存1MB的數據。


一.爲什麼選擇redis
在項目中使用redis做爲緩存,還沒有使用memcache,考慮因素主要有兩點:
1.redis豐富的數據結構,其hash,list,set以及功能豐富的String的支持,對於實際項目中的使用有很大的幫忙。
2.redis單點的性能也非常高效(利用項目中的數據測試優於memcache).


二.分佈式緩存的架構設計
1.架構設計
由於redis是單點,項目中需要使用,必須自己實現分佈式。基本架構圖如下所示:

2.分佈式實現
通過key做一致性哈希,實現key對應redis結點的分佈。
一致性哈希的實現:
l        hash值計算:通過支持MD5與MurmurHash兩種計算方式,默認是採用MurmurHash,高效的hash計算。
l        一致性的實現:通過Java的TreeMap來模擬環狀結構,實現均勻分佈

3.client的選擇
對於jedis修改的主要是分區模塊的修改,使其支持了跟據BufferKey進行分區,跟據不同的redis結點信息,可以初始化不同的ShardInfo,同時也修改了JedisPool的底層實現,使其連接pool池支持跟據key,value的構造方法,跟據不同ShardInfos,創建不同的jedis連接客戶端,達到分區的效果,供應用層調用

4.模塊的說明
l        髒數據處理模塊,處理失敗執行的緩存操作。
l        屏蔽監控模塊,對於jedis操作的異常監控,當某結點出現異常可控制redis結點的切除等操作。
整個分佈式模塊通過hornetq,來切除異常redis結點。對於新結點的增加,也可以通過reload方法實現增加。(此模塊對於新增結點也可以很方便實現)
對於以上分佈式架構的實現滿足了項目的需求。另外使用中對於一些比較重要用途的緩存數據可以單獨設置一些redis結點,設定特定的優先級。另外對於緩存接口的設計,也可以跟據需求,實現基本接口與一些特殊邏輯接口。對於cas相關操作,以及一些事物操作可以通過其watch機制來實現。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章