redis原理(一)
阿新 • • 發佈:2021-01-17
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類是系統呼叫