1. Redis 是什麼?都有哪些使用場景?node
咱們先來理解經典的CAP理論:nginx
一致性:是指從數據層面來看的一致性。程序員
可用性:是指從系統層面的可用性。web
容錯性:是指從網絡層面的的容錯性。redis
數據庫逐漸從關係數據庫向不一樣領域不一樣層次分化。隨着讀多寫少場景的出現,致使須要讀取數據的時間變慢,爲了提高性能,出現了數據庫緩存技術,對數據庫的讀取進行分離。web2.0時代,網民的生產力大增,存儲總量也在增長,目前仍是讀多寫少模式,原有的緩存技術顯然不能知足寫的壓力,因此,出現了分庫分表,實現讀寫分離。其中比較經常使用的一種緩存技術是用Redis作緩存。數據庫
Redis是什麼?緩存
Redis是一個基於內存且支持持久化的key-value的NoSQL數據庫,其中每一個key和value都是使用對象表示的,具備以如下特徵:多樣數據類型、持久化、主從同步。服務器
和Memcached相似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)和zset(有序集合)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操做,並且這些操做都是原子性的。微信
在此基礎上,redis支持各類不一樣方式的排序。與memcached同樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的使用RDB快照的方式,把更新的數據寫入磁盤或者使用相似MySQL的AOF日誌方式把修改操做寫入追加的記錄文件,而且在此基礎上實現了master-slave(主從)同步。Redis支持將數據同步到多臺從數據庫上,這種特性對提升讀取性能很是有益。網絡
Redis3.0版本容許單點故障,它沒有中心節點,各個節點地位同樣,擴展性很好,節點間的採用二進制通訊,節點與客戶端採用ascII協議通訊。
綜上所述,Redis可用於緩存、數據庫、消息中間件。
Redis 使用場景:
記錄帖子點贊數、點擊數、評論數;
緩存近期熱帖;
緩存文章詳情信息;
記錄用戶會話信息。
2. Redis 有哪些功能?
數據緩存功能
分佈式鎖的功能
支持數據持久化
支持事務
支持消息隊列
3. Redis 和 memcache 有什麼區別?
存儲方式不一樣:memcache 把數據所有存在內存之中,斷電後會掛掉,數據不能超過內存大小;Redis 有部份存在硬盤上,這樣能保證數據的持久性。
數據支持類型:memcache 對數據類型支持相對簡單;Redis 有複雜的數據類型。
使用底層模型不一樣:它們之間底層實現方式,以及與客戶端之間通訊的應用協議不同,Redis 本身構建了 vm 機制,由於通常的系統調用系統函數的話,會浪費必定的時間去移動和請求。
value 值大小不一樣:Redis 最大能夠達到 1gb;memcache 只有 1mb。
4. Redis 爲何是單線程的?
由於 cpu 不是 Redis 的瓶頸,Redis 的瓶頸最有多是機器內存或者網絡帶寬。既然單線程容易實現,並且 cpu 又不會成爲瓶頸,那就瓜熟蒂落地採用單線程的方案了。
關於 Redis 的性能,官方網站也有,普通筆記本輕鬆處理每秒幾十萬的請求。
並且單線程並不表明就慢 nginx 和 nodejs 也都是高性能單線程的表明。
5. 什麼是緩存穿透?怎麼解決?
緩存穿透:指查詢一個必定不存在的數據,因爲緩存是不命中時須要從數據庫查詢,查不到數據則不寫入緩存,這將致使這個不存在的數據每次請求都要到數據庫去查詢,形成緩存穿透。
解決方案:最簡單粗暴的方法若是一個查詢返回的數據爲空(不論是數據不存在,仍是系統故障),咱們就把這個空結果進行緩存,但它的過時時間會很短,最長不超過五分鐘。
6. Redis 支持的數據類型有哪些?
Redis 支持的數據類型:string(字符串)、list(列表)、hash(字典)、set(集合)、zset(有序集合)。
7. Redis 支持的 Java 客戶端都有哪些?
支持的 Java 客戶端有 Redisson、jedis、lettuce 等。
8. jedis 和 Redisson 有哪些區別?
jedis:提供了比較全面的 Redis 命令的支持。
Redisson:實現了分佈式和可擴展的 Java 數據結構,與 jedis 相比 Redisson 的功能相對簡單,不支持排序、事務、管道、分區等 Redis 特性。
9. 怎麼保證緩存和數據庫數據的一致性?
合理設置緩存的過時時間。
新增、更改、刪除數據庫操做時同步更新 Redis,可使用事物機制來保證數據的一致性。
10. Redis 持久化有幾種方式?
Redis 的持久化有兩種方式,或者說有兩種策略:
RDB(Redis Database):指定的時間間隔能對你的數據進行快照存儲。
AOF(Append Only File):每個收到的寫命令都經過write函數追加到文件中。
11. Redis 怎麼實現分佈式鎖?
Redis 分佈式鎖其實就是在系統裏面佔一個「坑」,其餘程序也要佔「坑」的時候,佔用成功了就能夠繼續執行,失敗了就只能放棄或稍後重試。
佔坑通常使用 setnx(set if not exists)指令,只容許被一個程序佔有,使用完調用 del 釋放鎖。
12. Redis 分佈式鎖有什麼缺陷?
Redis 分佈式鎖不能解決超時的問題,分佈式鎖有一個超時時間,程序的執行若是超出了鎖的超時時間就會出現問題。
13. Redis 如何作內存優化?
儘可能使用 Redis 的散列表,把相關的信息放到散列表裏面存儲,而不是把每一個字段單獨存儲,這樣能夠有效的減小內存使用。好比將 Web 系統的用戶對象,應該放到散列表裏面再總體存儲到 Redis,而不是把用戶的姓名、年齡、密碼、郵箱等字段分別設置 key 進行存儲。
14. Redis 淘汰策略有哪些?
volatile-lru:從已設置過時時間的數據集(server. db[i]. expires)中挑選最近最少使用的數據淘汰。
volatile-ttl:從已設置過時時間的數據集(server. db[i]. expires)中挑選將要過時的數據淘汰。
volatile-random:從已設置過時時間的數據集(server. db[i]. expires)中任意選擇數據淘汰。
allkeys-lru:從數據集(server. db[i]. dict)中挑選最近最少使用的數據淘汰。
allkeys-random:從數據集(server. db[i]. dict)中任意選擇數據淘汰。
no-enviction(驅逐):禁止驅逐數據。
15. Redis 常見的性能問題有哪些?該如何解決?
主服務器寫內存快照,會阻塞主線程的工做,當快照比較大時對性能影響是很是大的,會間斷性暫停服務,因此主服務器最好不要寫內存快照。
Redis 主從複製的性能問題,爲了主從複製的速度和鏈接的穩定性,主從庫最好在同一個局域網內。
若是您感受文章對您有所幫助,請讓更多人看到!
1.點贊此篇文章,並評論一句!
2.轉發此篇文章 給予做者支持!
3.微信搜索 ~ 關注微信公衆號:程序員知識碼頭 獲取全套學習資料一份!
微信掃碼關注:天天準時發技術文章!還能加入專屬的學習交流社羣!
點贊!好文要頂哦~