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處理結果集部門可能還需要寫一些程式碼
如果有說的不對的地方,請多指教