我設(shè)計了一個牛逼的輕量級搜索引擎
點擊上方藍色字體,選擇“標星公眾號”
優(yōu)質(zhì)文章,第一時間送達
作者:jasonGeng88
https://github.com/jasonGeng88/blog
場景

實現(xiàn)1
率先登場是小A同學,他是寫 SQL 方面的“專家”。小A信心滿滿的說:“不就是一個查詢接口嗎?看著條件很多,但憑著我豐富的 SQL 經(jīng)驗,這點還是難不倒我的。”
于是乎就寫出了下面這段代碼(這里以 MYSQL 為例):
select ... from table_1
left join table_2
left join table_3
left join (select ... from table_x where ...) tmp_1
...
where ...
order by ...
limit m,nexplain關(guān)鍵字進行SQL性能分析,對該加索引的地方都加上了索引。同時將一條復雜SQL拆分成了多條SQL,計算結(jié)果在程序內(nèi)存中進行計算。$result_1 = query('select ... from table_1 where ...');
$result_2 = query('select ... from table_2 where ...');
$result_3 = query('select ... from table_3 where ...');
...
$result = array_intersect($result_1, $result_2, $result_3, ...);
這種方案從性能上明顯比第一種要好很多,可是在功能驗收的時候,產(chǎn)品經(jīng)理還是覺得查詢速度不夠快。
小B自己也知道,每次查詢都會向數(shù)據(jù)庫查詢多次,而且有些歷史原因,部分條件是做不到單表查詢的,所以查詢等待的時間是避免不了的。

子類單選:直接根據(jù)條件 key,獲取對應結(jié)果集; 子類多選:根據(jù)多個條件 Key,進行并集操作,獲取對應結(jié)果集; 最終結(jié)果:將獲取的所有子類結(jié)果集進行交集操作,得到最終結(jié)果;

ZRANGEBYSCORE命令,根據(jù)分數(shù)(價格)區(qū)間,獲取相應結(jié)果集。擴展
分頁

ZINTERSTORE命令,賦結(jié)果集權(quán)重為0,商品時間結(jié)果為1,取交集而得的結(jié)果集賦予創(chuàng)建時間分值的新有序集合。對新結(jié)果集的操作即能得到分頁所需的各個數(shù)據(jù):頁面總數(shù)為: ZCOUNT命令當前頁內(nèi)容: ZRANGE命令若以倒序排列: ZREVRANGE命令
數(shù)據(jù)更新
性能優(yōu)化
MULTI命令,開啟一個事務,將 Redis 的多次操作放在一個事務中,最后通過EXEC來進行原子性執(zhí)行(注意:這里所謂的事務,只是將多個操作在一次連接中執(zhí)行,如果執(zhí)行過程中遇到失敗,是不會回滾的)推薦閱讀:
IDEA 永久注冊碼來了!!! 一個非常好的行為驗證碼Java開源項目! Google 開源的依賴注入庫,比 Spring 更小更快! GitHub 近兩萬 Star,無需編碼,可一鍵生成前后端代碼 Spring Boot 中引入 MyBatisPlus 的常規(guī)流程 免費版的 IDEA 為啥不能使用 Tomcat ? 給新手的 11 個 Docker 免費上手項目
最近面試BAT,整理一份面試資料《Java面試BAT通關(guān)手冊》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。 獲取方式:關(guān)注公眾號并回復 java 領(lǐng)取,更多內(nèi)容陸續(xù)奉上。 明天見(??ω??)??
評論
圖片
表情
