近乎所有與Java相關的面試都會問到緩存的問題,基礎一點的會問到redis數據格式、什么是“熱數據和冷數據”,復雜一點的會問到緩存雪崩、緩存穿透、緩存預熱、緩存更新、緩存降級等問題,這些看似不常見的概念,都與我們的緩存服務器相關,一般常用的緩存服務器有Redis、Memcached等,就redis單線程,這篇文章做一個簡單介紹
Redis采用的是基於內存的采用的是單進程單線程模型的 KV 數據庫,由C語言編寫,官方提供的數據是可以達到100000+的QPS(每秒內查詢次數)。這個數據不比采用單進程多線程的同樣基於內存的 KV 數據庫 Memcached 差!
為什么說redis是單線程的,看下面這張圖
Redis基於Reactor模式開發了網絡事件處理器,這個處理器被稱為文件事件處理器。它的組成結構為4部分:多個套接字、IO多路復用程序、文件事件分派器、事件處理器。因為文件事件分派器隊列的消費是單線程的,所以Redis才叫單線程模型。
redis之所以這么快,是因為:
1、他是完全基於內存,絕大部分的請求都是內存操作
2、數據結構比較簡單,對數據的操作也簡單
3、使用多路I/O復用模型,多路I/O復用模型是利用 select、poll、epoll 可以同時監察多個流的 I/O 事件的能力,在空閑的時候,會把當前線程阻塞掉,當有一個或多個流有 I/O 事件時,就從阻塞態中喚醒,於是程序就會輪詢一遍所有的流(epoll 是只輪詢那些真正發出了事件的流),並且只依次順序的處理就緒的流,這種做法就避免了大量的無用操作
但是我們也知道,一般來說 Redis 的瓶頸並不在 CPU,而在內存和網絡。如果要使用 CPU 多核,可以搭建多個 Redis 實例來解決。這點據聽說redis6將實現多線程,對redis速度將是一個質的提高,讓我們期待吧!