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

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

最新文章

  1. android手机登录时遇到“QQ安全登录发现病毒”解决
  2. Android中使用dimen定义尺寸(转)
  3. [SRS流媒体]RTMP/HLS 直播服务器simple-rtmp-server安装
  4. android 中的几种目录
  5. C#计算某一些任务的执行时间(消耗时间)
  6. USACO Section 3.4: Raucous Rockers
  7. ASP.NET MVC3 系列教程 - 部署你的WEB应用到IIS 6.0
  8. compile php 5.4
  9. poj2528 Mayor's posters(线段树区间覆盖)
  10. mysql、oracle和SQL server数据库的区别
  11. mysql的读写分离
  12. 在OC代码中创建Swift编写的视图控制器
  13. Mysql 调优和水平扩展思路
  14. Python:Day16 闭包、装饰器
  15. 深度:Hadoop对Spark五大维度正面比拼报告!
  16. LeetCode 896 Monotonic Array 解题报告
  17. 04_web基础(九)考核与评估
  18. office转换成pdf
  19. Python实现代码行数统计工具
  20. C#-输入输出,类型,运算符,语句的练习——★判断年份是否是闰年★

热门文章

  1. OpenACC 《大规模并行处理器编程实战》教材讲解
  2. 修改IP
  3. MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
  4. 列表(ul ol dl)
  5. ABAP-TXT文件上传
  6. ABAP-SAP的LUW和DB的LUW的区别
  7. centor os 安装nginx
  8. mongodb first
  9. maven 的聚合
  10. Spring Retry