1. 程式人生 > 其它 >Redis面試題,最強彙總

Redis面試題,最強彙總

我把所有Java相關的面試題和答案都整理成了PDF,並且帶書籤目錄,閱讀起來非常方便

面試題及答案PDF下載https://www.hicxy.com/?p=2645

面試題及答案PDF下載https://www.hicxy.com/?p=2645

面試題及答案PDF下載https://www.hicxy.com/?p=2645

1. 快取雪崩和快取穿透問題解決方案

1、快取雪崩

  • 簡介:快取同一時間大面積的失效,所以,後面的請求都會落到資料庫上,造成資料庫短時間內承受大量請求而崩掉。
  • 解決辦法
    • 事前:儘量保證整個 redis 叢集的高可用性,發現機器宕機儘快補上。選擇合適的記憶體淘汰策略。
    • 事中:本地ehcache快取 + hystrix限流&降級,避免MySQL崩掉
    • 事後:利用 redis 持久化機制儲存的資料儘快恢復快取
    • 快取雪崩

2、 快取穿透

  • 簡介:一般是黑客故意去請求快取中不存在的資料,導致所有的請求都落到資料庫上,造成資料庫短時間內承受大量請求而崩掉。

  • 解決辦法

    最常見的則是採用布隆過濾器,將所有可能存在的資料雜湊到一個足夠大的bitmap中,一個一定不存在的資料會被 這個bitmap攔截掉,從而避免了對底層儲存系統的查詢壓力。另外也有一個更為簡單粗暴的方法(我們採用的就是這種),如果一個查詢返回的資料為空(不管是數 據不存在,還是系統故障),我們仍然把這個空結果進行快取,但它的過期時間會很短,最長不超過五分鐘。

2. Redis事務的三個階段

  1. 事務開始 MULTI
  2. 命令入隊
  3. 事務執行 EXEC

事務執行過程中,如果服務端收到有EXEC、DISCARD、WATCH、MULTI之外的請求,將會把請求放入佇列中排隊

3. Redis key 的過期時間和永久有效分別怎麼設定?

EXPIRE 和 PERSIST 命令

expire 指令可以設定 key 的超時時間,單位秒。即在多少秒後過期。 返回1代表設定成功;返回 0 代表設定不成功,此時是因為key不存在導致的。

127.0.0.1:6379> expire "key-aaa" 10
(integer) 1
127.0.0.1:6379> expire "key-not-exists" 10
(integer) 0

3 秒後使用 ttl 命令查詢剩餘的超時時間:

127.0.0.1:6379> ttl "key-aaa"
(integer) 7

使用 persist 清除過期時間

127.0.0.1:6379> set "key-aaa" "value-bbb" EX 15
OK
127.0.0.1:6379> ttl "key-aaa"
(integer) 11
127.0.0.1:6379> persist "key-aaa"
(integer) 1
127.0.0.1:6379> ttl "key-aaa"
(integer) -1
127.0.0.1:6379> get "key-aaa"
"value-bbb"

persist 返回值:

1:成功清理過期時間。

0:key 不存在,或者沒有設定過期時間

4. 使用方式

GEOADD key longitude latitude member [longitude latitude member ...]

將給定的位置物件(緯度、經度、名字)新增到指定的key。其中,key為集合名稱,member為該經緯度所對應的物件。在實際運用中,當所需儲存的物件數量過多時,可通過設定多key(如一個省一個key)的方式對物件集合變相做sharding,避免單集合數量過多。

成功插入後的返回值:

(integer) N

其中N為成功插入的個數。

5. Redis 叢集方案應該怎麼做?都有哪些方案?

1、codis

2、目前用的最多的叢集方案,基本和 twemproxy 一致的效果,但它支援在節點數量改變情況下,舊節點資料可恢復到新 hash 節點。

redis cluster3.0 自帶的叢集,特點在於他的分散式演算法不是一致性 hash,而是 hash 槽的概念,以及自身支援節點設定從節點。具體看官方文件介紹。

3、在業務程式碼層實現,起幾個毫無關聯的 redis 例項,在程式碼層,對 key 進行 hash 計算,然後去對應的redis 例項操作資料。這種方式對 hash 層程式碼要求比較高,考慮部分包括,節點失效後的替代演算法方案,資料震盪後的自動指令碼恢復,例項的監控等等。

後面的問題,大家可以先自己獨立思考一下。

另外我把所有Java相關的面試題和答案都整理出來了,給大家參考一下

面試題及答案PDF下載https://www.hicxy.com/?p=2645

面試題及答案PDF下載https://www.hicxy.com/?p=2645

面試題及答案PDF下載https://www.hicxy.com/?p=2645

6. 使用redis有哪些好處?

7. Redis 有哪些適合的場景?

8. 使用 redis 如何設計分散式鎖?說一下實現思路?使用 zk 可以嗎?如何實現?這兩種有什麼區別?

9. Redis 如何實現延時佇列

10. 快取與資料庫不一致怎麼辦

11. 什麼是快取穿透?如何避免?什麼是快取雪崩?何如避免?

12. 事務管理(ACID)概述

