2013-11-02 37 views
0

我喜欢在基于位置的数据高速缓存(在服务器上)系统中为移动应用程序提供数据。即如果某用户从一个位置请求数据(这对所有来自同一区域的用户都是共同的),我会从数据库中获取值并向他们显示。但是,如果第二个用户在同一位置的下一个5分钟内检索同一页面,那么我不想查询数据库中存在的数百万条记录,如果它存在于文件缓存中,我可以将它们带走。那么现在在PHP中可用的这些东西?基于位置的高速缓存系统

+0

运行你的意思是在同一台计算机上,或只是在相同的位置(比如在同一个IP或东西) – putvande

+0

@putvande在服务器上。所以我可以减少负载到DB,因为它有超过一百万条记录.. – Stranger

+0

我不认为你能够做到这一点。 – putvande

回答

4

我不知道PHP中有这样的事情,但用PHP创建自己的缓存引擎并不难。你需要创建一个缓存目录,并根据你得到的请求来检查你的缓存目录中是否存在与该请求相对应的文件。

例如您的主要参数是lat和long。 假设你得到lat = 123和long = 234(取一些随机值)的请求,你将检查你的缓存文件夹是一个名为123_234.data的文件是否存在。如果存在,则不是查询数据库,而是读取文件并将内容作为输出发送,否则从数据库中读取数据,并在发送响应之前在文件缓存/ 123_234.data中写入该响应。这样您可以稍后再处理文件,而无需再次查询数据库。

挑战:

  1. 时间:缓存会在某些时候或其他到期。因此,在检查文件是否存在的同时,还需要检查上次修改的时间戳以确保缓存未过期。如果缓存在一分钟,十分钟,几小时,几天或几个月内过期,则这取决于您的应用程序要求。
  2. 在这种情况下制作智能缓存文件名称将会具有挑战性,因为即使距离为100米,lat,long组合也会有所不同。一种选择可能是通过设置精度来选择文件名。例如真正的经纬度组合是28.631541,76.945281的形式。您可能想要创建一个名为28.63154_76.94528.data的缓存文件(将精度值降至10位后的5个位置)。这又取决于您是否想要缓存地球上或地理区域上的单个点,以及地理区域,然后是其半径。

我不知道为什么有人投下了这个问题,我相信这是一个非常好的和聪明的问题。有我的upvote :)

+0

真的,我很欣赏你的答案,这是有道理的。 – Stranger

1

如果所有你关心的是查询......一种方法可能是一个数据库表查询结果存储为json或序列化的php对象以及任何你需要匹配位置的字段。

一个cron作业上的任何间隔时间最适合将清除过期的结果

+0

宝贵的答案..但是,当它变得越来越大时,您对性能的看法如何? – Stranger

+0

肯定是一个简单的实施。真的取决于你的后端资源和你想要优化什么 – charlietfl

+0

当我们有更多的用户时,DBs的性能(当它变得巨大时)会再次变得更慢,这使得巨大DB中的检索速度也变慢了吧? – Stranger