Web applications 在服务器上的内存中缓存

Web applications 在服务器上的内存中缓存,web-applications,server-side,Web Applications,Server Side,我想用客户端Javascript和后端服务器(Python)编写web应用程序。客户端经常需要以AJAX方式从服务器获取数据。以DB为单位的数据,每个请求的加载成本都很高 然而,在桌面应用程序中,我只需将数据从数据库加载一次到内存,然后访问它。在web应用程序中-服务器代码每次运行请求,因此我无法执行(每次运行都必须再次从数据库加载到内存)。这怎么行?一个进程可以在服务器上运行吗?或者我必须在这里使用不同的东西吗 一个例子就像stackoverflow for tags上的auto comple

我想用客户端Javascript和后端服务器(Python)编写web应用程序。客户端经常需要以AJAX方式从服务器获取数据。以DB为单位的数据,每个请求的加载成本都很高

然而,在桌面应用程序中,我只需将数据从数据库加载一次到内存,然后访问它。在web应用程序中-服务器代码每次运行请求,因此我无法执行(每次运行都必须再次从数据库加载到内存)。这怎么行?一个进程可以在服务器上运行吗?或者我必须在这里使用不同的东西吗

一个例子就像stackoverflow for tags上的auto complete——如何在服务器中实现快速缓存/加载



我想知道像memcached这样的数据存储是否真的是自动完成的好方法?如何表示部分匹配的键?

看看memcached

我会在服务器上使用键值存储,比如memcache(还有其他的)。这样您就不必多次获取相同的数据(直到数据过期)。速度极快且相当普遍的解决方案(Facebook等使用memcache)。

您可能会看到其他服务器,如twisted,您可以自定义服务器,服务器将数据保存在内存中。例如,如果您有聊天数据,这些数据不需要无限期地持久化,只要有人对新聊天感兴趣,就可以保存在内存中。像twisted这样的服务器可以让你像在桌面应用程序中一样在内存中保存东西。-该站点现在已关闭。

请尝试Redis()

直接从描述中复制:

Redis是一种高级键值存储。它类似于memcached,但数据集不是易失的,值可以是字符串,与memcached中的值完全相同,但也可以是列表、集和有序集。所有这些数据类型都可以通过原子操作进行操作,以推送/弹出元素、添加/删除元素、执行服务器端联合、交集、集合之间的差异等。Redis支持不同种类的排序功能


而且Redis相当快!,110000套/秒,81000套/秒在入门级Linux中。

使用memcache或类似工具

缓存中的每个项都有一个密钥以及到期日期和时间

您需要使密钥对应用程序有用。典型的密钥模型模式是集的Security.Domain.Query.QueryValue,或单个对象的Security.Domain.ID

e、 g

ALL.Product.Q.Red是来自产品域的一组,使用针对所有用户的红色查询

Admin.Product.Q.Blu是一个来自产品域的集合,仅针对管理员用户使用查询Blu

ALL.Customer.O.12345是客户域ID 12345中针对所有用户的单个对象图

如果需要,还可以向键添加格式

因此,当您的web应用程序为自动完成框请求数据时,处理调用的web服务首先从memcache请求数据,如果没有找到或过期,它只会执行昂贵的数据库查询

e、 g.自动完成以查找产品

  • 请求:
  • 服务器生成memcache密钥ALL.Product.Name.gre.json
  • Memcache查询失败
  • 生成SQL查询从名称为“gre%”的产品中选择ID、名称和价格。
  • 将结果格式化为Json
  • 将结果保存到memcache中
  • 将结果返回到浏览器
  • 下次呢

  • 请求:
  • 服务器生成memcache密钥ALL.Product.Name.gre.json
  • Memcache查询成功
  • 将结果返回到浏览器

  • 秘密在于拥有一个密钥模型,该模型适用于所有memcache使用情况,并且不会为不同的问题生成重复密钥。记住在查询参数中对分隔符进行编码(在本例中为“.”)

    使用sql或md5(sql)作为memcached中的键怎么样?您可以随意使用。上面的例子是人为的。我不使用SQL的原因是缓存通常在模型级别,对SQL一无所知。缓存通常是ORM或其上面的一层的功能。它也可以是您服务的一部分(可能需要调用多个模型来构建一个复合对象),同样,这里没有SQL,当然也没有更多关于这个主题的内容。通常,您拥有的基于集合的缓存存储对象的唯一标识符,而不是对象本身。因此,执行一个多缓存请求来填写一个集合请求。这使得频繁更改的数据失效变得简单