Redis 的定義? 百度百科: Redis(Remote Dictionary Server ),即遠程字典服務,是一個開源的使用ANSI C語言編寫、支持網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。 中文官網: Redis是一個開源(BSD許可),記憶體存 ...
Redis 的定義?
百度百科: Redis(Remote Dictionary Server ),即遠程字典服務,是一個開源的使用ANSI C語言編寫、支持網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。
中文官網: Redis是一個開源(BSD許可),記憶體存儲的數據結構伺服器,可用作資料庫,高速緩存和消息隊列代理。它支持字元串、哈希表、列表、集合、有序集合,點陣圖,hyperloglogs等數據類型。內置複製、Lua腳本、LRU收回、事務以及不同級別磁碟持久化功能,同時通過Redis Sentinel提供高可用,通過Redis Cluster提供自動分區。
簡單來說: Redis 是一個高性能的 key-value 資料庫。
Redis 出現的背景
磁碟時代
很久之前,我們的數據存儲方式是磁碟存儲,每個磁碟都有一個磁軌。每個磁軌有很多扇區,一個扇區接近512Byte。
磁碟的定址速度是毫秒級的,帶寬是GB/MB的。記憶體是ns級的,帶寬也比磁碟大上好幾個數量級。總體來說,磁碟比記憶體在定址上慢了接近10W倍。
在這段歷史中,我們的面臨的問題是,I/O問題。在讀寫文件時,我們常常面臨很大的I/O成本問題。但是最初有個最初的解決方案是加一個buffer。
資料庫的產生
資料庫技術就是為瞭解決磁碟的I/O瓶頸。為瞭解決這個問題,我們將磁碟扇區分為4K的一個個小的分區,構成索引。有了這些索引值,我們就能通過索引進行更便捷的查找。為了能否更快的查找,我們將索引使用B+樹進行存儲。
key-value 資料庫的產生
隨著互聯網的發展,我們面臨了一個新的問題。如何才能抵擋高併發,以及大數據導致的查找變慢呢?(註意,數據量變大,僅僅影響多數據查找,單數據查找並不會影響性能。我們的業務邏輯,通常是多條數據查找,所以才會有瓶頸)
高併發意味著每秒的查詢數量很大, 傳統的基於資料庫(磁碟)查找的問題就出來了,磁碟IO很明顯不能有效支撐高併發查詢.(比如,通常單機的MYSQL伺服器只能支撐幾千的併發請求,當然不同配置的機器肯定有所差異)
於是我們的基於記憶體存儲的 key-value 資料庫產生了
Redis 優勢
- 性能極高: Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
- 豐富的數據類型: Redis支持二進位案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。
- 原子: Redis的所有操作都是原子性的,意思就是要麼成功執行要麼失敗完全不執行。單個操作是原子性的。多個操作也支持事務,即原子性,通過MULTI和EXEC指令包起來。
- 豐富的特性: Redis還支持 publish/subscribe, 通知, key 過期等等特性。
Redis與其他key-value存儲有什麼不同?
Redis有著更為複雜的數據結構並且提供對他們的原子性操作,這是一個不同於其他資料庫的進化路徑。Redis的數據類型都是基於基本數據結構的同時對程式員透明,無需進行額外的抽象。
Redis運行在記憶體中但是可以持久化到磁碟,所以在對不同數據集進行高速讀寫時需要權衡記憶體,應為數據量不能大於硬體記憶體。在記憶體資料庫方面的另一個優點是, 相比在磁碟上相同的複雜的數據結構,在記憶體中操作起來非常簡單,這樣Redis可以做很多內部複雜性很強的事情。 同時,在磁碟格式方面他們是緊湊的以追加的方式產生的,因為他們並不需要進行隨機訪問。
Redis 可以做什麼?
-
熱點數據緩存
- 頭條新聞
- 微博熱議
- 最新評論等等
-
分散式數據共用
- Session數據
- 共用配置
-
分散式鎖
- 搶票系統,剩餘票數
- 秒殺活動,商品庫存
-
全局ID
- int類型,incrby,利用原子性 incrby userid 1000 分庫分表的場景,一次性拿一段
-
計數器
- int類型,incr方法例如:文章的閱讀量、微博點贊數、允許一定的延遲,先寫入Redis再定時同步到資料庫
-
限流
- 以訪問者的ip和其他信息作為key,訪問一次增加一次計數,超過次數則返回false
-
消息隊列
- List提供了兩個阻塞的彈出操作:blpop/brpop,可以設置超時時間
- blpop:blpop key1 timeout 移除並獲取列表的第一個元素,如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
- brpop:brpop key1 timeout 移除並獲取列表的最後一個元素,如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
- 隊列:先進先除:rpush blpop,左頭右尾,右邊進入隊列,左邊出隊列
- 棧:先進後出:rpush brpop
-
抽獎
- 自帶一個隨機獲得值spop myset