Redis高級項目實戰,阿里P7級別面試經驗總結

第一次壓測

慘不忍睹,平均響應時間150ms,而且在這次壓測過程中還發現其它的問題,后臺報錯,經查是OpenSearch每秒查詢次數限制

優化代碼與配置

1、修改OpenSearch配置,并且將壓測環境中的OpenSearch連接地址改為內網地址。2、將代碼中循環查詢緩存的地方改為一次性批量查詢返回。3、和相關同學確認后去掉項目中無用的代碼。

第二次壓測

雖然優化了代碼,修改了配置,但是情況更糟糕了,而且還改出了新的問題。當時,反復檢查了代碼,確定查詢緩存的次數已經是最少了,而且連接線程池相關參數也調到一個相對較大且合理的值了。如果,再壓測還是無法達到要求的話,只有出最后一招了:緩存結果集。即,以用戶ID和用戶搜索的關鍵詞為key,查詢的結果為value,緩存5分鐘。

第三次壓測

總算符合要求了,并發60的時候響應時間達到32ms,而我又發現了新的優化點。

接口中居然還有查數據庫的操作,這可不能忍,排查之后去掉了一些不必要的依賴。

成長

學會了使用RedisTemplate的executePipelined進行redis批量查詢

針對本次優化的總結

1、一定要絕對避免循環查數據庫和緩存(PS:循環里面就不能有查詢緩存,更不能有查詢數據庫的操作,因為循環的次數沒法控制);

2、對于API接口的話,一般都是直接查緩存的,沒有查數據庫的;

3、多用批量查詢,少用單條查詢,盡量一次查出來;

4、對于使用阿里云,要留意一下相應產品的配置,該花的錢還是得花,同時,千萬要記得正式環境中使用相應產品的內網地址;

5、注意連接池大小(包括數據庫連接池、Redis緩存連接池、線程池);

6、壓測的機器上不要部署其它的服務,只跑待壓測的服務,避免受其它項目影響;對于線上環境,最好一臺機器上只部署一個重要的服務;

7、沒有用的以及被注釋掉的代碼,沒有用的依賴最好及時清理掉;

8、集群自不用說;

9、一些監控類的工具工具可以幫助我們更好的定位問題,比如鏈路跟蹤,這次項目中使用了PinPoint;

10、如果技術上優化的空間已經非常小了,可以試著從業務上著手,用實際的數據說話,可以從日常的訪問量,歷史訪問量數據來說服測試;

11、每一次代碼改動都有可能引入新的問題,因此,每次修改代碼后都要回歸測試一下(PS:每次修改完以后,我都會用幾組不同的關鍵詞搜索,然后比對修改前和修改后返回的數據是否一致,這個時候postman,以及Beyond compare就派上用場了);

12、關鍵的地方一定要多加點兒日志,方便以后排除問題,因為排查線上問題最主要還是靠日志;

最后

碼字不易,覺得有幫助的可以幫忙點個贊,讓更多有需要的人看到

又是一年求職季,在這里,我為各位準備了一套Java程序員精選高頻面試筆試真題,來幫助大家攻下BAT的offer,題目范圍從初級的Java基礎到高級的分布式架構等等一系列的面試題和答案,用于給大家作為參考,需要的可以戳這里免費領取,以下是部分內容截圖
需要的可以戳這里免費領取,以下是部分內容截圖
架構面試專題及架構學習筆記導圖.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385507.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385507.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385507.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Makefile用法鏈接

Makefile的編寫及四個特殊符號的意義、$、$^、$ <font face"字體" size"字號" color"顏色">這里是需要突出顯示的內容</font> <font color#0099ff size12 face"黑體">黑體</font>

Redis高頻面試筆記:java版本號比較算法

1.三重心智模型 先給大家科普一個概念&#xff0c;“三重心智模型”。 認知科學家斯坦諾維奇&#xff0c;將人的心智模式&#xff0c;分成了三個部分。 第一層是自主心智&#xff0c;自主心智是我們通過進化與內隱學習獲得。比如&#xff0c;我們看到蛇就會害怕&#xff0c;情…

Redis高頻面試筆記:mysql8.0新特性

一、服務發布簡介 分布式系統架構下&#xff0c;服務發布是一件很麻煩的事情&#xff0c;特別是在構建自動發布流程和灰度測試的策略兩個核心方面。通常情況下如果不涉及數據層面的灰度流程&#xff0c;服務可以灰度上線&#xff0c;或者滾動上線&#xff0c;這兩種方式很常用…

Makefile (二)

一、line1的源碼 line1.h #ifndef _LINE_1_H #define _LINE_1_H void line1_print(const char *strMsg); #endifline1.cpp #include "line1.h" #include <stdio.h> void line1_print(const char *strMsg) {printf("This is line1 print %s.\r\n",st…

RocketMQ避坑指南:springcloud教程權威指南

1. Java 堆空間 **發生頻率&#xff1a;**5顆星 造成原因 無法在 Java 堆中分配對象 吞吐量增加 應用程序無意中保存了對象引用&#xff0c;對象無法被 GC 回收 應用程序過度使用 finalizer。finalizer 對象不能被 GC 立刻回收。finalizer 由結束隊列服務的守護線程調用&a…

IO多路復用之epoll

一、epoll函數族 1. 函數epoll_creat&#xff1a; 該函數生成一個epoll專用的文件描述符 #include <sys/epoll.h> int epoll_creae(int size); //epoll上能關注的最大描述符數 2. epoll_ctl&#xff1a;用于控制某個epoll文件描述符事件&#xff0c;可以注冊、修改、刪…

