使用 Redis 列表构建分页程序
2012 年 8 月 3 日
Note
本文摘录自即将出版的《Redis使用手册》, 详情请见: RedisGuide.com 。
对于互联网上每一个具有一定规模的网站来说, 分页程序都是必不可少的: 新闻站点、博客、论坛、搜索引擎等等, 都会使用分页程序将数量众多的信息分割为多个页面, 使得用户可以以页为单位浏览网站提供的信息, 并以此来控制网站每次取出的信息数量。 图 4-19 就展示了一个使用分页程序对用户发表的论坛主题进行分割的例子。
图 4-19 论坛中的分页示例
代码清单 4-2 展示了一个使用列表实现分页程序的方法, 这个程序可以将给定的元素有序地放入到一个列表里面, 然后使用 LRANGE
命令从列表中取出指定数量的元素, 从而实现分页这一概念。
代码清单 4-2 使用列表实现的分页程序: /list/paging.py
class Paging: def __init__(self, client, key): self.client = client self.key = key def add(self, item): """ 将给定元素添加到分页列表中。 """ self.client.lpush(self.key, item) def get_page(self, page_number, item_per_page): """ 从指定页数中取出指定数量的元素。 """ # 根据给定的 page_number (页数)和 item_per_page (每页包含的元素数量) # 计算出指定分页元素在列表中所处的索引范围 # 例子:如果 page_number = 1 , item_per_page = 10 # 那么程序计算得出的起始索引就是 0 ,而结束索引则是 9 start_index = (page_number - 1) * item_per_page end_index = page_number * item_per_page - 1 # 根据索引范围从列表中获取分页元素 return self.client.lrange(self.key, start_index, end_index) def size(self): """ 返回列表目前包含的分页元素数量。 """ return self.client.llen(self.key)
作为例子, 我们可以通过执行以下代码, 载入并创建出一个针对用户帖子的分页对象:
>>> from redis import Redis >>> from paging import Paging >>> client = Redis(decode_responses=True) >>> topics = Paging(client, "user-topics")
并使用数字 1
至 19
作为用户帖子的 ID , 将它们添加到分页列表里面:
>>> for i in range(1, 20): ... topics.add(i) ...
然后我们就可以使用分页程序, 对这些帖子进行分页了:
>>> topics.get_page(1, 5) # 以每页 5 个帖子的方式,取出第 1 页的帖子 ['19', '18', '17', '16', '15'] >>> topics.get_page(2, 5) # 以每页 5 个帖子的方式,取出第 2 页的帖子 ['14', '13', '12', '11', '10'] >>> topics.get_page(1, 10) # 以每页 10 个帖子的方式,取出第 1 页的帖子 ['19', '18', '17', '16', '15', '14', '13', '12', '11', '10']
最后, 我们可以通过执行以下代码, 取得分页列表目前包含的元素数量:
>>> topics.size() 19