13. 修改配置不重啟Redis會實時生效嗎?

14. Redis事務的概念

15. Redis 叢集會有寫操作丟失嗎?為什麼?

16. Redis有哪些優缺點

17. 如何保證快取與資料庫雙寫時的資料一致性?

18. 對於大量的請求怎麼樣處理

19. Redis 的資料淘汰策略有哪些

20. Redis 的持久化機制是什麼?各自的優缺點?

21. redis 常見資料結構以及使用場景分析

22. Redis 到底是怎麼實現“附近的人”

23. 講解下Redis執行緒模型

24. 知道 redis 的持久化嗎?底層如何實現的?有什麼優點缺點?

25. 為什麼要做Redis分割槽?

26. 什麼是Redis持久化?

27. Reids的特點

28. Redis持久化資料和快取怎麼做擴容?

29. 為什麼要用 redis/為什麼要用快取

30. 為什麼Redis的操作是原子性的,怎麼保證原子性的?

31. 一個字串型別的值能儲存最大容量是多少?

32. Redis 與 memcached 相比有哪些優勢?

33. 請用Redis和任意語言實現一段惡意登入保護的程式碼,限制1小時內每使用者Id最多隻能登入5次。具體登入函式或功能用空函式即可,不用詳細寫出。

34. Redis常用管理命令

35. Redis 官方為什麼不提供 Windows 版本?

36. 如何選擇合適的持久化方式

37. Redis的記憶體用完了會發生什麼?

38. Redis 回收程序如何工作的?

39. 加鎖機制

40. RDB和AOF的優缺點

41. Redis 為什麼是單執行緒的

42. Redis 叢集如何選擇資料庫?

43. Redis 叢集之間是如何複製的?

44. 都有哪些辦法可以降低Redis的記憶體使用情況呢?

45. Redis 有哪幾種資料淘汰策略?

46. 怎麼理解 Redis 事務?

47. 定時刪除策略

48. 使用 Redis 做過非同步佇列嗎,是如何實現的

49. Redis 如何做記憶體優化?

50. 單執行緒的redis為什麼這麼快

51. 惰性刪除策略

52. 分散式Redis是前期做還是後期規模上來了再做好?為什麼?

53. Redis有哪些適合的場景?

54. 在選擇快取時,什麼時候選擇 redis,什麼時候選擇 memcached?

55. 你知道有哪些Redis分割槽實現方案?

56. MySQL 裡有 2000w 資料,redis 中只存 20w 的資料,如何保證 redis 中的資料都是熱點資料?

57. Redis 持久化機制(怎麼保證 redis 掛掉之後再重啟資料可以進行恢復)

58. Redis為什麼這麼快

59. Redis事務

60. Redis的過期策略以及記憶體淘汰機制

61. Redis 常見效能問題和解決方案?

62. Redis是單執行緒的,如何提高多核CPU的利用率?

63. Reids三種不同刪除策略

64. Redis 中的管道有什麼用?

65. 為什麼 Redis 需要把所有資料放到記憶體中?

66. Redis事務其他實現

67. 定期刪除策略

68. 鎖互斥機制

69. Redis事務保證原子性嗎,支援回滾嗎

70. Redis的資料型別,以及每種資料型別的使用場景

71. watch dog 自動延期機制

72. 使用過 Redis 做非同步佇列麼,你是怎麼用的?有什麼缺點?

73. redis 過期策略都有哪些?LRU 演算法知道嗎?

74. Redis提供了哪幾種持久化方式?

75. Redis的記憶體佔用情況怎麼樣?

76. Redis 內部結構

77. 為什麼redis需要把所有資料放到記憶體中?

78. 快取穿透、快取擊穿、快取雪崩解決方案?

79. 如何選擇合適的持久化方式?

80. Redis 主要消耗什麼物理資源?

81. Redis 叢集方案什麼情況下會導致整個叢集不可用?

82. Redis 支援哪幾種資料型別?

83. Redis事務支援隔離性嗎

84. Redis 常見的效能問題和解決方案

85. Redis的過期鍵的刪除策略

86. 一個Redis例項最多能存放多少的keys?List、Set、Sorted Set他們最多能存放多少元素?

87. Redis與其他key-value儲存有什麼不同?

88. Redis分割槽有什麼缺點?

89. Redis如何做記憶體優化?

90. 我們知道通過expire來設定key 的過期時間,那麼對過期的資料怎麼處理呢?

91. 如何解決 Redis 的併發競爭 Key 問題

92. Redis 叢集方案應該怎麼做?都有哪些方案?

93. redis 和 memcached 什麼區別?為什麼高併發下有時單執行緒的 redis 比多執行緒的memcached 效率要高?

94. Redis 叢集最大節點個數是多少?

95. 什麼是 Redis?簡述它的優缺點?

96. Redis key的過期時間和永久有效分別怎麼設定?

97. 說說 Redis 雜湊槽的概念?

98. 生產環境中的 redis 是怎麼部署的?

99. Redis 事務相關的命令有哪幾個?

100. Redis 叢集的主從複製模型是怎樣的?

101. Redis中資料庫預設是多少個db即作用?