Redis是一個key-value存儲系統,它支持存儲的value類型包括string字符串、list鏈表、set集合、sorted Set有序集合和hash哈希等數據類型。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操做,並且這些操做都是原子性的,支持各類不一樣方式的排序。爲了保證效率,Redis將數據都緩存在內存中,並週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,在此基礎上實現master-slave(主從)同步。css
Redis的應用場景 數據類型應用場景StringString是最經常使用的一種數據類型,普通的key/value存儲均可以歸爲此類。List關注列表、粉絲列表、消息隊列等。SetSet提供一個與 List相似的列表功能,特殊之處在於Set會自動排序、去重,當須要存儲一個列表數據,又不但願有重複數據時,Set是一個很好的選擇,而且set提供了判斷某個成員是否在一個set集合內的重要接口,這個也是list所不能提供的。mysql
1.使用Set存儲一些集合性的數據,好比在微博應用中,能夠將一個用戶全部的關注人存在一個集合中,將其全部粉絲存在一個集合;redis
2.能夠對集合取交集、並集、差集,應用到好友推薦、共同關注等。sql
3.還能夠利用惟一性,統計訪問網站的全部獨立IP。數組
SortedSetSortedSet與Set的使用場景相似,是不容許重複項的String集合。緩存
1.SortedSet能夠經過提供一個優先級(score)的參數爲成員排序,而且是插入有序的,即自動排序,能夠應用於積分排行榜等。安全
2.若是須要一個有序且不重複的集合列表,能夠選擇sorted set數據結構,好比twitter 的public timeline能夠以發表時間做爲score來存儲,這樣獲取時就是自動按時間排好序的。性能優化
3.用SortedSet作帶權重的隊列,好比普通消息的score爲1,重要消息的score爲2,而後工做線程能夠選擇按score的倒序來獲取工做任務,讓重要的任務優先執行。網絡
Hash 存儲一個學生信息對象數據,字段包括:id、姓名、班級、年齡等,經過id能夠獲取/修改任意的字段。數據結構
這裏要先提一下內存和緩存的區別:
內存是物理上的,是一種物理存儲介質。
緩存是邏輯上的概念,是一種數據結構,能夠是PHP語言裏面的一種數據結構,也能夠是Redis裏面的一種數據結構。好比:用PHP數組存一些數據,每次有需求就直接從數組中讀取;用PHP語言設計了一個緩存,用一個數組作隊列,設計了一個基於先進先出策略的緩存;調用Redis的一些數據結構來存儲數據。
內存叫作RAM,隨機可讀存儲器,硬盤通常叫作ROM,隨機只讀存儲器。
緩存包括cpu的一二級緩存、純內存結構的緩存、半內存緩存、磁盤緩存,它們的速度是一層比一層慢。當CPU要讀取一個數據時,首先從一級緩存中查找,若是沒有找到再從二級緩存中查找,若是仍是沒有就從三級緩存或內存中查找,程序裏面的各類數據結構、變量等等,都是運行在內存裏面,而不是在硬盤上。
假設有一個場景,好比歷史用戶日誌訪問數據,就是access_log,讓你去統計都有哪些用戶登陸了這個網站,固然如今還有用戶在持續登陸着。這個時候你是否是要先去從access_log裏面讀取日誌,而後提取出日誌裏面的userId,存到數組裏面再去重。當新用戶來的時候,你只須要和你數組裏面的用戶進行比較便可,就不須要再讀取access_log文件了。這樣就不用每次讀取文件,只須要讀取數組便可,速度回更快。 同理用Redis,也是由於當咱們須要讀取數據時,先從Redis查找,若是有就直接返回,不用再從mysql查找,速度會很快。
從原理上講,PHP裏面的數據結構用的是純內存,而Redis是須要走網絡的;
從速度上講,純內存的速度確定是比先走網絡、再從內存中讀取的速度快。
雖然Redis做爲半內存緩存,沒有直接內存結構的數據結構速度快,但Redis除了數據結構豐富外,還適合高併發場景,對高併發處理效率極高,此外能夠作到集羣式、可持久化。
Redis支持String、List、Set、Sorted Set、Hash等。