请教,Discuz!论坛中帖子列表中显示的用户信息是怎么获取的?比如一个主题有几十个跟帖,这一页每层楼都要显示不同用户的信息:用户ID、头像、级别、签名等等,这是查询帖子分页列表时关联查过来的,还是只查帖子列表,然后通过ID一个个取的(缓存用户信息,从缓存中取,缓存中没有则从数据库查询单个用户信息)?对于论坛用户用在很多地方,如果把用户放在memcache中,做帖子列表页面就很简单,只查询单表就可以了,然后遇到哪个ID就从缓存中取(缓存中没有时就从数据库取,这里可以封装一下),不知这种做法可行吗?性能是否比关联查询快呢?

解决方案 »

  1.   

    并不能保证安装Discuz!用户的服务器一定有配memcached,因为有客户的空间是租用来的。Discuz!对一些比较热的数据(当前在线用户,他们在浏览哪些贴子之类)是放在mysql的内存表的,也就是临时表。对于帖子列表中显示的用户信息还是需要关联查询,一次性现实在页面上,只不过你看到的那个鼠标挪上去的个人信息面板,默认是隐藏的,用js控制显示/隐藏。没有用到缓存。
      

  2.   

    abcde10565:谢谢,我也只是想了解一下自己的系统,因为觉得关联查询太麻烦,用到用户信息的地方又很多,放缓存是否比关联查询好一些?
    mengxiangbaidu:谢谢,“性能上,要注意的是数据的查询是一回事,数据的合并输出又是一回事”,有点不明白
      

  3.   

    使用redis来存储一些频繁读取的数据,就开始跟上nosql了.
    不管怎么样,你或许都应该知道的是内存的数据读取是最快的.
      

  4.   

    获取帖子列表的时候,找出所有用户id, 比如$ids='1,2,22,45';
    然后再用 uid IN ($ids) 从用户表获取用户信息,比关联查询要优化一些
      

  5.   

    大家觉得用memcache缓存所有用户信息如何?这样所有需要显示用户信息的地方都不用单独查询实现了,只要有用户ID就可获取用户的所有信息,当一个用户信息实时改变时,持久化到数据库的同时更新一下缓存就能保持一致了。这样开发上会简化,基本只取主表信息即可无须关联用户。
      

  6.   

    本帖最后由 PhpNewnew 于 2012-03-15 09:15:31 编辑
      

  7.   

    需要被缓存的对象或数据以key/value对的形式保存在服务器端,每个被缓存的对象或数据都有唯一的标识符key,存取操作通过这个key 进行。保存到 Memcached 中的对象或数据放置在内存中,并不会作为文件存储在磁盘上,所以存取速度非常快。
      

  8.   

    memcache可以分布式部署在多台机器上,应该不占用应用服务器的内存吧,而且用户的数据量不大,我想应该不会有“内存是very Expensive的!”的问题吧。数据库连接的消耗比从memcache中存取大得多,我想性能上应该有好处吧,特别是访问量极大的网站,淘宝级别的,用户信息从数据库关联查询是否不如用缓存好吧。另外就是开发上的好处,只需要关心业务数据表,用户信息对开发者来说是随时可以通过ID获取的,不必写关联,写关联查询时通常只会取该页面用到的属性,每个用到用户信息的页面可能用不同的属性组合,这需要各自实现,不如把所有用户属性都给用户对象一起缓存。