3.3日學習打卡
目錄:
- 3.3日學習打卡
- NoSQL
- 為什么要用NoSQL
- 什么是NoSQL?
- NoSQL的四大分類
- 關系型數據庫和非關系型數據及其區別
- NoSQL經典應用
- Redis
- Redis是什么?
- Linux下安裝Redis
- Docker下安裝Redis
- 基本知識
NoSQL
為什么要用NoSQL
單機Mysql的美好年代
在90年代,一個網站的訪問量一般都不大,用單個數據庫完全可以輕松應付。在那個時候,更多的都是靜態網頁,動態交互類型的網站不多。
遇到問題:
隨著用戶數的增長,Tomcat和數據庫之間競爭資源,單機性能不足以支撐業務。
Tomcat與數據庫分開部署
Tomcat和數據庫分別獨占服務器資源,顯著提高兩者各自性能。
新的問題:
隨著用戶數的增長,并發讀寫數據庫成為瓶頸。
引入本地緩存和分布式緩存
通過緩存能把絕大多數請求在讀寫數據庫前攔截掉,大大降低數據庫壓力。其中涉及的技術包括:使用memcached作為本地緩存,使用Redis作為分布式緩存。
注意:
緩存抗住了大部分的訪問請求,隨著用戶數的增長,并發壓力主要落在單機的Tomcat上,響應逐漸變慢。
引入反向代理實現負載均衡
在多臺服務器上分別部署Tomcat,使用反向代理軟件(Nginx)把請求均勻分發到每個Tomcat中。
新的挑戰:
反向代理使應用服務器可支持的并發量大大增加,但并發量的增長也意味著更多請求穿透到數據庫,單機的數據庫最終成為瓶頸。
數據庫讀寫分離
由于數據庫的寫入壓力增加,Memcached只能緩解數據庫的讀取壓力。讀寫集中在一個數據庫上讓數據庫不堪重負,大部分網站開始使用主從復制技術來達到讀寫分離,以提高讀寫性能和讀庫的可擴展性。Mysql的master-slave模式成為這個時候的網站標配了
新的挑戰:
業務逐漸變多,不同業務之間的訪問量差距較大,不同業務直接競爭數據庫,相互影響性能。
數據庫按業務分庫
把不同業務的數據保存到不同的數據庫中,使業務之間的資源競爭降低,對于訪問量大的業務,可以部署更多的服務器來支撐。
為什么用NoSQL
用戶的個人信息,社交網絡,地理位置,用戶生成的數據和用戶操作日志已經成倍的增加。我們如果要對這些用戶數據進行挖掘,那SQL數據庫已經不適合這些應用了, NoSQL數據庫的發展也卻能很好的處理這些大的數據。
什么是NoSQL?
NoSQL(NoSQL = Not Only SQL),意即“不僅僅是SQL”,泛指非關系型的數據庫。隨著互聯網web2.0網站的興起,傳統的關系數據庫在應付特別是超大規模和高并發類型純動態網站已經顯得力不從心,暴露了很多難以克服的問題。
結構化數據和非結構化數據
- 結構化數據指的是由二維表結構來邏輯表達和實現的數據,嚴格遵循數據格式與長度規范,也稱作為行數據。
- 非結構化數據,指的是數據結構不規則或不完整,沒有任何預定義的數據模型,不方便用二維邏輯表來表現的數據,例如辦公文檔(Word)、文本、圖片、HTML、各類報表、視頻音頻等。
NoSQL的四大分類
KV型NoSql(代表----Redis)
KV型NoSql顧名思義就是以鍵值對形式存儲的非關系型數據庫,是最簡單、最容易理解也是大家最熟悉的一種NoSql,因此比較快地帶過。
特點:
- 數據基于內存,讀寫效率高
- KV型數據,時間復雜度為O(1),查詢速度快
注意:
KV型NoSql最大的優點就是高性能,利用Redis自帶的BenchMark做基準測試,TPS可達到10萬的級別,性能非常強勁。
列式NoSql(代表----HBase)
列式NoSql,大數據時代最具代表性的技術之一了,以HBase為代表。
關系行數據庫數據
注意:
看到每行有name、phone、address三個字段,這是行式存儲的方式,且可以觀察id = 2的這條數據,即使phone字段沒有,它也是占空間的。
列式數據庫數據
注意:
查詢時只有指定的列會被讀取,不會讀取所有列
列數據被組織到一起,一次磁盤IO可以將一列數據一次性讀取到內存中
文檔型NoSql(代表----MongoDB)
什么是文檔型NoSql呢,文檔型NoSql指的是將半結構化數據存儲為文檔的一種NoSql,文檔型NoSql通常以JSON或者XML格式存儲數據。
注意:
關系型數據庫是按部就班地每個字段一列存,在MongDB里面就是一個JSON字符串存儲。
搜索型NoSql(代表----ElasticSearch)
傳統關系型數據庫主要通過索引來達到快速查詢的目的,但是在全文搜索的場景下,索引是無能為力的,like查詢一來無法滿足所有模糊匹配需求,二來使用限制太大且使用不當容易造成慢查詢,搜索型NoSql的誕生正是為了解決關系型數據庫全文搜索能力較弱的問題,ElasticSearch是搜索型NoSql的代表產品。
關系型數據庫和非關系型數據及其區別
關系型數據庫
關系型數據庫最典型的數據結構是表,由二維表及其之間的聯系所組成的一個數據組織
優點:
- 易于維護:都是使用表結構,格式一致;
- 使用方便:SQL語言通用,可用于復雜查詢;
- 復雜操作:支持SQL,可用于一個表以及多個表之間非常復雜的查詢。
缺點:
- 讀寫性能比較差,尤其是海量數據的高效率讀寫;
- 固定的表結構,靈活度稍欠;
非關系型數據庫
優點:
- 格式靈活:存儲數據的格式可以是key,value形式、文檔形式、圖片形式等等,文檔形式、圖片形式等等,使用靈活,應用場景廣泛,而關系型數據庫則只支持基礎類型。
- 速度快:nosql可以使用硬盤或者隨機存儲器作為載體,而關系型數據庫只能使用硬盤;
- 高擴展性;
- 成本低:nosql數據庫部署簡單,基本都是開源軟件。
缺點:
-
不提供sql支持,學習和使用成本較高;
-
無事務處理;
-
數據結構相對復雜,復雜查詢方面稍欠。
NoSQL經典應用
當下應用是SQL和NoSQL一起使用
淘寶商品信息如何存放
商品基本信息
名稱、價格、出廠信息、生產廠商,商家信息等, 關系型數據庫就可以解決。
注意:
注意,淘寶內部用的Mysql是里面的大牛自己改造過的。
商品描述、詳情、評論
多文件信息描述類,IO讀寫性能變差不能使用Mysql數據庫,使用MongDB。
商品的圖片
分布式文件系統:
- 淘寶自己的TFS
- Google的GFS
- Hadoop的HDFS
- 阿里云的OSS
商品熱門的波段信息
內存數據庫 Redis Tair Memache
遇到的問題:
數據類型太多
數據源繁多
數據要改造
Redis
Redis是什么?
Redis是一個使用ANSI C編寫的開源、包含多種數據結構、支持網絡、基于內存、可選持久性的鍵值對存儲數據庫。
特性:
- 基于內存運行,性能高效
- 支持分布式,理論上可以無限擴展
- key-value存儲系統
- 開源的使用ANSI C語言編寫、遵守BSD協議、支持網絡、可基于內存亦可持久化* 的日志型、Key-Value數據庫,并提供多種語言的API
誰在用Redis
-
Github
-
京東
-
微博
-
阿里巴巴
-
百度
-
美團
-
搜狐
Linux下安裝Redis
官網地址
Redis官方網址:https://redis.io/
下載Redis
可以直接使用我提供的 Redis
redis-6.2.4.tar.gz上傳至CentOS并解壓,解壓后得到redis-6.2.4目錄
解壓命令:
tar -zxvf redis-6.2.4.tar.gz
安裝GCC
安裝C語言編譯環境
yum install -y gcc
通過使用gcc --version
命令打印 GCC 版本,來驗證 GCC 編譯器是否被成功安裝:
gcc --version
安裝Redis
編譯Redis
在redis-6.2.4目錄下執行:
make
安裝Redis
在redis-6.2.4目錄下執行:
make install
安裝目錄: /usr/local/bin
注意:
redis-benchmark:Redis自帶的基準性能測試工具
redis-check-aof:對有問題的 AOF 文件進行修復,AOF和RDB文件后面會說明
redis-check-rdb:對有問題的 RDB文件進行修復
redis-sentinel:Redis集群使用
redis-cli:客戶端
redis-server:服務器啟動
服務啟動
前臺啟動:/usr/local/bin下執行
./redis-server
后臺啟動
修改redis.conf文件
daemonize yes #由no改為yes
啟動服務
./redis-server ../redis.conf
客戶端啟動
/usr/local/bin下執行
./redis-cli
ping命令可以檢測服務器是否正常(服務器返回PONG)
127.0.0.1:6379> ping
PONG
Docker下安裝Redis
下載最新Redis鏡像
docker pull redis
注意:
可以用docker pull redis命令下載最新版本的Redis鏡像,也可 以用“docker pull redis:標簽”命令下載指定版本的Redis。
啟動Redis容器
docker run -itd --name myFirstRedis -p 6379:6379
redis:latest
觀察Redis啟動效果
docker logs myFirstRedis
注意:
如果直接在Linux等環境上啟動Redis服務器,就能直接看到啟動后的效果。
查看Redis的版本
先確保myFirstRedis容器處于Up狀態。進入容器的命令行交互窗口。
docker exec -it myFirstRedis /bin/bash
redis-server --version
Redis服務器和客戶端
Redis是基于鍵值對存儲的NoSQL數據庫,其中的數據是存儲在 Redis服務器里的。和傳統的MySQL數據庫服務器相似,一個Redis服務器可以同多個客戶端創建連接。
docker exec -it myFirstRedis /bin/bash
redis-cli
基本知識
默認16數據庫
Redis是一個字典結構的存儲服務器,一個Redis實例提供了多個用來存儲數據的字典,客戶端可以指定將數據存儲在哪個字典中。
這與在一個關系數據庫實例中可以創建多個數據庫類似(如下圖所示),所以可以將其中的每個字典都理解成一個獨立的數據庫。
Redis默認支持16個數據庫,可以通過調整Redis的配置文件redis/redis.conf中的databases來修改這一個值,設置完畢后重啟Redis便完成配置。
Redis 使用的到底是多線程還是單線程?
因為Redis是基于內存的操作,CPU不是Redis的瓶頸,Redis的瓶頸最有可能是機器內存的大小或者網絡帶寬。既然單線程容易實現,而且CPU不會成為瓶頸,那就順理成章地采用單線程的方案了。
IO多路復用技術
redis 采用網絡IO多路復用技術來保證在多連接的時候, 系統的高吞吐量。
大白話解釋
假設你是一個機場的空管, 你需要管理到你機場的所有的航線, 包括進港,出港, 有些航班需要放到停機坪等待,有些航班需要去登機口接乘客。
最簡單的做法,就是你去招一大批空管員,然后每人盯一架飛機, 從進港,接客,排位,出港,航線監控,直至交接給下一個空港,全程監控。
遇到的問題:
很快你就發現空管塔里面聚集起來一大票的空管員,交通稍微繁忙一點,新的空管員就已經擠不進來了。
空管員之間需要協調,屋子里面就1, 2個人的時候還好,幾十號人以后 ,基本上就成菜市場了。
空管員經常需要更新一些公用的東西,比如起飛顯示屏,比如下一個小時后的出港排期,最后你會很驚奇的發現,每個人的時間最后都花在了搶這些資源上。
怎么解決
這個東西叫flight progress strip. 每一個塊代表一個航班,不同的槽代表不同的狀態,然后一個空管員可以管理一組這樣的塊(一組航班),而他的工作,就是在航班信息有新的更新的時候,把對應的塊放到不同的槽子里面。
結論
這里“多路”指的是多個網絡連接,“復用”指的是復用同一個線程。采用多路 I/O 復用技術可以讓單個線程高效的處理多個連接請求(盡量減少網絡IO的時間消耗),且Redis在內存中操作數據的速度非常快(內存內的操作不會成為這里的性能瓶頸),主要以上兩點造就了Redis具有很高的吞吐量。
切換數據庫
語法結構:
select number
示例:
# 默認使用 0 號數據庫
redis 127.0.0.1:6379> SET db_number 0
OK
# 使用 1 號數據庫
redis 127.0.0.1:6379> SELECT 1
OK
清空當前庫
Redis Flushdb 命令用于清空當前數據庫中的所有 key。
語法結構:
127.0.0.1:6379> FLUSHDB
示例:
127.0.0.1:6379> FLUSHDB
通殺全部庫
Redis Flushall 命令用于清空整個 Redis 服務器的數據(刪除所有數據庫的所有 key )。
語法結構:
redis 127.0.0.1:6379> FLUSHALL
示例:
# 清空所有數據庫的所有 key
redis 127.0.0.1:6379>flushall
OK
如果我的內容對你有幫助,請點贊,評論,收藏。創作不易,大家的支持就是我堅持下去的動力