善待这是我在StackOverflow上的第一个问题:p。我希望它足够具体。
以下是项目的结构
我的问题是如何构建Android应用和REST API之间的数据同步。以下几点为整个方案带来了清晰度 -
总结一下我的问题,我真正想知道的是,每天每位用户每天约有15-20个请求,每天约有100,000名用户,最好的方法是 -
要展示应用程序的复杂性,请查看下面的模型
这是用户模型
hashT[][], hashS[]
i = rand(), j = rand();
for(int k = i;k < i + lengthOfColumn(p);i++){
if((hashT[i][j + lengthOfRow(p)] - hashT[i][j-1]) != hashP[i]){
//patter does not match.
return false;
}
}
这是书籍模型
var AddressSchema = new Schema({
name: String,
address: String,
mobile: String,
pincode: String,
city: String,
state: String
});
var CartSchema = new Schema({
book: { type: Schema.Types.ObjectId, ref: 'Book' },
quantity: {
type: Number,
default: 1
},
dateAdded: Date
});
var WishlistSchema = new Schema({
book: { type: Schema.Types.ObjectId, ref: 'Book' },
dateAdded: Date
});
var OrderSchema = new Schema({
orderNumber: String,
cart: [CartSchema],
totalAmount: Number,
deliveryCharge: Number,
discountAmount: Number,
address: [AddressSchema],
date: Date,
deliveryDate: Date,
deliveryStatus: String
});
var SellOrderSchema = new Schema({
orderNumber: String,
bookDetails: [{
isbn: String,
title: String,
quantity: {
type: Number,
default: 1
}
}],
address: [AddressSchema],
date: {
type: Date,
default: Date.now()
}
});
var ReceivedOrdersSchema = new Schema({
orderNumber: String,
bookDetails: [{
book: { type: Schema.Types.ObjectId, ref: 'Book' },
quantity: Number,
price: Number
}],
dueDate: Date,
status: {
type: String,
default: 'Pending'
}
});
var CouponSchema = new Schema({
coupon: [{ type: Schema.Types.ObjectId, ref: 'Coupon' }],
used: Number,
totalDiscount: Number
});
var UserSchema = new Schema({
name: String,
email: { type: String, lowercase: true },
role: {
type: String,
default: 'user'
},
hashedPassword: String,
provider: String,
salt: String,
facebook: {},
twitter: {},
google: {},
github: {},
usedCoupons: [CouponSchema],
cart: [CartSchema],
wishlist: [WishlistSchema],
orders: [OrderSchema],
sellOrders: [SellOrderSchema],
addresses: [AddressSchema],
booksToSell: [{ type: Schema.Types.ObjectId, ref: 'Book' }],
receivedOrders: [ReceivedOrdersSchema]
});
还有5-6个其他相互依赖的模型
答案 0 :(得分:0)
静态数据
像UserTable这样的数据大多是静态的,因此您可以将其存储在SQLite(甚至共享首选项)中,以便快速进行本地数据访问。关于书籍(标题,作者等)的存储数据也非常静态(我不认为作者经常改变)因此在SQLite中缓存它很容易和直接。
动态数据
缓存动态数据?很难,没用,但如果你必须使用Volley,它会帮助你很多。 Volley使用Expire
和Last-Modified
等HTTP标记缓存您的回复。您的应用会发送一个包含时间戳的If-Modified-Since
标记的HTTP请求。如果自该时间戳以来服务器中的数据发生了更改,您将收到正常响应。否则,您将收到HTTP 304 Not Modified
,您可以使用旧的缓存数据。在这两种情况下,您的app都会保存当前时间戳并在下次使用。所有这些都是由Volley处理并且对你隐瞒,但知道很有用。你必须弄清楚如何在服务器端处理这个问题。如果您不希望服务器处理多个连接,您可以先显示用户缓存的数据,然后实现一个发送请求的Pull to Request手势。
离线访问
当应用程序无法访问互联网时,Volley为您提供了一个抽象层,但您应该为用户添加一个清晰的视觉指示器,以便他们知道您展示的任何内容都可以在其间。总而言之,您应该根据数据的变化频率划分数据,并根据采用不同的策略进行划分。如果知道,请指定截止期限或截止日期。