解决思路
用hset和hget进行每个对象的存取,用zadd和zrange存取条件索引(可以通过控制后面offset值进行分页查询),
然后根据zrange获取到的key值再去用hget循环遍历获取对象add到返回的集合当中。
简单实验
但是为了实现根据条件查询,需要在存取对象前对某个条件做索引,下面举个例子。
现在有4个用户,分别是: zhangsan,lisi,wangwu,zhaoliu。其中zhangsan和wangwu是货主,userType值为0,其余2个是司机,userType为1。
我现在要实现查询货主用户(即type值为0的)。
1.当我存入这四个用户时,我redis这么写(用户名作为key值,当然实际当中我们之间是用USER:uid做key值)
hset user zhangsan zsinfo
zadd type 0 zhangsan
hset user lisi lisiinfo
zadd type 1 lisi
hset user wangwu wangwuinfo
zadd type 0 wangwu
hset user zhaoliu zhaoliuinfo
zadd type 1 zhaoliu
我们把type当做索引,来区别每个key对应的用户类型
2.当我们查询userType为0的用户时,我们先去有序集合中查询符合条件的所有key值
指令:zrangebyscore type -inf 0
(-inf 0)查询score值小于等于0
查询结果:
再加上分页参数即
指令:zrangebyscore type -inf 0 limit 0 1
zrangebyscore的用法
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
具体条件查询用法可以参考http://redisdoc.com/sorted_set/zrangebyscore.html 和 http://redisdoc.com/sorted_set/zrangebylex.html
3.然后我们得到了我们要的key的集合之后再通过循环遍历去取出所需要的用户对象
hget user zhangsan
其它参考:
项目实例
项目需求是这样的:
用户发布了很多个订单,其中每个订单都有一个字段标志着订单的状态,我们需要查询某个用户不同订单的状态,并且按发布时间(对应有字段表示)进行排序.
redis相关key值建立
用户ID+订单状态 -》 订单序列号集合(通过时间排序)
订单序列号 -》 订单详情信息
例如:zadd USERID:66_STATE:2 1232313 201502152441
zadd USERID:66_STATE:1 1232314 201502152441
其中1232313是订单的创建时间(long类型),表示对应的score值,201502152441是订单号.
同样在执行hset orderInfo 201502152441 orderInfo对于的json数据
就应该执行zadd操作为后期分页查询增加查询条件对应的索引
查询步骤
如果要查询用户编号为66的人的状态值为2的订单
用zrangebyscore USERID:66_STATE:2 -inf +inf limit 0 10
来进行分页查询,表示查询第一页10个数据,表示页面大小为10,查询第二页limit后就根10 10.
根据上面的zrangebyscore的用法,因为这个实例score对应的是时间,所以可以查询某个时间范围内的订单也是可以的,只需要给定好时间区间
通过上面查询我们就可以得到订单编号的集合
然后通过循环遍历用hget orderInfo 订单编号命令来取出订单详细信息
补充
由于上面的均为redis的原生指令,实际开发中是用jedis,可能会有出入不过出入不大.
如果订单状态发生改变后,需要将一个sortedSet里面对应的key值删除,然后再另一个状态值对应的sortedSet里面增加进去.
举个例子,如果订单201502152441的状态由2变为了1,那么需要执行的操作为:zrem USERID:66_STATE:2 201502152441
zadd USERID:66_STATE:1 1232313 201502152441
这2个操作可以放到redis的一个事物里去执行,就不做详细描述了.
另外如果要查询订单状态为1为2的需要用如果要用
ZUNIONSTORE先对2个索引集合进行合并,然后再用zrangebyscore查询合并之后的集合.