啟動docker
systemctl start docker
登入redis
docker exec -it redis redis-cli
內容來自學成在線的媒資管理事務優化
目前的邏輯是方法uploadFile中包含兩個動作
1 將文件上傳到minio
2 將文件信息存儲到資料庫
原本是整個方法上加@transactional
但是1的這部分, 你並不能保證上傳的時間會有多長
以至於說整個方法如果綁transactional會導致占用資料庫資源
現在有個想法, 打算只在2的步驟上加入transactional
然後在2的程式碼中加入會報錯的程式碼, 看看是否會回滾
部分程式碼
//將文件上傳到minio
boolean result = addMediaFilesToMinIO(localFilePath, mimeType, bucket_files, objectName);
if(!result)XueChengPlusException.cast("上傳文件失敗");
//文件大小
uploadFileParamsDto.setFileSize(file.length());
//將文件信息存儲到數據庫
MediaFiles mediaFiles = addMediaFilesToDb(companyId, fileMd5, uploadFileParamsDto, bucket_files, objectName);
if(mediaFiles==null)XueChengPlusException.cast("上傳後保存文件信息失敗");
方法片段
@Transactional
public MediaFiles addMediaFilesToDb(Long companyId, String fileMd5, UploadFileParamsDto uploadFileParamsDto, String bucket, String objectName) {
//從數據庫查詢文件
MediaFiles mediaFiles = mediaFilesMapper.selectById(fileMd5);
if (mediaFiles == null) {
mediaFiles = new MediaFiles();
//拷貝基本信息
BeanUtils.copyProperties(uploadFileParamsDto, mediaFiles);
mediaFiles.setId(fileMd5);
mediaFiles.setFileId(fileMd5);
mediaFiles.setCompanyId(companyId);
mediaFiles.setUrl("/" + bucket + "/" + objectName);
mediaFiles.setBucket(bucket);
mediaFiles.setFilePath(objectName);
mediaFiles.setCreateDate(LocalDateTime.now());
mediaFiles.setAuditStatus("002003");
mediaFiles.setStatus("1");
//保存文件信息到文件表
int insert = mediaFilesMapper.insert(mediaFiles);
int a=1/0;
if (insert <=0) {
log.error("保存文件信息到數據庫失敗,{}", mediaFiles.toString());
XueChengPlusException.cast("保存文件信息失敗");
}
log.debug("保存文件信息到數據庫成功,{}", mediaFiles.toString());
}
return mediaFiles;
}
這時發現雖然會報錯誤, 但是事務沒有回滾, 事務失效
就是controller調用service時, 第一層是調代理對象的方法
但是方法中再調用其他方法, 則會是原對象方法, 如下圖
這裡有個技巧, 可以在方法調service中的方法前加上this.用debug斷點去看this就會發現並非proxy而這不滿足事務的兩個要求
1 需要是代理對象調方法
2 在調的方法上加@Transactional註解
因為要求沒滿足, 事務沒法生效
課程提供一個解法
就是將當前類再注入進來, 使其變成代理對象
步驟
1 注入本service作為代理對象
@Autowired
MediaFileService currentProxy;
2 將需要事務管理的方法提成接口
public MediaFiles addMediaFilesToDb(Long companyId,String fileMd5,UploadFileParamsDto uploadFileParamsDto,String bucket,String objectName);
3 調用代理對象call方法
//寫入文件表
MediaFiles mediaFiles = currentProxy.addMediaFilesToDb(companyId, fileMd5, uploadFileParamsDto, bucket_files, objectName);
尚品甄選
有包含架Harbor操作
udemy上搜尋large scale system可以找到kubernetes架構的專案教學
感覺可以看一下
黑馬頭條
裡面有spring cloud elasticSearch redis docker kafka
瑞吉外賣
有示範數據庫讀寫分離 linux安裝教學
閃聚支付
有示範分庫分表Sharding-JDBC 對交易服務進行分庫分表 分片鍵 插入數據根據商戶id決定要入哪個庫 短信驗證使用騰訊雲 上傳資質證件使用七牛雲
蒼窮外賣
有用到websocket
這次換工作, 還是想換到能用redis開發大流量的地方
畢竟有學習過, 稍微再進修一下讓自己能面試上
大約目標就是 關於高併發問題都能回答
然後在用個幾天把面試問題準備一下, 準備去面試
希望這個過程三周能走完XX
看看能不能一天進修14hr, 目前英文停課中
------
[心得] 2024各公司面試心得 - 看板 Soft_Job - 批踢踢實業坊 (ptt.cc)
查了一下似乎還是先刷200題好點
幾家還有興趣的公司
考java考卷
Kafka Redis 高併發 DB問題
B+ tree JVM(這部分可能要放掉?!)
搜尋系統設計題目, 看考古題
1 進入外企寫程式(這部分有點修正, 但是先拚英文)
ABCDABD...
ABCDABF...
簡單的說, 傳統解兩字串匹配部分
可能會來個雙迴圈, 哀個比對, 當不匹配的時候, 會將下方列再後移1位
然後不匹配再後移
然而
如果像上放已經有4個屬於匹配的字串, 她就應該直接往後移四位來匹配, 而不是只移動1位
隱藏的思維是, 當已知匹配的, 就已知完全不能匹配的部分, 而這部分應該合理的跳過
而當它既是前墜又是後墜的時候, 可能前面就都相同可以跳過
直接開始比開始不同的地方
後贅數組定義, 是整個kmp算法根基
dp[i]: the max length k s.t. s[0:k-1] = s[i-k+1:i]
[x x x] x [x x i]
中心思想, 是得到一個next數組 類似[-1, -1, 0, 1]
當該數位置對應的數字找不到匹配時, 可往前跳向下標位置再進行比對
(網路上有不同解法有跳往下標, 或是前一個下標, 會反應在j的初始值-1或是0)
public static boolean repeatedSubstringPattern(String s) {
if(s.equals(""))return false;
int len = s.length();
int[] temp = new int[len];
int[] next=getNext(temp,s, len);
// 比對表最後一欄位置不為-1 且 長度能被最大重複組除盡
if (next[len-1] != -1 && len % (len - (next[len-1]+1)) == 0) {
return true;
}
return false;
}
public static int[] getNext(int[]next, String s, int len){
// 1 初始化賦予-1值
next[0] = -1;
int j = -1;
char[] chars = s.toCharArray();
for(int i = 1; i<len; i++){
// 2 前後綴不相等時, 往前跳到指定位置再進行下迴圈(比對)
while(j>=0&&chars[i]!=chars[j+1]){
j = next[j];
}
// 3 前後綴相等, j++, 並將值放到next表中
if(chars[i]==chars[j+1]){
j++;
}
next[i]=j;
}
return next;
}
參考: https://www.youtube.com/watch?v=t6xa2p6fFS8&t=918s
1 每個月看看能不能都做專案, 一年12專案 2 刷題每周4題 3 跑個人scrum, 並組讀書會 4規律讀英文ex每天早上8:30-9:30 5規律運動7:35-8:30 6減肥97->85 這是今年年初的目標, 有刷一點題, 但是差不多三月初AI大爆發, 不得不開始接...