redis作为NoSQL数据库,经常用作缓存,所以推荐将那些经常查询的数据存入redis中方便下次快速获取。但redis没有像关系型数据库那样拥有结构化的查询语言,如果缓存了很多数据,想从中获取满足某些条件的数据时,该如何做呢?

  如果把这些海量数据从redis里拿出来,逐个遍历筛选出满足条件的数据,这肯定不可行!

  可以通过在把这些海量数据存入redis时,把满足各种条件的数据的key同时也存入redis的set类型中就可以方便下次根据这些条件查询了。

  比如user表的数据经常被以年龄为25并且性别为男的条件来进行查询,而且user表的数据很多比如有500W条,那么我们通常会把所有user表的数据存入到redis的hash类型中,该hash类型数据的集合名称为user表的表名比如"SYS_USER_TABLE",里面每条数据的key是该条数据的id值,value是该条数据的json字符串。同时我们将满足年龄为25的数据的id存入key为"SYS_USER_AGE_25"的set类型中,把满足性别为男的数据的id存入key为"SYS_USER_SEX_M"的set类型中。这样当要查询年龄为25并且性别为男的user时,可以通过将SYS_USER_AGE_25和SYS_USER_SEX_M这两个set集合取交集,再从SYS_USER_TABLE中获取key在这个交集中的数据即可。

  取交集就是"与"关系,取并集就是"或"关系,利用这两点可以满足类似关系型数据库中根据where条件进行简单查询的场景。当然redis毕竟是NoSQL,太复杂的查询肯定做不了,也不推荐做,所以尽量在redis中存的数据就是你想要的数据,换句话说这些数据本身就是满足这些条件的查询结果。