/ redis  

如何使用redis缓存实现分页

解决思路
用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.htmlhttp://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查询合并之后的集合.