目錄
1 爲什麼要有Reids?
在一些網站中,會在特定的時候出現兩種情況,海量用戶和高併發,比如京東的618,年底的12306,12306崩潰的現象相信在坐的各位都見過。那麼,在海量用戶和高併發的情況下,爲什麼會造成各大網站的崩潰呢。
罪魁禍首就是關係型數據庫,我們知道CPU是和高速緩存進行數據交換的,高速緩存是和內存進行數據交換的,而內存的數據交換是和磁盤進行的。我們知道,關係型數據庫例如MySQL,它的信息都是存放在硬盤上的,在用戶進行訪問操作的時候,需要將數據從硬盤中一層一層的往上傳遞,因此在海量用戶和高併發的情況下,性能低下,造成崩潰。
下面列出了關係型數據庫的幾個瓶頸:
- 性能瓶頸:磁盤IO性能低下
- 擴展瓶頸:數據關係複雜,擴展性能差,不便於大規模集羣
根據關係型數據的幾個瓶頸,那麼海量用戶和高併發情況下,爲了防止崩潰的一個解決思路就是:
- 降低磁盤IO次數,越低越好:採用內存存儲
- 去除數據間的關係,越簡單越好:不存關係,只存數據
這樣的一種解決思路,其實就是NoSql。
2 什麼是NoSql
NoSQL(Not Only SQL),字面意思爲不僅僅是SQL,它泛指非關係型數據庫,作爲關係型數據庫的補充。
注意:NoSQL這是關係型數據庫的一種補充,真正的數據還是存放於關係型數據庫中,存放於磁盤中。即NoSQl中的數據來源與關係型數據庫。
NoSql的作用是應對基於海量用戶和海量數據前提下的數據處理問題。有可伸縮、擴容,大數據量下的高性能,靈活的數據模型等特徵。
常見的NoSql數據庫有以下幾種:
- Redis
- memcache
- HBase
- MongoDB
3 以電商場景爲例的海量用戶、高併發的解決方案
在上圖中,熱點信息是來源於前面的四種信息的,從模型中我們可以看出,電商會根據數據的特徵將其存放在不同的地方,然後對外提供服務,圖中很清晰的闡述了一點:NoSQL是關係型數據庫的補充。
上圖可以讓大家瞭解到在編程中到底NoSQl是處於一個什麼樣的位置。
4 Redis的概念
Redis(REmote Dictionary Server)是一個用c語言開發的開源的、高性能的鍵值對(key-value)數據庫。
我再通俗的理解以下,首先它是一個數據庫,數據庫裏面的信息不像我們MySQL那樣有表,表裏面纔是一條一條的數據。
redis裏面存放的直接是一條一條的數據,並且數據的格式都是鍵值對形式的,即age : 15, name :‘zhangsan’這樣的形式。
redis的特徵如下:
由於採用了鍵值對的形式,因此redis數據庫中的數據沒有必然的關聯關係,同時由於redis內部採用單線程機制進行工作,安全性能有了保證。在官方的測試數據中,50個併發執行100000個請求,讀的速度是110000次/s,寫的速度是81000次/s,性能非常優越。
同時redis支持多種數據類型:包括string、list、hash、set、sorted_set等。注意這些類型說的都是value的類型,因爲鍵的類型都是string類型的。
最後redis還支持持久化。
5 redis的應用場景
- 熱點數據的加速查詢(主要場景),如商品推薦、熱點新聞等
- 任務對列,秒殺、搶購等
- 即時信息查詢,排位榜,網站訪問統計等
- 時效性信息,驗證碼控制,投票等
- 分佈式數據共享,如分佈式集羣架構中的session分離、
- 消息對列