寫給自己的話,博客應該是記錄你一些心得椿胯,屬于你自己的東西,而不是當筆記本剃根,如同百度云盤保存那么多不看的資料哩盲,只要是你自己的哪怕簡單一點,有你自己的思想,那么就是一個很好的起步廉油。致浮華惠险。
形成自己的一套對于新技術的想法,怎么去熟悉新技術抒线,為未來提供知識儲備班巩。
目前業(yè)務需求引出業(yè)務需求,來當做自己學習新技術的一個方法嘶炭。
A.技術基本是springboot+mybatis+mysql來當做后端的模板抱慌。數(shù)據(jù)儲存在mysql中,每一次增刪改查都需要調(diào)用連接數(shù)據(jù)庫進行查詢眨猎,查詢有對應消耗抑进,單個數(shù)據(jù)每秒最多查詢不超過2000次。
場景是需要你進行某一個用戶消費記錄的顯示睡陪,用戶有多個并且需要顯示用戶名字寺渗。很簡單的sql就可以實現(xiàn)了查詢用戶消費表,然后用戶id關聯(lián)出用戶表宝穗,通過子查詢帶出對應用戶名字就可以實現(xiàn)户秤。一個sql就可以解決問題。組長要求sql里面要干凈逮矛,不要帶子查詢邏輯鸡号,sql就是一個單表的增刪改查,那么怎么處理须鼎?先寫一個查詢所有的用戶消費記錄鲸伴,然后獲取對應消費記錄中id,分別去查詢對應用戶id晋控。重復太多汞窗,如何去處理?最好哪里可以有緩存一下赡译,本地使用緩存仲吏,創(chuàng)建一個map,里面存放所有id對應名字蝌焚,然后對應id放到map中取出對應的名字來實現(xiàn)用戶姓名的顯示裹唆。效率分析,數(shù)據(jù)庫操作是只有二次只洒,但是問題來了许帐,對應壓力到了服務器,而且所有名字毕谴,其中大部分可能是不需要的成畦,隨著數(shù)據(jù)庫用戶變多距芬,你獲取所有然后保存到map中,之后再遍歷的是絕對不行的循帐。進一步框仔,引入redis。依然是查詢所有的用戶消費記錄表的信息拄养,然后對應用戶id先查詢redis中是否存在存和,如果不存在,查詢一次數(shù)據(jù)庫衷旅,并且對應用戶id跟用戶名稱放到redis緩存,設置過期時間纵朋。redis基于內(nèi)存柿顶,查詢數(shù)據(jù)快于mysql數(shù)據(jù)庫查詢。那么原先將調(diào)用數(shù)據(jù)庫1+N次操软,優(yōu)化到調(diào)用數(shù)據(jù)庫1+ Z (Z<=N)+ 調(diào)用redis (N-Z)次 嘁锯,對應最差就是每次都調(diào)用數(shù)據(jù)庫,但是如果redis緩存可以命中一些用戶數(shù)據(jù)聂薪,那么就是提高了效率家乘,而且redis比mysql抗揍,redis基于內(nèi)存藏澳,4w qps 也能抗下來仁锯,比mysql的2000 qps 要抗揍很多。所以本次技術引入使用是成功的翔悠。
B.初識redis业崖,那么怎么去學習redis。其實redis本身你也可以當成第三方來調(diào)用蓄愁,只是這個第三方反饋很及時双炕。
這里省略redis的安裝以及對應客戶端安裝。默認是有16個db (0-15),如果不設置默認是0.需要提醒到的是撮抓,不同db的數(shù)據(jù)不同步的妇斤,出現(xiàn)過客戶端跟管理端使用的是不同的redis的db,其中客戶端是1丹拯,管理端是2站超。然后客戶端存在用戶登錄失敗,就會記錄到失敗次數(shù)在對應db1咽笼,當用戶手機號對應失敗次數(shù)到達5顷编,就會直接返回用戶被禁止登錄,請等待解封之后處理剑刑。當然如果用戶失敗4次媳纬,然后第5次成功了双肤,就清空對應用戶失敗次數(shù)。同理在管理端钮惠,也實現(xiàn)用戶的登錄重置茅糜,一開始只是簡單跟客戶端一樣,查詢是否有對應key素挽,如果存在就清空蔑赘。結(jié)果問題出現(xiàn)對應redis數(shù)據(jù)庫不一樣,所以后面調(diào)整到對應共用一個數(shù)據(jù)庫预明,(網(wǎng)上查詢了一下缩赛,可以切換對應數(shù)據(jù)庫開支不大但是沒找到在線切換數(shù)據(jù)庫的方法,所以就采取了共用一個數(shù)據(jù)庫的方法撰糠。不過客戶端跟管理端的緩存都放在了一起酥馍,這里對應用戶key添加user跟manage拼接到key作為區(qū)分)。另外redis最顯著二個特點是高可用阅酪,高并發(fā)旨袒。其中高并發(fā)只是通過網(wǎng)上了解對應redis基于內(nèi)存,可以承受4wqps的訪問量术辐,遠比mysql的2000qps要來的高很多砚尽,而且redis訪問速度比mysql快。但是redis無法代替mysql辉词,因為redis是作為緩存的必孤,它并不能代替數(shù)據(jù)庫,redis的數(shù)據(jù)總會有清空的瑞躺。
C.redis的數(shù)據(jù)類型理解
String的get key value跟set key value屬于單個操作隧魄,群操為前面加上M 也就是Mset跟Mget,刪除為 del key隘蝎,數(shù)字遞增 incr key? 指定整數(shù)增加 incrby key increment购啄。數(shù)字遞減decr key 指定整數(shù)減少 decrby key decrement。尾部追加值? append key value嘱么。場景對應狮含,簡單的key-value應用在用戶登錄驗證部分,用戶每次登錄都會攜帶對應token曼振,如果用戶進行操作都要進行權限token驗證几迄,那么每次查詢都需要訪問數(shù)據(jù)庫,交互就很頻繁冰评,所以token放到redis中保存映胁。另外,原先是一些功能訪問有對應次數(shù)甲雅,為了防止被頻繁爬蟲解孙,就設置了對應使用次數(shù)的校驗坑填,每次使用功能一次就自增一次,并且設置過期時間弛姜,比如在10s內(nèi)該賬號訪問次數(shù)達到20次脐瑰,就進行禁止登錄,token清空處理廷臼,以此來實現(xiàn)對賬號的把控苍在,更進一步則是記載對應訪問的ip地址,在對應云服務器上進行設置黑名單荠商。對應解封寂恬,微信聯(lián)系客服進行解封。