Redis可以作為簡單搜索引擎優化查詢


  在日常開發中在遇到一些大數據量的查詢的時候,其實可以換種思路采用redis事先都緩存起來,然后通過redis里面進行結果集的運算。

原來的做法可能是 查詢SQL太復雜,然后將SQL進行拆分成多個子SQL,最后將每個子SQL的結果集查詢出來,在內存中進行運算,並集也好,交集也罷。

但是現在想想可以用redis進行並集交集等運算操作。因為redis支持這些功能

需求:

  現在需求可能是這樣的, 一個搜索框,搜索關鍵詞,然后下面有很多類別。類別可以多選或者單選,同時還有數值范圍查詢。這樣的查詢以前很肯定很多的sql條件

現在來看用redis怎么解決吧。

現在來看類別 單選多選怎么解決?

redis有個數據結構set,多個set之間可以進行交集並集操作。

思路: 把每個類別的數據提前查出來分別放到不同類別的set里緩存起來。

127.0.0.1:6379> sadd oneset 1 2 3
(integer) 3
127.0.0.1:6379> smembers oneset
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> sadd twoset 3 4 5
(integer) 3
127.0.0.1:6379> smembers twoset
1) "3"
2) "4"
3) "5"

先搞兩個set表示是兩個類別的類型數據,下面看加入這倆結果集的並集和交集分別是啥? 命令分別是 交集 sinter/sinterstore  並集 sunion/sunionstore

127.0.0.1:6379> sinter oneset twoset
1) "3"
127.0.0.1:6379> sunion oneset twoset
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> sinterstore threeset oneset twoset
(integer) 1
127.0.0.1:6379> smembers threeset
1) "3"
127.0.0.1:6379> sunionstore fourset oneset twoset
(integer) 5
127.0.0.1:6379> smembers fourset
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"

這樣就看出來操作之后的結果了,然后就是對子集進行操作了。

 

下面來分析下數值范圍的這種怎么做,這個時候就用到了redis的有序集合,

搞一個有序集合,把所有數據都存進去,同時記錄id作為值,分數是記錄的數值,然后可以用zrangebystore,然后把新的結果集跟上面的在進行交集

127.0.0.1:6379> zadd allset 1 12
(integer) 1
127.0.0.1:6379> zadd allset 4 123
(integer) 1
127.0.0.1:6379> zadd allset 7 88
(integer) 1
127.0.0.1:6379> zrangebyscore allset 3 6
1) "123"
127.0.0.1:6379> zadd all 30 5
(integer) 1
127.0.0.1:6379> zadd all 50 6
(integer) 1
127.0.0.1:6379> zadd all 88 7
(integer) 1
127.0.0.1:6379> zrangebyscore all 20 80
1) "5"
2) "6"
127.0.0.1:6379> zinterstore fiveset 2 all fourset
(integer) 1
127.0.0.1:6379> zrange fiveset 0 -1
1) "5"

最后是搜索框的處理方式,這個需要用到sscan命令,這個是查詢集合里面所有的key

127.0.0.1:6379> sscan oneset 0 match *
1) "0"
2) 1) "1"
2) "2"
3) "3"

 

上面只是簡單的都說明了一下只是提供了一下思路,感覺整體實現下來,java處理結果集部門可能還需要寫一些代碼

 

如果有說的不對的地方,請多指教


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM