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