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

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

Redis可以作为简单搜索引擎优化查询的更多相关文章

  1. Redis 搜索引擎优化

    场景 大家如果是做后端开发的,想必都实现过列表查询的接口,当然有的查询条件很简单,一条 SQL 就搞定了,但有的查询条件极其复杂,再加上库表中设计的各种不合理,导致查询接口特别难写,然后加班什么的就不 ...

  2. Redis 优化查询性能

    一次使用 Redis 优化查询性能的实践   应用背景 有一个应用需要上传一组ID到服务器来查询这些ID所对应的数据,数据库中存储的数据量是7千万,每次上传的ID数量一般都是几百至上千数量级别. 以前 ...

  3. 一次使用 Redis 优化查询性能的实践

    因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,一次使用 Redis 优化查询性能的实践 应用背景 有一个应用需要上传一组ID到 ...

  4. 【分布式搜索引擎】Elasticsearch如何部署以及优化查询性能

    一.Elasticsearch生产集群如何部署 (1)es生产集群部署5台机器,若每台机器是6核64G的,那么集群总内存是320G (2)假如我们es集群的日增量数据大概是2000万条,每天日增量数据 ...

  5. NoSQL初探之人人都爱Redis:(1)Redis简介与简单安装

    一.NoSQL的风生水起 1.1 后Web2.0时代的发展要求 随着互联网Web2.0网站的兴起,传统的关系数据库在应付Web2.0网站,特别是超大规模和高并发的SNS类型的Web2.0纯动态网站已经 ...

  6. 【转】NoSQL初探之人人都爱Redis:(1)Redis简介与简单安装

    一.NoSQL的风生水起 1.1 后Web2.0时代的发展要求 随着互联网Web2.0网站的兴起,传统的关系数据库在应付Web2.0网站,特别是超大规模和高并发的SNS类型的Web2.0纯动态网站已经 ...

  7. Lucene.net站内搜索—3、最简单搜索引擎代码

    目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...

  8. Redis简介与简单安装

    Redis简介与简单安装   一.NoSQL的风生水起 1.1 后Web2.0时代的发展要求 随着互联网Web2.0网站的兴起,传统的关系数据库在应付Web2.0网站,特别是超大规模和高并发的SNS类 ...

  9. 网站搜索引擎优化SEO策略及相关工具资源

    网站优化的十大奇招妙技 1. 选择有效的关键字: 关键字是描述你的产品及服务的词语,选择适当的关键字是建立一个高排名网站的第一步.选择关键字的一个重要的技巧是选取那些常为人们在搜索时所用到的关键字. ...

随机推荐

  1. 浏览器。浏览器对象检测、Chrome调试工具

    chrome浏览器的flash问题: 2017-12-26 chrome浏览器的flash有无法显示无法正常运行的问题时,解决方法如下: https://qzonestyle.gtimg.cn/qzo ...

  2. sssp-webservce_restful

    pom <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.or ...

  3. AS3 注意点

    当主类new 一个主影片来放内容的时候.在gc此swf时,一定要检查此主影片是否存在,如 private function initStart() { //trace("RightMenu类 ...

  4. 模板引擎-freemarker

    Freemarker 是一款模板引擎,是一种基于模版生成静态文件的通用 工具,它是为java程序员提供的一个开发包. 可通过将Word或者Excel模板另存为xml格式,在其中修改要替换的内容. 基本 ...

  5. 在eclipse中修改生成的注释类、方法的作者、时间

    1.打开eclipse:windos-->preferences-->Java-->Code Style -->Code Templates-->Types-->点 ...

  6. 迷你MVVM框架 avalonjs 1.4.1发布

    以后有关avalon的版本升级消息,全部改放到这里 重构parseHTML,让其支持xhtml 强化 ms-duplex-number拦截器 添加data-duplex-number辅助指令 值为st ...

  7. hibernate中.常见的hql查询语句

    hql是非常有意识的被设计为完全面向对象的查询 基本规则: 1.hql语法类似于sql,但它后面跟的不是表名和字段名,而是类名和属性名 2.hql大小写不敏感.但是设计java类名,包名,属性名时大小 ...

  8. 类的"魔法"方法

    1. __init__()方法 <1>使用方式 def 类名: #初始化函数,用来完成一些默认的设定 def __init__(): pass 总结1 当创建Car对象后,在没有调用__i ...

  9. ubuntu下搭建testlink

    环境配置: 1. 安装mysql 教程网上找 2. 安装apache sudo apt-get install apache2 重启apache服务 sudo /etc/init.d/apache2 ...

  10. Windows phone 自定义控件(无外观控件)——ColorPicker

    编码前 在上一篇博客中,写的是一个UserControl的子类,它具有固定的外观(虽然也可以通过样式来进行修改,但受到的限制很大).如果你想要使用这个控件的逻辑,但是希望在使用的时候可以更改控件的外观 ...