- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
注册、登录、查询、用户信息修改,哪个需求量最大?
支持100M DAU。注册,登录,信息修改 QPS 约:
查询QPS约
QPS 与 常用数据存储系统。
用户系统特点:读非常多,写非常少。读多写少的系统一定要使用 Cache 进行优化。
使用缓存,也就会带来数据不一致问题,数据库和缓存是两台机器,两套系统,并不支持加锁。如果是用一些第三方分布式锁,会导致存取效率降低,得不偿失。业界最常用的方法:
database.set(key, user);
cache.delete(key)
class UserService {
def getUser(self, user_id):
key = 'user::%s' % user_id
user = cache.get(user)
if user:
return user
user = db.get(user_id)
cache.set(key, user)
return user
def setUser(self, user):
key = 'user::%s' % user.id
db.set(user)
cache.delete(key)
}
并发情况下依旧会出问题,在getUser执行到如下两行之间时:
另一个进程执行setUser(),cache 里会放入旧数据
问题2:db set 成功,cache delete 失败
但这两种情况发生概率<< cache.delete + db.set。
利用 cache 的 TTL。
任何一个 cache 中的 key 都不要永久有效,设置一个短暂有效时间,如 7 天。则即便在极低概率下出现数据不一致,也就最多不一致7天。即允许数据库和缓存有“短时”不一致,但最终一致。
在每次数据修改的时候,会在 cache 中 delete 这个数据。若写多读少,则此时 cache 没有任何优化效果。
HTTP 协议中浏览器和服务器的沟通机制,服务器把一些用于标记用户身份的信息,传递给浏览器,浏览器每次访问任何网页链接的时候,都会在 HTTP 请求中带上所有的该网站相关的Cookie 信息。Cookie 可理解为一个 Client 端的 hash table。
好友关系的存储与查询
双向好友关系
Twitter、Instagram、微博
存在 SQL****数据库时:
select * from friendship where from_user_id=x
查询x所有的粉丝:
select * from friendship where to_user_id=x;
存在****NoSQL 数据库时:
Friendship:
微信,Facebook,WhatsApp
select * from friendship where smaller_user_id = x or bigger_user_id=x
为何区分 smaller / bigger?
SQL 可以按照这种方案,但NoSQL 很多不支持 Multi-index 不能使用这种方案。
select * from friendship where from_user_id=x
NoSQL 和 SQL 都可按照这种方案
你觉得哪种更好呢?
三层结构的 NoSQL 数据库
• http://www.lintcode.com/problem/mini-cassandra/
Cassandra 的 Key = row_key + column_key,同一个 Key只对应一个 value
将其他需要同时存储的数据,序列化(Serialize)到 value 里进行存储。
Serialization:把一个 object / hash 序列化为一个 string,比如把一棵二叉树序列化
• http://www.lintcode.com/problem/binary-tree-serialization/
又称为 Hash Key, Partition Key。Cassandra 会根据这个 key 算一个 hash 值,然后决定整条数据存储在哪儿。无法 Range Query
常用:user_id
insert(row_key, column_key, value)
任何一条数据,都包含上面三个部分。可指定 column_key 按何排序。
Cassandra 支持这样的“范围查询”:
query(row_key, column_start, column_end)
可以是复合值,如 timestamp + user_id
NoSQL的column是动态的,无限大,可以随意添加
Cassandra 存储Friendship表
Cassandra 存储 NewsFeed
Friendship Table适合什么数据库?
结构化数据,自由创建索引
分布式,Auto-scale,Replica
不同的表单放在不同的数据库。
大部分公司选择了 SQL,因为信任度,Multi-Index!
大部分公司选择了 NoSQL,因为数据结构简单,都是 key-value 的查询/存储需求,NoSQL效率更高!
概述 限流,其基础含义为对流量进行限制,其既包括在速率上的限制,又包括在资源上的限制,这里主要讨论的是对速率进行限制。 本文分为三部分,第一部分中我们将讨论在做限流前必须要弄清的问题: 为什么要去做限
我在一个项目中与两位顾问合作。问题是我们已经到了一个地步,他们都无法达成协议(protocol),而且每个人都提供了不同的方法。 问题是我们有一家商店有四个部门,我们想找到在同一个数据库中与所有部门合
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 2 年前。 Improve this qu
从系统设计/可扩展性的角度来看,在处理需要大量写入数据库中特定表的系统时,有哪些行业标准策略。 为简单起见,假设该表是产品的库存表,有一个“产品名称”列和一个“计数”列,并且每次将新产品购买到系统中时
我需要构建一个 /search API,允许某人发送 POST,并检索稍后可以通过单独的 /results API 查询的 ID。 我查看了 Spring 方法: DeferredResult @As
我是一名优秀的程序员,十分优秀!