在我们的网络应用中,我们有分页查询用户帖子的页面。我们通过用户生成的排名(如reddit)对帖子进行排序,该排名可能会随着用户在帖子中进行分页而发生变化。我们正在尝试阻止已经显示的帖子再次被选中。有办法解决这个问题吗?例如,Facebook设法以某种方式执行此操作,其中新帖子不会弄乱您正在滚动的实际查询。
我正在考虑的一些事情可以解决问题,但我不确定是否可行:
当用户在第一页上时,“快照”排名表,只是继续查询此快照中的后续页面。这样订单不会改变,但不确定是否可以做这样的事情。
一次查询大量的帖子,例如500个帖子,只需遍历该结果即可。这可能对用户有用,因为用户不可能一次查看超过500个帖子是不可想象的。但这可能效率很低。但是,如果你在哪里这样做,那么memcache
结果就好了,比如10分钟,并且只是从存储在memcache中的结果中获取帖子(更新数据的延迟应该是10分钟)打扰任何人),这反过来非常有效,因为大多数用户将加载帖子,甚至没有查询数据库。当然,对于我按最新帖子排序的页面,我无法使用此缓存方法,但是更容易设置一个条款以避免重复as detailed here。
3)取消memcache
想法,我当然可以memcache
更小的位数(一次说20个帖子),但这很可能导致重复的帖子。
这或多或少是我们用来在页面上发帖子的当前代码:
$page = $_GET['page']; //getting the page number
if(empty($page)){$page = 1;}
$per_page = 5; //number of posts per page
$pcount = $page*$per_page;
$start_p = ($pcount - $per_page); //offset for sql query
$query = "SELECT p.*
FROM posts as p
INNER JOIN post_rankings as r ON p.ID = r.post_id
ORDER BY r.ranking DESC
LIMIT $per_page OFFSET $start_p";
此代码可以正常获取正确的帖子,但当然它不会考虑订单中可能的移动,因此会给我们重复的帖子。有什么想法吗?