redis 是什么?都有哪些使用場景?


一、什么是redis

首先要說redis,應該先說一下nosql,NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是SQL”,泛指非關系型的數據庫。隨着互聯網web2.0網站的興起,傳統的關系數據庫在應付web2.0網站,特別是超大規模和高並發的SNS類型的web2.0純動態網站已經顯得力不從心,暴露了很多難以克服的問題,而非關系型的數據庫則由於其本身的特點得到了非常迅速的發展。NoSQL數據庫的產生就是為了解決大規模數據集合多重數據種類帶來的挑戰,尤其是大數據應用難題,包括超大規模數據的存儲。例如谷歌或Facebook每天為他們的用戶收集萬億比特的數據)。這些類型的數據存儲不需要固定的模式,無需多余操作就可以橫向擴展。

Redis:REmote DIctionary Server(遠程字典服務器)是完全開源免費的,用C語言編寫的,遵守BSD協議,是一個高性能的(key/value)分布式內存數據庫,基於內存運行並支持持久化的NoSQL數據庫,是當前最熱門的NoSql數據庫之一,也被人們稱為數據結構服務器。

二、redis使用場景

1、熱點數據的緩存

由於redis訪問速度塊、支持的數據類型比較豐富,所以redis很適合用來存儲熱點數據,另外結合expire,我們可以設置過期時間然后再進行緩存更新操作,這個功能最為常見,我們幾乎所有的項目都有所運用。

2、限時業務的運用

redis中可以使用expire命令設置一個鍵的生存時間,到時間后redis會刪除它。利用這一特性可以運用在限時的優惠活動信息、手機驗證碼等業務場景。

3、計數器相關問題

redis由於incrby命令可以實現原子性的遞增,所以可以運用於高並發的秒殺活動、分布式序列號的生成、具體業務還體現在比如限制一個手機號發多少條短信、一個接口一分鍾限制多少請求、一個接口一天限制調用多少次等等。

4、排行榜相關問題

關系型數據庫在排行榜方面查詢速度普遍偏慢,所以可以借助redis的SortedSet進行熱點數據的排序。

在奶茶活動中,我們需要展示各個部門的點贊排行榜, 所以我針對每個部門做了一個SortedSet,然后以用戶的openid作為上面的username,以用戶的點贊數作為上面的score, 然后針對每個用戶做一個hash,通過zrangebyscore就可以按照點贊數獲取排行榜,然后再根據username獲取用戶的hash信息,這個當時在實際運用中性能體驗也蠻不錯的。

  5、分布式鎖

這個主要利用redis的setnx命令進行,setnx:"set if not exists"就是如果不存在則成功設置緩存同時返回1,否則返回0 ,這個特性在俞你奔遠方的后台中有所運用,因為我們服務器是集群的,定時任務可能在兩台機器上都會運行,所以在定時任務中首先 通過setnx設置一個lock,如果成功設置則執行,如果沒有成功設置,則表明該定時任務已執行。 當然結合具體業務,我們可以給這個lock加一個過期時間,比如說30分鍾執行一次的定時任務,那么這個過期時間設置為小於30分鍾的一個時間 就可以,這個與定時任務的周期以及定時任務執行消耗時間相關。

當然我們可以將這個特性運用於其他需要分布式鎖的場景中,結合過期時間主要是防止死鎖的出現。

6、延時操作

這個目前我做過相關測試,但是還沒有運用到我們的實際項目中,下面我舉個該特性的應用場景。 比如在訂單生產后我們占用了庫存,10分鍾后去檢驗用戶是夠真正購買,如果沒有購買將該單據設置無效,同時還原庫存。 由於redis自2.8.0之后版本提供Keyspace Notifications功能,允許客戶訂閱Pub/Sub頻道,以便以某種方式接收影響Redis數據集的事件。 所以我們對於上面的需求就可以用以下解決方案,我們在訂單生產時,設置一個key,同時設置10分鍾后過期, 我們在后台實現一個監聽器,監聽key的實效,監聽到key失效時將后續邏輯加上。 當然我們也可以利用rabbitmq、activemq等消息中間件的延遲隊列服務實現該需求。

7、分頁、模糊搜索

redis的set集合中提供了一個zrangebylex方法,語法如下:

ZRANGEBYLEX key min max [LIMIT offset count]

通過ZRANGEBYLEX zset - + LIMIT 0 10 可以進行分頁數據查詢,其中- +表示獲取全部數據

zrangebylex key min max 這個就可以返回字典區間的數據,利用這個特性可以進行模糊查詢功能,這個也是目前我在redis中發現的唯一一個支持對存儲內容進行模糊查詢的特性。

前幾天我通過這個特性,對學校數據進行了模擬測試,學校數據60萬左右,響應時間在700ms左右,比mysql的like查詢稍微快一點,但是由於它可以避免大量的數據庫io操作,所以總體還是比直接mysql查詢更利於系統的性能保障。

8、點贊、好友等相互關系的存儲

Redis set對外提供的功能與list類似是一個列表的功能,特殊之處在於set是可以自動排重的,當你需要存儲一個列表數據,又不希望出現重復數據時,set是一個很好的選擇,並且set提供了判斷某個成員是否在一個set集合內的重要接口,這個也是list所不能提供的。 又或者在微博應用中,每個用戶關注的人存在一個集合中,就很容易實現求兩個人的共同好友功能。

這個在奶茶活動中有運用,就是利用set存儲用戶之間的點贊關聯的,另外在點贊前判斷是否點贊過就利用了sismember方法,當時這個接口的響應時間控制在10毫秒內,十分高效。

9、隊列

由於redis有list push和list pop這樣的命令,所以能夠很方便的執行隊列操作。

 

https://www.cnblogs.com/jxxblogs/p/12234723.html  


免責聲明!

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



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