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处理结果集部门可能还需要写一些代码

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

  • 相关阅读:
    mysql索引
    springboot mybatis 后台框架平台 shiro 权限 集成代码生成器
    java 企业网站源码模版 有前后台 springmvc SSM 生成静态化
    java springMVC SSM 操作日志 4级别联动 文件管理 头像编辑 shiro redis
    activiti工作流的web流程设计器整合视频教程 SSM和独立部署
    .Net Core中的ObjectPool
    文件操作、流相关类梳理
    .Net Core中的配置文件源码解析
    .Net Core中依赖注入服务使用总结
    消息中间件RabbitMQ(一)
  • 原文地址:https://www.cnblogs.com/haoerlv/p/10402074.html
Copyright © 2011-2022 走看看