13-列表类型
3.4 列表类型
正当小白踌躇满志地写着文章列表页的代码时,一个很重要的问题阻碍了他的开发,于是他请来了宋老师为他讲解。
原来小白是使用如下流程获得文章列表的:
- 读取
posts:count键获得博客中最大的文章ID; - 根据这个ID来计算当前列表页面中需要展示的文章ID列表(小白规定博客每页只显示10篇文章,按照ID的倒序排列),如第n页的文章ID范围是从最大的文章
ID - (n - 1) * 10"到"max(最大的文章ID - n * 10 + 1, 1)"; - 对每个ID使用
HMGET命令来获得文章数据。
对应的伪代码如下:
# 每页显示10篇文章
$postsPerPage = 10
# 获得最后发表的文章ID
$lastPostID =GET posts:count
# $currentPage存储的是当前页码,第一页时$currentPage的值为1,依此类推
$start = $lastPostID - ($currentPage - 1) * $postsPerPage
$end = max($lastPostID - $currentPage * $postsPerPage + 1, 1)
# 遍历文章ID获取数据
for $i = $start down to $end
# 获取文章的标题和作者并打印出来
post =HMGET post:$i, title, author
print $post[0] # 文章标题
print $post[1] # 文章作者
可是这种方式要求用户不能删除文章以保证 ID 连续,否则小白就必须在程序中使用 EXISTS 命令判断某个ID的文章是否存在,如果不存在则跳过。由于每删除一篇文章都会影响后面的页码分布,为了保证每页的文章列表都能正好显示10篇文章,不论是第几页,都不得不从最大的文章ID开始遍历来获得当前页面应该显示哪些文章。
小白摇了摇头,心想:“真是个灾难!”然后看向宋老师,试探地问道:“我想到了 KEYS 命令,可不可以使用 KEYS 命令获得所有以“ post: ”开头的键,然后再根据键名分页呢?”
宋老师回答道:“确实可行,不过 KEYS 命令需要遍历数据库中的所有键,出于性能考虑一般很少在生产环境中使用这个命令。至于你提到的问题,可以使用Redis的列表类型来解决。”