《Redis应用实例》书摘(26):分页

分页程序对于每个包含大量资料的应用来说都是必不可少的,它在网络论坛、社交应用、CMS系统和网购应用中也会频繁用到。

代码清单 CODE_PAGGING 展示了基于列表实现的分页程序。


代码清单 CODE_PAGGING 分页程序 pagging.py

from math import ceil  # 向下取整函数

DEFAULT_SIZE = 10  # 默认每页返回10个元素

class Pagging:

    def __init__(self, client, key):
        self.client = client
        self.key = key

    def add(self, *items):
        """
        将给定的一个或多个元素推入到分页列表中,
        成功时返回列表当前包含的元素数量作为结果。
        """
        return self.client.lpush(self.key, *items)

    def get(self, page, size=DEFAULT_SIZE):
        """
        从指定分页中取出指定数量的元素。
        """
        # 根据给定的页数和元素数量计算出索引范围
        start = (page-1)*size
        end = page*size-1
        # 根据索引从分页列表中获取元素
        return self.client.lrange(self.key, start, end)

    def length(self):
        """
        返回分页列表包含的元素总数量。
        """
        return self.client.llen(self.key)

    def number(self, size=DEFAULT_SIZE):
        """
        返回在获取指定数量的元素时,分页列表包含的页数量。
        如果分页列表为空则返回0。
        """
        return ceil(self.length()/size)

作为例子,以下代码展示了如何使用这个分页程序构建一个包含九个元素的分页列表,然后以每页三个元素的方式返回第一、第二和第三页的各个元素:

>>> from redis import Redis
>>> from pagging import Pagging
>>> client = Redis(decode_responses=True)
>>> page = Pagging(client, "TopicList")
>>> for i in range(1, 10):  # 添加被分页元素
...   page.add("topic:{}".format(i))
...
1
2
# ...
9
>>> page.length()  # 获取元素总数量
9
>>> page.number(3)  # 获取总页数
3
>>> page.get(1, 3)  # 获取分页元素
['topic:9', 'topic:8', 'topic:7']
>>> page.get(2, 3)
['topic:6', 'topic:5', 'topic:4']
>>> page.get(3, 3)
['topic:3', 'topic:2', 'topic:1']

Tip

本文摘录自《Redis应用实例》一书。
欢迎访问书本主页以了解更多Redis使用案例:huangz.works/rediscookbook/
../_images/rediscookbook-banner.png