最近我使用Redis.Eval改进了一些代码,效果很好.事实上,这工作得太好了,但我不明白这是怎么回事.
改进的redis代码多次使用Redis.zcard来使用Redis.eval一次.代码的速度提高了100倍(在测试环境中.在实际项目中,速度提高了1000倍以上).我不知道为什么.有人可以解释一下吗?
它做了一个非常简单的任务.它需要一个字符串数组,它是存储在Redis中的ZSET的关键字,并对相应ZSET的大小求和,并返回一个整数值,即和.
为了尽可能多地消除外部变量,我建立了一个简单的测试环境,如下所示.
redis = Redis.new(host: '127.0.0.1', db: 1)
KEYS = 500.times.collect do |i| "KEY#{i}" end
KEYS.each do |key|
redis.zadd(key, 0, "DATA")
end
Run Code Online (Sandbox Code Playgroud)
在我更改代码之前,它的工作原理如下.
sum = 0
KEYS.each do |key|
sum += redis.zcard(key)
end
Run Code Online (Sandbox Code Playgroud)
然后我使用以下单行代码测试了此代码的速度.
t = Time.now; sum=0; KEYS.each do |key| sum += redis.zcard(key) end; puts(Time.now - t)
结果打印出来0.202seconds(202ms)
(请注意我根据测试环境和上面编写的代码计算时间,而不是真实环境)
在我使用Lua脚本和EVAL更改代码之后,它的工作原理如下.
script = "
local sum = 0
for index, key in pairs(KEYS) do
sum = sum + redis.call('zcard', key);
end …Run Code Online (Sandbox Code Playgroud) 所以我在Hive中有一个主表,它将存储我的所有数据.
我希望能够每月加载大量数据数十亿行的增量数据更新.将有新数据和更新的条目.
解决此问题的最佳方法是什么,我知道Hive最近升级并支持更新/插入/删除.
我一直在想的是以某种方式找到将要更新的条目并从主表中删除它们然后只插入新的增量更新.但是在尝试此操作后,插入速度非常快,但删除速度非常慢.
另一种方法是使用update语句执行某些操作以匹配主表和增量更新中的键值并更新其字段.我还没试过这个.这听起来也很痛苦,因为Hive必须逐个更新每个条目.
任何人都有任何想法,如何最有效和最有效地做到这一点?我对Hive和数据库很新.
我们公司有几个产品和几个团队.一个团队负责搜索,并将Elasticsearch标准化为nosql数据库以存储他们的所有数据,并计划稍后使用Neo4j来赞美他们的搜索关系数据.
我的团队负责社交应用程序的产品方面(人们有朋友,为公司工作,并且将与在公司工作的每个人一起成为同事).我们将图dbs视为一种解决方案(在放弃rdbms中n ^ 2关系的燃烧船之后),特别是neo4j(Cypher查询语言是一件很棒的事情).
我们的数据子集与搜索团队使用的数据类似,我们需要确保搜索可以同时搜索他们的数据和数据.搜索团队正在推动我们为我们的db而不是Neo4j或任何图形数据库标准化ElasticSearch.我相信这是为了标准化和一致性.
我们显然来自非常不同的地方,搜索问题与产品问题.他断言ElasticSearch可以涵盖我们的所有用例,包括类似图形的查询以查找建议.虽然这可能是真的,但我真的希望坚持使用Neo4j,并使用ElasticSearch插件与他们的搜索集成.
在这种情况下,对于产品数据库而言,选择ElasticSearch而非Neo4j是否存在任何重大问题(反之亦然)?那些处于类似情况的人的指导方针或轶事?
我有一个问题,想知道如何通过MongoDB中的_id删除文档.我可以通过其他属性删除没问题但我似乎缺少正确的语法删除_id.
我的文档格式如下:
{ "_id" : { "$oid" : "57a49c6c33b10927ff09623e" }, "name" : "Brad" }
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的Java代码:
// Boiler plate
MongoClient client = new MongoClient( "localhost" , 27017 );
MongoDatabase db = client.getDatabase("my-database");
MongoCollection<Document> collection = db.getCollection("my-collection")
// This works
collection.deleteOne(new Document("name", "Brad"));
// This does not work
collection.deleteOne(new Document("_id", "57a49c6c33b10927ff09623e"));
Run Code Online (Sandbox Code Playgroud)
任何人都知道我哪里出错了?
我已经知道MongoDB不支持连接操作,但我必须$lookup使用mapReduce范例模拟(来自聚合框架).
我的两个系列是:
// Employees sample
{
"_id" : "1234",
"first_name" : "John",
"last_name" : "Bush",
"departments" :
[
{ "dep_id" : "d001", "hire_date" : "date001" },
{ "dep_id" : "d004", "hire_date" : "date004" }
]
}
{
"_id" : "5678",
"first_name" : "Johny",
"last_name" : "Cash",
"departments" : [ { "dep_id" : "d001", "hire_date" : "date03" } ]
}
{
"_id" : "9012",
"first_name" : "Susan",
"last_name" : "Bowdy",
"departments" : [ { "dep_id" : "d004", …Run Code Online (Sandbox Code Playgroud) 我想建立一个必须实时回答查询的系统。我将不得不每1小时更新一次数据,并且必须添加大约一百万个文档。我们可以使用弹性搜索还是应该使用nosql?
当并发写入发生时,Cassandra如何保证最终的一致性?
例如,客户端A写入tableA.rowA.colA,同时客户端B写入tableA.rowA.colA.
协调器节点将请求分发给副本节点,例如NodeA NodeB和NodeC.
在NodeA上,ClientA请求首先到达.在NodeB上,ClientB请求首先到达.那么,它会永远不一致吗?
假设我要设计一个系统,用户可以在其中创建帖子,每个帖子都属于一个用户,但一个用户可能有多个帖子。还假设除了要简单地通过postId查找帖子外,我还希望支持查找具有给定userID的所有帖子。我还想存储用户特定的帐户详细信息,例如帐户创建日期。
一种建模方法如下:
CREATE TABLE user (
userId int,
name varchar,
userDetail1,
userDetail2,
...,
PRIMARY KEY(userId)
);
CREATE TABLE post (
postId int,
postDetail1,
postDetail2,
...,
userId int,
PRIMARY KEY(postId)
);
Run Code Online (Sandbox Code Playgroud)
据我所读,这不是最佳方法,因为查询特定用户发表的帖子会导致内存效率低下。它是否正确?这是Cassandra不支持在userId上索引发布表的原因吗?
那么理想的解决方案如下吗?
CREATE TABLE user (
userId int,
name varchar,
userDetail1,
userDetail2,
...,
PRIMARY KEY(userId)
);
CREATE TABLE post (
postId int,
postDetail1,
postDetail2,
...,
userId int,
PRIMARY KEY(postId)
);
CREATE TABLE user_to_post (
userId int,
postId int,
userDetail1,
userDetail2,
...,
postDetail1,
postDetail2,
...,
PRIMARY KEY(userId, postId)
);
Run Code Online (Sandbox Code Playgroud)
使用组合键,查询特定用户的帖子效率更高。但是,采用这种设计,专门为发帖设置表格是否多余?同样,在这种设计中,我希望查找特定用户发布的帖子,并且还希望快速链接到给定帖子的特定用户。我已经读了很多书,但是对于如何在Cassandra中精确设计一对多关系感到非常困惑。
在Cosmos DB文档中,我看到分配一个固定(10GB)集合意味着只会分配一个分区来保存Collection中的文档.
我的问题:如果我选择固定收藏,为什么我仍然会提示选择分区键,如果我只有一个分区?
我的猜测是单个分区指的是单个物理分区,但仍然可以在单个物理分区中存储N个逻辑分区(每个分区由分区键标识).但是如果这是正确的,除了每个分区所需的最小RU/s之外,我认为在无限制分区上选择固定(10GB)分区没有任何优势.
我对MongoDB和Google Cloud Datastore的其中一项微服务感到犹豫。微服务非常容易设置,并且在这两个数据库中没有其他限制是有问题的。
存储的所有文档将包含网页的精简版,其中许多本身超过1MB。这没有我们将计算并添加到文档中的属性和结果。因此,Datasore每个实体(文档)限制为1MB是有问题的(请参阅此处。)
另一方面,我有几个微服务,而且我倾向于尽可能简单地开始。就托管数据库而言,数据存储非常理想:可自动扩展且API很棒。因此,除了这个实体大小限制,这是我的首选。
对于Google数据存储区用户,他们实际上是在执行实体大小限制吗?如果是,您是否知道有任何计划来提高此限制?
google-app-engine mongodb nosql google-cloud-datastore google-cloud-platform