26. 刪除排序數組中的重復項

給定一個排序數組&#xff0c;你需要在原地刪除重復出現的元素&#xff0c;使得每個元素只出現一次&#xff0c;返回移除后數組的新長度。 不要使用額外的數組空間&#xff0c;你必須在原地修改輸入數組并在使用 O(1) 額外空間的條件下完成。 示例 1: 給定數組 nums [1,1,2], …

Leetcode 31. Pow(x, n) 解題報告

class Solution {public:double myPow(double x, int n) {double res 1.0;for(int i n; i ! 0; i / 2){if(i % 2 ! 0)res * x;x * x;}return n < 0 ? 1 / res : res;} };

572. 另一個樹的子樹

給定兩個非空二叉樹 s 和 t&#xff0c;檢驗 s 中是否包含和 t 具有相同結構和節點值的子樹。s 的一個子樹包括 s 的一個節點和這個節點的所有子孫。s 也可以看做它自身的一棵子樹。 示例 1: 給定的樹 s: 3/ \4 5/ \1 2給定的樹 t&#xff1a; 4 / \1 2返回 true&#x…

二叉樹中序遍歷的三種方法

二叉樹是一種重要的數據結構&#xff0c;對二叉樹的遍歷也很重要。這里簡單介紹三種二叉樹中序遍歷的方法。二叉樹的中序遍歷就是首先遍歷左子樹&#xff0c;然后訪問當前節點&#xff0c;最后遍歷右子樹。對于下面的二叉樹&#xff0c;中序遍歷結果如下&#xff1a; 結果&…

reverse函數:反轉容器內容

reverse函數可以反轉一個容器中的內容&#xff0c;包含在<algorithm>庫中。 1、函數原型 reverse函數等同于下面的代碼&#xff1a; template <class BidirectionalIterator> void reverse (BidirectionalIterator first, BidirectionalIterator last) {while ((…

服務器框架

一、Reactor模式 Reactor模式&#xff0c;它要求主線程&#xff08;I/O處理單元&#xff09;只負責監聽文件描述符上是否有事件發生&#xff0c;有的話就立即將該事件通知工作線程&#xff08;邏輯單元&#xff09;。除此之外&#xff0c;主線程&#xff08;I/O處理單元&#…

使用CreateFile讀寫文件

微軟提供了強大的文件讀寫操作的編程接口&#xff0c;所以可以通過調用API函數實現文件的讀寫操作。這里通過CreateFile函數來實現。 要對文件進行讀寫操作&#xff0c;首先要調用CreateFile函數打開或者創建文件&#xff0c;函數具體格式如下&#xff1a; HANDLE CreateFile(…

Leetcode 9. 回文數(Palindrome Number)

判斷一個整數是否是回文數。回文數是指正序&#xff08;從左向右&#xff09;和倒序&#xff08;從右向左&#xff09;讀都是一樣的整數。 示例 1: 輸入: 121 輸出: true示例 2: 輸入: -121 輸出: false 解釋: 從左向右讀, 為 -121 。 從右向左讀, 為 121- 。因此它不是一個…

使用CreateThread函數創建線程

線程是進程中的一個實體&#xff0c;是被系統獨立調度和分派的基本單位。一個進程可以擁有多個線程&#xff0c;但是一個線程必須有一個進程。線程自己不擁有系統資源&#xff0c;只有運行所必須的一些數據結構&#xff0c;但它可以與同屬于一個進程的其它線程共享進程所擁有的…

Leetcode 16. 最接近的三數之和(3Sum Closest)

解法一&#xff1a; class Solution { public:int threeSumClosest(vector<int>& nums, int target) {int closest nums[0] nums[1] nums[2];int diff abs(closest - target);sort(nums.begin(), nums.end());for (int i 0; i < nums.size() - 2; i) {int…

BMP格式詳解

BMP&#xff08;全稱Bitmap&#xff09;是Windows操作系統中的標準圖像文件格式&#xff0c;可以分成兩類&#xff1a;設備相關位圖&#xff08;DDB&#xff09;和設備無關位圖&#xff08;DIB&#xff09;&#xff0c;使用非常廣。它采用位映射存儲格式&#xff0c;除了圖像深…

Leetcode 5. 最長回文子串(Longest Palindromic Substring)

推薦理由&#xff1a;暴力解法太 naive&#xff0c;中心擴散不普適&#xff0c;Manacher 就更不普適了&#xff0c;是專門解這個問題的方法。而用動態規劃我認為是最有用的&#xff0c;可以幫助你舉一反三的方法。 補充說明&#xff1a;Manacher 算法有興趣的朋友們可以了解一…

請求轉發與請求重定向的區別

請求轉發&#xff1a; 請求轉發&#xff0c;即request.getRequestDispatcher().forward()&#xff0c;是一種服務器的行為&#xff0c;客戶端只有一次請求&#xff0c;服務器端轉發后會將請求對象保存&#xff0c;地址欄中的URL地址不會改變&#xff0c;得到響應后服務器端再將…

StringBuilder詳解

1、簡介 StringBuilder和StringBuffer一樣&#xff0c;都是繼承自抽象類AbstractStringBuilder類&#xff0c;也是一個可變的字符序列。StringBuilder和StringBuffer非常相似&#xff0c;甚至有互相兼容的API&#xff0c;不過&#xff0c;StringBuilder不是線程安全的&#xf…