1. 程式人生 > 資料庫 >redis原理(一)

redis原理(一)

1.資料是儲存在檔案中的

2.linux讀取方式: grep、awk

3.程式讀取方式:java

4.常識

常識:
磁碟:
1,定址:ms
2,頻寬:G/M

記憶體:
1,定址:ns
2,頻寬:很大
秒>毫秒>微秒>納秒  磁碟比記憶體在定址上慢了10W倍

I/O buffer:成本問題
磁碟與磁軌,扇區,一扇區 512Byte帶來一個成本變大:索引
4K  作業系統,無論你讀多少,都是最少4k從磁碟拿

所以一次I/O 就是4K

5.所以隨著檔案變大,速度變慢,因為硬碟I/O成為瓶頸

6.所以資料庫出現了

7.所以當資料庫資料很大時,不建立索引也會很慢

8.關係型資料庫

關係型資料庫建表:必須給出schema
型別:位元組寬度
存:傾向於行級儲存

資料庫:表很大,效能下降?
如果表有索引
增刪改變慢
查詢速度呢?
1,1個或少量查詢依然很快
2,併發大的時候會受硬碟頻寬影響速度

9.開始使用關係型記憶體資料庫,例如HANA,報價賊貴,2T,2個億(資料在記憶體和磁碟的體積不一樣,記憶體小,因為不維護索引和B+T)

10.折中,取快取 memached、redis

2個基礎設施
1,馮諾依曼體系的硬體
2,乙太網,tcp/ip的網路

比如網路不穩定 會造成資料丟失,資料不一致 等一系列問題

11.為什麼不用redis memcached 也是key,value,因為value沒有型別的概念。

12.memcached 可以使用json呀。

clinet需要從 快取k,v型 取回v中的某一個元素
1.memcache
返回value所有的資料到clientserver  
網絡卡IO 
client要有你實現的程式碼去節碼

2.型別不是很重要
redis的server中對每種型別都有自己的方法
index()
lpop

 

 

問題:redis是單程序,單執行緒,單例項,併發很多的請求,如何變得很快的呢?

  •  因為linux核心(kernel)使用了epoll, 在redis啟動的程序中可以看到

 

 

 

核心五圖解析

一、執行緒/程序輪詢,socket在這個時期是阻塞的所以是BIO,有阻塞問題,執行緒多了排程成本CPU浪費、記憶體成本大
二、單執行緒處理,輪詢發生在使用者空間,同步非阻塞 NIO,有使用者程序輪詢問題
三、單執行緒處理,select批量處理,輪詢發生在核心,多路複用NIO,有fd資料拷貝來拷貝去問題
四、單執行緒處理,select更換epoll,多路複用NIO,有共享空間。

五、零拷貝:是不同系統之間的呼叫,用的是sendfile(out, in)方法,看kafka圖,檔案存在kafaka,其他的呼叫全部走方法用的是sendfile。

man 2 read
man 2 select 
man epoll
man 2 sendfile

網絡卡到核心是一個sockert I/O
檔案file到核心是一個檔案I/O

man 有8類文件
1類是man ls 可以看幫助文件
2類是系統呼叫