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

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

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




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

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

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

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

    不过就算产生了Pagination Links,缓存仍然是一个问题,所以请教下 @scourgen,如何较好的处理分页内容的缓存(问题7)?
    loading
        51
    loading  
       Jul 27, 2015 via Android
    @scourgen 关于信息增加快,可以看看微博的解决方法,同理。
    zhjits
        52
    zhjits  
       Jul 27, 2015
    @vikeria 我第一反应也是……
    fengyqf
        53
    fengyqf  
       Jul 27, 2015
    找现成的代码直接用吧,码农不是经常自称“搬砖”吗,该搬砖的时候就得当搬运工。
    v3exhao
        54
    v3exhao  
       Jul 27, 2015
    参考别人的,多加练习
    realpg
        55
    realpg  
    PRO
       Jul 27, 2015
    分页的轮子造了不计其数个……
    dreamtrail
        56
    dreamtrail  
       Jul 27, 2015
    分页本来就不容易写完美,所以我都是用现成的分页模块
    hahasong
        57
    hahasong  
       Jul 27, 2015
    @aivier 抓住一个前端妹子
    雷猴,在羊城边度 how do you do
    ybh37
        58
    ybh37  
       Jul 27, 2015
    自己从前写到后就好了,后续不管用谁写的分页,都差不多……
    vincenttone
        59
    vincenttone  
       Jul 27, 2015
    学而不思或者思而不学,不仅仅是当不了程序员那么简单。
    zouxcs
        60
    zouxcs  
       Jul 27, 2015
    是内存的分页么
    scourgen
        61
    scourgen  
       Jul 28, 2015   ❤️ 2
    既然大家有兴趣,就简单和大家说一下我的经验吧,但肯定不是完整的方案,因为每个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
        62
    final0pro  
       Jul 28, 2015
    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   ·   Solana   ·   1018 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 183ms · UTC 22:20 · PVG 06:20 · LAX 15:20 · JFK 18:20
    ♥ Do have faith in what you're doing.