179. Redis 是什么?都有哪些使用場景?
Redis 是一個使用 C 語言開發的高速緩存數據庫。
Redis 使用場景:
- 記錄帖子點贊數、點擊數、評論數;
- 緩存近期熱帖;
- 緩存文章詳情信息;
- 記錄用戶會話信息。
- 數據緩存功能
- 分布式鎖的功能
- 支持數據持久化
- 支持事務
- 支持消息隊列
- 存儲方式不同:memcache 把數據全部存在內存之中,斷電后會掛掉,數據不能超過內存大小;Redis 有部份存在硬盤上,這樣能保證數據的持久性。
- 數據支持類型:memcache 對數據類型支持相對簡單;Redis 有復雜的數據類型。
- 使用底層模型不同:它們之間底層實現方式,以及與客戶端之間通信的應用協議不一樣,Redis 自己構建了 vm 機制,因為一般的系統調用系統函數的話,會浪費一定的時間去移動和請求。
- value 值大小不同:Redis 最大可以達到 512mb;memcache 只有 1mb。
180. Redis 有哪些功能?
181. Redis 和 memcache 有什么區別?
182. Redis 為什么是單線程的?
因為 cpu 不是 Redis 的瓶頸,Redis 的瓶頸最有可能是機器內存或者網絡帶寬。既然單線程容易實現,而且 cpu 又不會成為瓶頸,那就順理成章地采用單線程的方案了。
關於 Redis 的性能,官方網站也有,普通筆記本輕松處理每秒幾十萬的請求。
而且單線程並不代表就慢 nginx 和 nodejs 也都是高性能單線程的代表。
183. 什么是緩存穿透?怎么解決?
緩存穿透:指查詢一個一定不存在的數據,由於緩存是不命中時需要從數據庫查詢,查不到數據則不寫入緩存,這將導致這個不存在的數據每次請求都要到數據庫去查詢,造成緩存穿透。
解決方案:最簡單粗暴的方法如果一個查詢返回的數據為空(不管是數據不存在,還是系統故障),我們就把這個空結果進行緩存,但它的過期時間會很短,最長不超過五分鍾。
184. Redis 支持的數據類型有哪些?
Redis 支持的數據類型:string(字符串)、list(列表)、hash(字典)、set(集合)、zset(有序集合)。
185. Redis 支持的 Java 客戶端都有哪些?
支持的 Java 客戶端有 Redisson、jedis、lettuce 等。
186. jedis 和 Redisson 有哪些區別?
- jedis:提供了比較全面的 Redis 命令的支持。
- Redisson:實現了分布式和可擴展的 Java 數據結構,與 jedis 相比 Redisson 的功能相對簡單,不支持排序、事務、管道、分區等 Redis 特性。
- 合理設置緩存的過期時間。
- 新增、更改、刪除數據庫操作時同步更新 Redis,可以使用事物機制來保證數據的一致性。
187. 怎么保證緩存和數據庫數據的一致性?
188. Redis 持久化有幾種方式?
Redis 的持久化有兩種方式,或者說有兩種策略:
- RDB(Redis Database):指定的時間間隔能對你的數據進行快照存儲。
- AOF(Append Only File):每一個收到的寫命令都通過write函數追加到文件中。
189. Redis 怎么實現分布式鎖?
Redis 分布式鎖其實就是在系統里面占一個“坑”,其他程序也要占“坑”的時候,占用成功了就可以繼續執行,失敗了就只能放棄或稍后重試。
占坑一般使用 setnx(set if not exists)指令,只允許被一個程序占有,使用完調用 del 釋放鎖。
190. Redis 分布式鎖有什么缺陷?
Redis 分布式鎖不能解決超時的問題,分布式鎖有一個超時時間,程序的執行如果超出了鎖的超時時間就會出現問題。
191. Redis 如何做內存優化?
盡量使用 Redis 的散列表,把相關的信息放到散列表里面存儲,而不是把每個字段單獨存儲,這樣可以有效的減少內存使用。比如將 Web 系統的用戶對象,應該放到散列表里面再整體存儲到 Redis,而不是把用戶的姓名、年齡、密碼、郵箱等字段分別設置 key 進行存儲。
192. 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(驅逐):禁止驅逐數據。
193. Redis 常見的性能問題有哪些?該如何解決?
- 主服務器寫內存快照,會阻塞主線程的工作,當快照比較大時對性能影響是非常大的,會間斷性暫停服務,所以主服務器最好不要寫內存快照。
- Redis 主從復制的性能問題,為了主從復制的速度和連接的穩定性,主從庫最好在同一個局域網內。