对内存数据库的建议

时间:2011-03-06 09:43:58

标签: database nosql rdbms in-memory-database

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

您会推荐什么解决方案?

8 个答案:

答案 0 :(得分:6)

最简单且使用最广泛的内存中键值存储是MemcacheD。介绍页面会重复您要求的内容:

  

Memcached是一个内存中的键值存储,用于存储来自数据库调用,API调用或页面呈现结果的小块任意数据(字符串,对象)。

客户名单令人印象深刻。这已经很久了。好文档。它几乎适用于所有编程语言的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)

答案 2 :(得分:3)

如果您不介意sql但想要将db保留在内存中,您可能需要查看sqlite(请参阅http://www.sqlite.org/inmemorydb.html)。

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

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

答案 5 :(得分:1)

我不确定这是你在找什么,但你应该研究一个缓存框架(可能包含在你现在使用的工具中)。使用存储库模式,您需要输入数据,然后检查是否按密钥缓存。我没有,你从数据库中获取它,如果你这样做,你从缓存中获取它。

这取决于您正在处理的数据类型,因此由您决定将数据保留在缓存中的时间。滑动超时可能是最好的,因为只要密钥一直被请求,您就会保留数据。这意味着如果缓存有用户数据,一旦用户离开,数据将从缓存中过期。

答案 6 :(得分:0)

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

通常情况下,如果您可以进行分片并且数据访问模式很简单且不会变异太多,则选择Redis。如果您寻找更可靠的东西并支持更高级的数据访问模式,Tarantool是一个不错的选择。

答案 7 :(得分:0)

请看看这个:

http://www.mongodb.org/

它是一个非常好的No-SQL数据库,带有驱动程序并支持所有主要语言。