zoukankan      html  css  js  c++  java
  • 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处理结果集部门可能还需要写一些代码

    如果有说的不对的地方,请多指教

  • 相关阅读:
    a标签中调用js的几种方法
    IE11浏览器:请不要再叫我IE,谢谢
    IE11浏览器:请不要再叫我IE,谢谢
    浅谈href=#与href=javascript:void(0)的区别
    浅谈href=#与href=javascript:void(0)的区别
    Google Java编程风格指南
    Google Java编程风格指南
    Git学习小结 ~ Lethe's Blog
    Binder机制简析(三)
    Ness
  • 原文地址:https://www.cnblogs.com/haoerlv/p/10402074.html
Copyright © 2011-2022 走看看