开发有时候为了减少数据库的压力,常常要使用Reids缓存,但是Reids基于内存而且单线程,所以最忌讳的就是大key,大value来给造成阻塞。所以常常有时候我们需要使用Reids分页来实现大数据量存储。 比如:微博评论等等。
如何实现Reids分页?
分页其实很简单,在关系型数据库Mysql等中,只需使用 limit 关键字,就可以很简单的实现分页,插入起始索引,查询数目就可以完成。当然分页大致就是如此,那么Reids能否也利用这样的形式去实现呢? 当然是可以的,但是Redis本身是不支持直接分页的,所以我们可以考虑使用其本身的数据结构,来实现分页。那么我们需要考虑的是,查询数目我们可以决定,那么分页的索引怎么保证呢?还有数据格式该如何存储呢? 其实这两单保证,我们就可以很愉快的实现分页啦!!
选取数据结构!
索引:
其实索引,简单来说也就是每条数据的id,记录id。Redis提供了List,Zset两种数据结构,这就可以很愉快的让我们存储id来实现记录,并且我们都知道List集合本身支持subline截取,这样利用二者的特性我们就可以记录索引。Zset同理可能比这个更完美一些,但是大致也是一样。
redisTemplate.opsForList().range(key, start, end);
range特性,我们就可以很愉快的截取对应的id集合。
对象:
其实对象,也就是我们数据库中的一条条记录,当然,我们开发中最常用的格式就是JSON,这就很简单了,本身Redis的Hash结构完美的支持了我们的这种格式。 key,item,value三者的属性,key作为id,item作为每个属性的key,value是具体的属性值,这样一条记录,就完美的落入到了Redis中。
实现分页!
redisTemplate.opsForHash().get(key, item)
我们根据List获取到了分页key,然后去拿去分页的对应数据,我使用的是item存id,外面大key作为统一的一个KEY,每个人可以根据实际业务具体定义。
redis两条简单的命令和数据结构就完美支持了分页。当然需要注意一点,就是如果id很多的话,可以考虑使用分段存储,来避免大value的出现。