2011-03-06 74 views
5

我想删除我在Web应用程序上加载(几乎)每个请求的小块数据的sql依赖性。大多数数据是键值/文档结构化的,但不排除关系型解决方案。数据不是太大,所以我想保存在内存中以获得更高的可用性。对内存数据库的建议

你会推荐什么解决方案?

+0

你可以分享你正在使用的web堆栈吗? LAMP或.NET还是? – DuckMaestro 2011-03-06 09:48:50

回答

6

最简单和使用最广泛的内存中键值存储是MemcacheD。介绍页面重新迭代你所要求的:

Memcached是从数据库调用,API调用或网页的结果任意小的数据块(字符串,对象)在内存中的key-value存储渲染。

客户名单令人印象深刻。这已经很长时间了。良好的文档。它具有几乎所有编程语言的API。水平缩放非常简单。就我的经验而言,Memcached很好。您可能还想查看MemBase

1

我不确定这是你在找什么,但你应该看看缓存框架(可能包含在你现在使用的工具中的东西)。通过存储库模式,您可以查询数据,然后检查是否通过密钥将其存储在缓存中。我不知道,你从数据库中获取它,如果你这样做,你从缓存中获取它。

这取决于您处理的数据类型,因此您需要决定将数据保存在缓存中需要多长时间。也许滑动超时是最好的,因为只要密钥不断被请求,就会保留数据。这意味着如果缓存具有用户的数据,则一旦用户消失,数据将从缓存中过期。

6

Redis非常适合这种数据。它还支持一些基本的数据结构并提供对它们的操作。

我最近将我的Django论坛应用程序转换成了用于所有实时/跟踪数据的应用程序 - 它非常好,不会再遇到你做这种东西时的恶心感觉(SET views = views + 1以及其他每个页面上的写入查看)与关系数据库。

下面是使用Redis的存储用户活动跟踪所需的数据,包括保持一组有序的最后一次看到用户最新的,在Python的例子:

def seen_user(user, doing, item=None): 
    """ 
    Stores what a User was doing when they were last seen and updates 
    their last seen time in the active users sorted set. 
    """ 
    last_seen = int(time.mktime(datetime.datetime.now().timetuple())) 
    redis.zadd(ACTIVE_USERS, user.pk, last_seen) 
    redis.setnx(USER_USERNAME % user.pk, user.username) 
    redis.set(USER_LAST_SEEN % user.pk, last_seen) 
    if item: 
     doing = '%s <a href="%s">%s</a>' % (
      doing, item.get_absolute_url(), escape(str(item))) 
    redis.set(USER_DOING % user.pk, doing) 
3

如果你不介意的sql但想要将db保存在内存中,则可能需要检出sqlite(请参阅http://www.sqlite.org/inmemorydb.html)。

如果你不想要sql,而且你真的只有键值对,为什么不把它们存储在一个map/hash/associative数组中,并完成它呢?

2

如果最终需要内存数据库,H2是一个非常好的选择。

2

还有一个数据库需要考虑:Berkeley DB。 Berkeley DB允许您将数据库配置为内存,磁盘或两者。它支持键值(NoSQL)和SQL API。 Berkeley DB通常与Web应用程序结合使用,因为它是嵌入式的,易于部署(可随应用程序部署),高度可配置且非常可靠。有几个电子零售网站依靠Berkeley DB为其电子商务应用程序(包括Amazon.com)提供服务。

+2

你应该在这个答案中披露你与BDB的关系。 – user7116 2013-01-21 16:57:17

+1

BerkeleyDB的另一个问题是它的AGPL许可证,这意味着如果你想在你的应用程序中使用它,你必须购买专有许可证或开源应用程序。 – user1876508 2014-06-12 22:57:08

0

你能分解这些数据吗?数据访问模式是否简单且稳定(不随业务需求的变化而变化)?这个数据有多关键(例如,会话上下文不太难恢复,而用户在设置页面上输入的某些偏好不应该丢失)?

通常情况下,只要您可以分片并且您的数据访问模式很简单并且不会突变太多,那么您可以选择Redis。如果您寻找更可靠的产品并支持更先进的数据访问模式,Tarantool是一个不错的选择。