PHP+mysql如何实现屏蔽用户的功能?

php中文网
发布: 2016-06-06 20:48:48
原创
1775人浏览过

假设是一个论坛系统,首页显示最新发布的100个主题。另外,每个用户都可以设置自己希望屏蔽的用户,比如A设置了屏蔽B和C,那么A在查看首页的100个主题时就不包含B和C发布的内容。 如何尽量高效的实现?(可以采用缓存机制,但不用Redis)

回复内容:

假设是一个论坛系统,首页显示最新发布的100个主题。另外,每个用户都可以设置自己希望屏蔽的用户,比如A设置了屏蔽B和C,那么A在查看首页的100个主题时就不包含B和C发布的内容。 如何尽量高效的实现?(可以采用缓存机制,但不用Redis)

下面是我的思路,不知道能不能帮到你。

如果以 SQL 语句来筛选,那么对于每个用户这个结果都是不一样的,每个用户都要发生结果不一样的数据库查询,不好做缓存,这个方案不可取。

如果统一取出更多结果(比如 200 个)并缓存待用,显示时剔除用户屏蔽的记录显示给用户,这个对数据库的压力最小,似乎是一个不错的方案。

对于第二个方案会有什么特殊情况呢?

假如很不走运 200 个记录剔除后剩下不到 100 个甚至没了,这种情况是很少发生的(如果发生了,他是有多恨你的论坛。。。)

立即学习PHP免费学习笔记(深入)”;

记住原则就好办:用户计算永远过剩,服务器计算永远不足。

那么办法就出来了:把文章列表按照100为单位切片,请求时对照用户自己的黑名单,发出剔掉了黑帖子之后不足100个的结果。
在客户端最好用JS动态加载。判断一下如果接收到的不足100个,向服务器请求下一个切片,直到最后填满为止。

这个方法也可以用于类似人人和新浪微博那样,无限长加载的带黑名单的列表。

天天团购系统
天天团购系统

天天团购系统是一套强大的开源团购程序,采用PHP+mysql开发,系统内置支付宝、财付通、GOOGLE地图等接口,支持短信发送团购券和实物团购快递发货等;另外可通过Ucenter模块,与网站已有系统无缝整合,实现用户同步注册、登陆、退出。 天天团购系统是一套创新的开源团购程序,拥有多达10项首创功能,同时支持虚拟和实物团购,内置类似淘宝的快递配送体系,并提供强大的抽奖、邀请返利等营销功能,让您轻松

天天团购系统 0
查看详情 天天团购系统

注意,你一旦引入了黑名单,就只能用这种方式滚动加载了。打死也做不到像普通文章列表那样,每一页文章数固定,并能随便跳到后边的某个页数。

因为如果用时间堆(LIMIT分页)如LZ所说查询效率吃不消,每个用户都要花掉O(n^2)的时间;而用空间换时间,把每个用户每一页面的第一篇文章ID存储起来(这样就可以从这篇文章往下查),这也吃不消,因为这就要花掉O(n^2)的空间去存储。

玩过信息学竞赛的就很熟悉了:O(n^2)对于10000以上的规模等同于缴械投降。如果网站够小,也没问题,但线性的数据规模增长,如果带来平方级的计算压力,肯定是个头痛的大问题。

引入功能总是有代价的,说不好哪个功能就会撞到算法的极限,神仙也救不了。

你可以看一下。带黑名单的网站(人人/fb,各微博/twitter)是不是真的全都没有传统分页?

相关标签:
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号