• 请不要在回答技术问题时复制粘贴 AI 生成的内容
darkmatter
V2EX  ›  程序员

连个分页都写不好,看来做程序员是没希望了??

  •  1
     
  •   darkmatter · Jul 26, 2015 · 8426 views
    This topic created in 4120 days ago, the information mentioned may be changed or developed.
    一个分页功能折腾了两天都没写好
    62 replies  •  2015-07-28 05:42:46 +08:00
    jjplay
    jjplay
    Jul 26, 2015
    1
    勤能补拙
    tobyxdd
    tobyxdd
    Jul 26, 2015
    2
    看是多高级的分页
    ghostcat
    ghostcat
    Jul 26, 2015
    3
    我一般找现成的代码……读别人的代码学习
    qwe321
    qwe321
    Jul 26, 2015
    4
    我写的分页代码也是很鸡肋
    qw7692336
    qw7692336
    Jul 26, 2015 via Android
    5
    框架自动完成的分页
    luban
    luban
    Jul 26, 2015
    6
    手两天写不好太正常
    Wangxf
    Wangxf
    Jul 26, 2015
    7
    确实天赋太差,努力做一个好的码农吧,慢慢来吧,也许是某个环节点知识点没疏通
    learnshare
    learnshare
    Jul 26, 2015
    8
    多写多积累
    Syec
    Syec
    Jul 26, 2015
    9
    多看看别人的代码
    htfy96
    htfy96
    Jul 26, 2015
    10
    到底是哪个分页……
    br00k
    br00k
    Jul 26, 2015
    11
    多高级的分页?
    sneezry
    sneezry
    Jul 26, 2015 via iPhone❤️1
    12
    一般的分页的套路基本是固定的,看看大家都是怎么写的记住就行了,遇到高级,谁都不可能写得顺风顺水的,别没事就质疑自己能力,这世界上的天才远没有你想的那么多,大牛也多是写的多了经历的多了。
    likai
    likai
    Jul 26, 2015
    13
    玩PHP我最怕的就是分页和时间转换了
    anubiskong
    anubiskong
    Jul 26, 2015
    14
    小事情比你想的复杂很多.
    不信你写个登陆注册
    loading
    loading
    Jul 26, 2015 via Android
    15
    分页不就是 sql 需要看下例子吗?
    darkmatter
    darkmatter
    OP
    Jul 26, 2015
    16
    @tobyxdd 也就是一般的分页。
    darkmatter
    darkmatter
    OP
    Jul 26, 2015
    17
    @luban 我怎么觉得很不正常。
    darkmatter
    darkmatter
    OP
    Jul 26, 2015
    18
    @Wangxf 从别的行业转来,想做个程序员。
    wohenyingyu01
    wohenyingyu01
    Jul 26, 2015
    19
    我也是一个程序员,但是我听不懂什么叫分页
    breeswish
    breeswish
    Jul 26, 2015
    20
    pagination? paging? …
    说来生成 pagination 的 上一页,下一页,第一页,最后一页,前几页,后几页…确实要写不少东西
    zonghua
    zonghua
    Jul 26, 2015
    21
    @breeswish 不是模型那层输出list和count就行吗?我都这么干。
    lincanbin
    lincanbin
    Jul 26, 2015
    22
    @loading 我觉得这里的分页应该是指分页的导航输出。




    https://github.com/lincanbin/Carbon-Forum/blob/master/common.php#L374

    我这里写了一个,如果考虑的情况比较多,不是像V2EX这样简单的上一页下一页,写起来还是挺繁琐的。
    laoyuan
    laoyuan
    Jul 26, 2015
    23
    分页我每隔一两年就重新写一次
    powtop
    powtop
    Jul 26, 2015
    24
    @laoyuan 今晚还直播不
    yakczh
    yakczh
    Jul 26, 2015
    25
    google的那种分页,就是当前页在中间的样式
    gseven0312
    gseven0312
    Jul 26, 2015❤️1
    26
    别灰心,没有人能一步到位的,慢慢来
    Tink
    Tink
    Jul 26, 2015
    27
    嗯嗯,我也不会写,都是用框架自带的
    iyaozhen
    iyaozhen
    Jul 26, 2015
    28
    @likai PHP 时间转换不是挺方便嘛?
    scourgen
    scourgen
    Jul 26, 2015❤️7
    30
    分页还真不是简单能写好的,简直是一个细思恐极的话题。

    1.如何自动根据查询语句去生成一个 count sql,算出有多少条信息,需要分多少页?
    2.有没有不用计算一共有多少条也能分页的办法?
    3.如何保证「1」的语句在不同的情况下都能正常运行?
    4.如果你用了 distinct 的话,如何保证效率?
    5.如果查询语句里有 union 之类的操作的话,该怎么办?
    6.如果信息刷新很频繁,如何解决「第x页的最后一条内容被顶到x+1页的第一条」这个问题?
    7.如何在实现以上几点的情况下做cache?
    8.如何在实现「7」的基础上尽量提高命中率?
    bombless
    bombless
    Jul 26, 2015❤️1
    31
    分页是有套路的,任何人熟悉一下都能写好,要想锻炼自己完全可以把精力放在更有创造力的事情上,分页的时候直接按照套路来就可以了。
    gzxultra
    gzxultra
    Jul 26, 2015
    32
    我以为是内核kernel的分页。。。果然最近kernel源码看多了。。。被拖走
    zjqzxc
    zjqzxc
    Jul 27, 2015
    33
    @scourgen 貌似6的问题大多数人都避而不谈。。被顶到下一页第一个问题不大,一会儿工夫被顶到下一页最后一个这种情况应该就比较悲剧了。
    TangMonk
    TangMonk
    Jul 27, 2015
    34
    @scourgen 第6点求解决方案,如果是android或者ios的话那只有id判断了
    msg7086
    msg7086
    Jul 27, 2015
    35
    gem install will_paginate
    vikeria
    vikeria
    Jul 27, 2015 via Android
    36
    喵的,我第一反应是操作系统内存管理的分页,我愣了一下,卧槽,我好像也没写过,当即伤感了一会……
    Ouyangan
    Ouyangan
    Jul 27, 2015
    37
    哈哈写了三天,能用了...
    cheng007
    cheng007
    Jul 27, 2015
    38
    @vikeria 哈哈,我的第一感觉也是,操作系统的内存管理的分页,话说这玩意,虚拟内存地址到物理地址的映射
    我也没写过,只看过
    aivier
    aivier
    Jul 27, 2015
    39
    嗯,作为一个前端不会分页查询好像也没什么不对啊 =_=
    ZHenJ
    ZHenJ
    Jul 27, 2015
    40
    我的分页是用地址栏参数导航的。。。比你更菜,放心
    zhuangzhuang1988
    zhuangzhuang1988
    Jul 27, 2015
    41
    这还要写?? 库里不是都提供了么???
    server
    server
    Jul 27, 2015
    42
    10年 我的第一份工作 领导linux不会装 php(php5.2.x) iconv ,愣是让我把程序里的iconv 改成了mbstring,
    这找谁说理去。
    flydogs
    flydogs
    Jul 27, 2015
    43
    分页很难的,要考虑sql的优化
    最近就在烦这事
    loading
    loading
    Jul 27, 2015 via Android
    44
    @lincanbin 我写过这个导航,是比较繁琐。
    特别是在点到第4页左右的时候,你要显示第一页,第345页,然后第一1页和第3页中间,是省略还是显示第2页的问题…
    不过安静地写下来就好了。
    Felldeadbird
    Felldeadbird
    Jul 27, 2015❤️1
    45
    我也不会写分页。我也要看先别人的写法,才可以改造。楼主不要灰心。有些东西我们无法创造,但是我们可以站在巨人的肩膀上成功。
    billwang
    billwang
    Jul 27, 2015
    46
    分页一般都是copy改,很多东西网上都有轮子了,不用自己造。
    linxy
    linxy
    Jul 27, 2015
    47
    我认真的找出了自己写内核时关于分页一些笔记,翻出了自己的小内核代码…
    写了几百字!!
    看到有人说是网页的分页……
    又默默地删了……
    wd0g
    wd0g
    Jul 27, 2015
    48
    @likai 敲得少!
    caryxiao
    caryxiao
    Jul 27, 2015
    49
    多写写,多想想就熟了
    raincious
    raincious
    Jul 27, 2015
    50
    @loading

    所以当俺给自己的模板引擎加了个Pagination产生器之后,瞬间感觉生活美好了很多……
    https://github.com/raincious/facula/blob/wip/src/Facula/Unit/Paging/Compiler/Operator/Pager.php#L250
    虽然代码本身是烂的一塌糊涂

    不过就算产生了Pagination Links,缓存仍然是一个问题,所以请教下 @scourgen,如何较好的处理分页内容的缓存(问题7)?
    loading
    loading
    Jul 27, 2015 via Android
    51
    @scourgen 关于信息增加快,可以看看微博的解决方法,同理。
    zhjits
    zhjits
    Jul 27, 2015
    52
    @vikeria 我第一反应也是……
    fengyqf
    fengyqf
    Jul 27, 2015
    53
    找现成的代码直接用吧,码农不是经常自称“搬砖”吗,该搬砖的时候就得当搬运工。
    v3exhao
    v3exhao
    Jul 27, 2015
    54
    参考别人的,多加练习
    realpg
    realpg
    Jul 27, 2015
    55
    分页的轮子造了不计其数个……
    dreamtrail
    dreamtrail
    Jul 27, 2015
    56
    分页本来就不容易写完美,所以我都是用现成的分页模块
    hahasong
    hahasong
    Jul 27, 2015
    57
    @aivier 抓住一个前端妹子
    雷猴,在羊城边度 how do you do
    ybh37
    ybh37
    Jul 27, 2015
    58
    自己从前写到后就好了,后续不管用谁写的分页,都差不多……
    vincenttone
    vincenttone
    Jul 27, 2015
    59
    学而不思或者思而不学,不仅仅是当不了程序员那么简单。
    zouxcs
    zouxcs
    Jul 27, 2015
    60
    是内存的分页么
    scourgen
    scourgen
    Jul 28, 2015❤️2
    61
    既然大家有兴趣,就简单和大家说一下我的经验吧,但肯定不是完整的方案,因为每个case有很多需要注意的点和分支剧情,也要考虑到每个业务的具体场景,讲完整是不可能的。

    @zjqzxc @TangMonk「6」这个问题可以用这个思路,比如内容是以时间排序的,那么就在每次查询的时候自动多带一个参数,也就是用户访问的时间点,并且在翻页的过程中记住这个时间点,在每页的查询语句里设置内容创建的时间要早于这个时间,这样用户不管翻多少页,由于有这个limit在,只要不删数据(即使删数据也可以用每页cache的方法,做到不影响其他页),总的结果集是固定的,所以每页的内容就是固定的。在用户重新进入第一页的时候,这个时间重新计算,这样就可以既不影响翻贴用户的阅读体验,又能够保证用户想看新内容的时候能够看的到。

    当然如果你是做APP之类的瀑布流信息展现方式的话,就用Last_ID之类的方案好了,不过其实瀑布信息流也不应该叫做分页。

    @raincious 「7」和「8」这两个问题和业务场景结合的很深,但总的来说是一个平衡问题,在以下两者之间取得一个平衡:
    1.以每页为cache单位,这样内容一旦增加(例如新增了一条信息在第一页),那所有的cache都应该被清空重建。这个策略在数据刷新很频繁的时候效率最低,在数据变更不频繁的时候效率最高。
    2.以每条内容为cache单位,这样一旦有新数据出现,不会有任何旧的cache被重建,只要每条数据不删不改,cache是可以一直用下去的,所以在数据刷新很频繁的时候效率较高,但这样cache会分布的很散,所以在数据刷新不频繁的时候效率会较低(分支剧情:如果你可以用redis的hmget的话当我没说)。
    两者你都无法接受的话,就可以考虑结合他们的优势,去做group cache,比如每页20条数据,你每10条数据做一个cache,这样悲观情况下取3次就能拿到整页的内容,乐观情况下2次即可,具体group里放数据的数量要根据你的使用场景去订。分支剧情:但如果这样做的话,就要考虑如果数据删除的话,会造成cache不对齐,那这时候你就可以考虑在每个group里前后多加x条数据,这样即使数据有改动,只要不是太频繁,就能做到现有的cache的重复利用。不过这个分支剧情貌似走的人比较少,对逻辑的严密性也比较高,在此只是提一下就不展开了。

    随便写写,一定有错,求别抬杠,求别黑,谢谢。
    final0pro
    final0pro
    Jul 28, 2015
    62
    real time pagination like facebook and twitter is difficult to implement.

    You can find more information here: http://www.sitepoint.com/paginating-real-time-data-cursor-based-pagination/
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4481 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 164ms · UTC 09:19 · PVG 17:19 · LAX 01:19 · JFK 04:19
    ♥ Do have faith in what you're doing.