在平常開發中在遇到一些大數據量的查詢的時候,其實能夠換種思路採用redis事先都緩存起來,而後經過redis裏面進行結果集的運算。java
原來的作法多是 查詢SQL太複雜,而後將SQL進行拆分紅多個子SQL,最後將每一個子SQL的結果集查詢出來,在內存中進行運算,並集也好,交集也罷。redis
可是如今想一想能夠用redis進行並集交集等運算操做。由於redis支持這些功能sql
需求:緩存
如今需求多是這樣的, 一個搜索框,搜索關鍵詞,而後下面有不少類別。類別能夠多選或者單選,同時還有數值範圍查詢。這樣的查詢之前很確定不少的sql條件數據結構
如今來看用redis怎麼解決吧。大數據
如今來看類別 單選多選怎麼解決?three
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"io
先搞兩個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處理結果集部門可能還須要寫一些代碼
若是有說的不對的地方,請多指教