introducing system design & news feed system
"DAU
infrastructure
web development"
"4s" analysit
設(shè)計(jì)某個(gè)系統(tǒng)/ 設(shè)計(jì)某個(gè)系統(tǒng)的部分功能(比如限制用戶訪問(wèn)頻率/統(tǒng)計(jì)歷史記錄)
work solution, special case, analysis, tradeoff, knowledge base
"4s" analysis:
scenario, service ,? storage, scale
需要什么?? 將大服務(wù)拆解? 存儲(chǔ)? 升級(jí)
---part 1---
daily active users?
確定有什么功能从撼? login,/ register
user profile display/ edit
storage:
database: sql database => user table
nosql database => Tweets/ social graph
file system: media files
cache: ==> nonpersisitent
程序是算法和數(shù)據(jù)結(jié)構(gòu)/
系統(tǒng)是服務(wù)和數(shù)據(jù)存儲(chǔ)详羡。
merge k sorted arrays
Design user system - database& memcache
design user system
memcached
authentication
sql vs nosql
friendship
how to scale
sharding/ consistent hashing/ replica
用戶系統(tǒng)的特點(diǎn)仍律; 讀非常多, 寫非常少实柠; 要用cache進(jìn)行優(yōu)化
cache 可以理解成java中的hashmap 也是key-value的結(jié)構(gòu)
有哪些常用的cashe系統(tǒng)染苛?
mem-cached不支持?jǐn)?shù)據(jù)持久化
redis(支持?jǐn)?shù)據(jù)持久化)
cache一定存在內(nèi)存中嗎?
不是主到, file system也可以做cache. cpu也有cache.
memcached栗子??
cache.get("this is a key", "this is a value")
cache.get("this is a key")
>>"this is a value"
cache.set("foo", 1, ttl = 60)//存儲(chǔ)60秒, 過(guò)掉就刪了~~
cache.get("foo")
>>1
#wait for 60 seconds
cache.get("foo")
>>null
cache.get("bar")
>>null
memcached怎么優(yōu)化DB的查詢
class UserService:
def getUser(self, user_id):
key = "user::%s" % user_id
用戶是如何實(shí)現(xiàn)登陸和保持登陸的躯概?
用session:
用戶login之后: 創(chuàng)建一個(gè)session對(duì)象登钥, 并且將session_key作為cookie值返回給瀏覽器
瀏覽器再講這個(gè)值記錄在瀏覽器的cookie中, 用戶每次想服務(wù)器發(fā)送的訪問(wèn)娶靡,都會(huì)帶上這個(gè)網(wǎng)站的cookie; 然后服務(wù)器檢測(cè)道cookie中的session_key是有效的牧牢, 就可以登陸,
當(dāng)用戶logout之后:
從服務(wù)器的session table 中刪除對(duì)應(yīng)的數(shù)據(jù):
但是session table存在哪里姿锭?
一般來(lái)講塔鳍, 都可以, 存在cache中呻此, 客戶自己logout; 放在數(shù)據(jù)庫(kù)中轮纫,更好些, 如果
訪問(wèn)的多多話焚鲜, 就用cache做優(yōu)化掌唾。
sql vs no SQL
需要支持transaction的話就不能選擇nosql
noSQL 有很多活動(dòng)都得自己實(shí)現(xiàn);而sql基本上都給我們實(shí)現(xiàn)好了, 比方說(shuō)
serialization忿磅, secondary index and soon
硬盤型的nosql 比 sql 快十倍以上不止糯彬,
sql中的column 是在schema中預(yù)先制定好的, 不可以隨意的天價(jià)
一條數(shù)據(jù)一般是以row為單位取出葱她。
而撩扒,
no-sql中的column 是動(dòng)態(tài)的, 無(wú)限大吨些, 可以隨意添加..
一條數(shù)據(jù)一般是以grid為單位搓谆, row_key + column_key+ value = - 條數(shù)據(jù)。
只需要提前定義column_key本身的格式