Redis能够做为简单搜索引擎优化查询

  在平常开发中在遇到一些大数据量的查询的时候,其实能够换种思路采用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处理结果集部门可能还须要写一些代码

 

若是有说的不对的地方,请多指教

相关文章
相关标签/搜索