在日常開發中在遇到一些大數據量的查詢的時候,其實可以換種思路采用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處理結果集部門可能還需要寫一些代碼
如果有說的不對的地方,請多指教