redis豐富的數據結構,其hash,list,set以及功能豐富的String的支持,對于實際項目中的使用有很大的幫忙。同時.redis單點的性能也非常高效,所以很多的項目都會選擇redis來做為緩存應用。
1.redis緩存原理
Redis將其數據完全保存在內存中,僅使用磁盤進行持久化。與其它鍵值數據存儲相比,Redis有一組相對豐富的數據類型。Redis可以將數據復制到任意數量的從機中。異常快 - Redis非常快,每秒可執行大約110000次的設置(SET)操作,每秒大約可執行81000次的讀取/獲取(GET)操作。支持豐富的數據類型 - Redis支持開發人員常用的大多數數據類型 ,例如列表,集合,排序集和散列等等。這使得Redis很容易被用來解決各種問題,因為我們知道哪些問題可以更好使用地哪些數據類型來處理解決。操作具有原子性 - 所有Redis操作都是原子操作,這確保如果兩個客戶端并發訪問,Redis服務器能接收更新的值。Redis是一個內存數據庫,但在磁盤數據庫上是持久的,因此它代表了一個不同的權衡,在這種情況下,在不能大于存儲器(內存)的數據集的限制下實現非常高的寫和讀速度redis支持多種數據結構,Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲Redis支持master-slave(主-從)模式應用;Redis單個value的限制是1GB,memcached只能保存1MB的數據。
2.redis緩存實現
redis提供了三種緩存數據淘汰機制,LFU,LRU,TTL。LFU,least frequently used,即小使用頻率淘汰,每個對象使用共計24bit空間用來實施這個算法,24bit分成2個部分,前16bit用來記錄上次減少時間(減少的是后面8bit計數器),后面8個bit是一個對數計數器,用來記錄這個對象的訪問次數。需要注意的是,這個字段不是一直增加的,也需要減少,否則會出現一個情況,一個對象很久之前被頻繁的使用,但是沒有被使用,若這個值不減少的話,那么這個對象會一直處在一個不會被淘汰的位置。前面16bit的作用就是,記錄一個“減量時間”,這是一個降低精度的Unix時間,將16bit的時間轉換成分鐘,不關心回繞問題。若這個時間很大,那么8bit計數器的值減半,否則只是簡單的每次遞減1;LRU,last recently used,即少使用淘汰,一般做法是,將hash表的value做成一個指針,指向一個雙鏈表節點,節點中保存實際的value,雙鏈表按照上次訪問時間降序排列,當訪問到一個對象之后,更新訪問時間,并將這個節點移動到表頭,若節點不存在就直接插入到表頭。當內存門限達到的時候,從鏈表尾開始刪除若干entry。redis為了減少內存使用,不使用雙鏈表或其他結構管理對象,采用隨機算法,每次從hash表中隨機選擇一些key,一般是5個,將這些key存入一個全局的池,池大小一般是16,池中entry按照上次訪問時間降序排列,每次從池中選擇尾部的entry,就是較差的對象,將這個對象淘汰;TTL,即生存時間,按照生存時間設置一個對象的生命周期,一個對象生命周期結束之后將其銷毀。
以上就是對于redis緩存的介紹,我們要想學會使用redis緩存還是需要大量的實戰項目練習,經過不斷的積累才能更加熟練。