当前位置:嗨网首页>书籍在线阅读

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的列表类型来解决。”