前言
redis是乙個key-value儲存系統,現在在各種系統中的使用越來越多,大部分情況下是因為其高效能的特性,被當做快取使用,這裡介紹下redis經常遇到的使用場景。下面話不多說了,來一起看看詳細的介紹吧。
redis特性
乙個產品的使用場景肯定是需要根據產品的特性,先列舉一下redis的特點:
這裡我們通過幾個場景,不同維度說下redis的應用。
高效能適合當做快取
快取是redis最常見的應用場景,之所有這麼使用,主要是因為redis讀寫效能優異。而且逐漸有取代memcached,成為首選服務端快取的元件。而且,redis內部是支援事務的,在使用時候能有效保證資料的一致性。
作為快取使用時,一般有兩種方式儲存資料:
1、讀取前,先去讀redis,如果沒有資料,讀取資料庫,將資料拉入red程式設計客棧is。
2、插入資料時,同時寫入redis。
方案一:實施起來簡單,但是有兩個需要注意的地方:
1、避免快取擊穿。(資料庫沒有就需要命中的資料,導致redis一直沒有資料,而一直命中資料庫。)
2、資料的實時性相對會差一點。
方案二:資料實時性強,但是開發時不便於統一處理。
當然,兩種方式根據實際情況來適用。如:方案一適用於對於資料實時性要求不是特別高的場景。方案二適用於字典表、資料量不大的資料儲存。
豐富的資料格式效能更高,應用場景豐富
redis相比其他快取,有乙個非常大的優勢,就是支援多種資料型別。
資料型別
說程式設計客棧明
string
字串,最簡單的k-v儲存
hash
hash格式,value為field和value,適合id-detail這樣的場景。
list
簡單的list,順序列表,支援首位或者末尾插入資料
set無序list,查詢速度快,適合交集、並集、差集處理
sorted set
有序的set
其實,通過上面的資料型別的特性,基本就能想到合適的應用場景了。
如上所述,雖然redis不像關聯式資料庫那麼複雜的資料結構,但是,也能適合很多場景,比一般的快取資料結構要多。了解每種資料結構適合的業務場景,不僅有利於提公升開發效率,也能有效利用redis的效能。
單執行緒可以作為分布式鎖
談到redis和memcached 的區別,大家更多的是談到資料結構和持久化這兩個特性,其實還有乙個比較大的區別就是:
所以redis單執行緒的這個特性,其實也是很重要的應用場景,最常用的就是分布式鎖。
應對高併發的系統,都是用多伺服器部署,每個技術框架針對資料鎖都有很好的處理方式,如 .net 的lock,j**a 的synchronized,都能通過鎖住某個物件來應對執行緒導致的資料汙染問題。但是畢竟,只能控制本伺服器的執行緒,分布式部署
以後資料汙染問題,就比較難處理了。redis的單執行緒這個特性,就非常符合這個需求,偽**如下:
//產生鎖
while lock!=1
//過期時間是為了避免死鎖
now = int(time.time())
lock_timeout = now + lock_timeout + 1
lock = redis_client.setnx(lock_key, lock_timeout)
//真正要處理的業務
doing()
//釋放鎖
now = int(time.time())
if now < lock_timeout:
redis_client.delete(lock_key)
以上是乙個只說明流程的偽**,其實整體的邏輯是很簡單的,只要考慮到死鎖時的情況,就比較好處理了。redis作為分布式鎖,因為其效能的優勢,不會成為瓶頸,一般會產生瓶頸的是真正的業務處理內容,程式設計客棧還是盡量縮小鎖的範圍來確保系統效能。
自動過期能有效提公升開發效率
redis針對資料都可以設定過期時間,這個特點也是大家應用比較多的,過期的資料清理無需使用方去關注,所以開發效率也比較高,當然,效能也比較高。最常見的就是:簡訊驗證碼、具有時間性的商品展示等。無需像資料庫還要去查時間進行對比。因為使用比較簡單,就不贅述了。
分布式和持久化有效應對海量資料和高併發
redis初期的版本官方只是支援單機或者簡單的主從,大多應用則都是自己去開發集群的中介軟體,但是隨著應用越來越廣泛,使用者關於分布式的呼聲越來越高,所以redis 3.0版本時候官方加入了分布式的支援,主要是兩個方面:
而且redis雖然是乙個記憶體快取,資料存在記憶體,但是redis支援多種方式將資料持久化,寫入硬碟,所有,redis資料的穩定性也是非常有保障的,結合redis的集群方案,有的系統已經將redis當做一種nosql資料儲存來適用。
示例:秒殺和redis的結合
秒殺是現在網際網路系統中常見的營銷模式,作為開發者,其實最不願意這樣的活動,因為非技術人員無法理解到其中的技術難度,導致在資源協調上總是有些偏差。秒殺其實經常會出現的問題包括:
其實解決這些問題基本就兩個方案:
現在說明一下,如果現在做乙個秒殺,那麼,redis應該如何結合進行使用?
以上是乙個簡略的秒殺系統和redis結合的方案,當然實際可能還會引入http快取,或者將訊息對接用mq代替等方案,也會出現業務遺漏的情況,這個只是希望能拋磚引玉。
總結本文標題: 深入解析redis中常見的應用場景
本文位址: /shujuku/redis/205214.html
應用系統中常見報表型別解析
根據報表的布局 資料來源結構 列印方式和資料分析方式,可將應用系統中的報表分為以下型別 一 清單報表 清單報表主要用於列舉資料,比如 銷售清單 客戶清單 裝置清單 費用清單 商品清單等。在實現這類報表時可用到 列表 文字框 影象 條碼等控制項。實現步驟 基於 布局的清單報表 基於任意布局的清單報表 ...
應用系統中常見報表型別解析
根據報表的布局 資料來源結構 列印方式和資料分析方式,可將應用系統中的報表分為以下型別 一 清單報表 清單報表主要用於列舉資料,比如 銷售清單 客戶清單 裝置清單 費用清單 商品清單等。在實現這類報表時可用到 列表 文字框 影象 條碼等控制項。實現步驟。基於 布局的清單報表 基於任意布局的清單報表 ...
Go開發中常見的錯誤解析
gopath設定 設定工作目錄go 命令依賴乙個重要的環境變數 gopath1 為了方便,應該把新建以上資料夾,並且把以上一行加入到 bashrc 或者 zshrc 或者自己的 sh 的配置檔案中。windows 設定如下,新建乙個環境變數名稱叫做gopath 複製 如下 gopath e c wo...