一個軟體是怎麼保存用戶信息的呢?

編程小白一枚。最近在思考一個問題,比如QQ軟體,每個人登錄自己的賬號就可以看到自己的好友列表啊聊天記錄啊甚至每個人屬於自己的獨特的QQ空間。這些內容是怎麼保存的呢?保存在哪裡呢?如果我要設計這麼一個軟體,該如何實現呢?


存在伺服器上


題主你這個問題問得很好啊, 當年我初學編程時,網路不發達,周圍也沒有業內人士,為這個問題卡住了快一年......

我們都知道內存里的數據程序退出了就沒了,那顯然保存數據要存到硬碟里,Ok,程序退出時存一下,啟動時讀一下就行了,這是最單純的方法.

可是仔細想想就不對了,存到硬碟的什麼地方呢?

拿windows舉例好了,存C盤? 你怎麼知道用戶一定有C盤的? 萬一人家系統盤裝到D盤了呢?

那存到從系統API讀出來的第一個盤? 你咋知道那是張軟盤還是一塊硬碟?

聰明的你一定想到辦法了, 一般我們有兩個選擇:

1.往註冊表裡存.

2.往程序安裝目錄里存.

3.往一些莫名其妙但是一定會存在的目錄存...

這幾個方法是早年間程序們最愛用的方法, 你windows系統總得有註冊表吧? 既然你能打開我這程序那你安裝目錄一定存在吧? ok,我就往這兩個地方存.

這樣的結果就是存的亂七八糟,各種軟體到處存,搞的文件一堆一堆烏煙瘴氣.

而且這樣還有更壞的事,那就是許可權問題難以解決, 憑什麼就往安裝路徑里存? 操作系統可不知道你是要遊戲存檔還是病毒惡意軟體篡改數據.

現如今操作系統已經強化了許可權控制,程序們不是隨便就能動某個目錄的,比如windows上的UAC,

在你往一些敏感路徑寫東西的時候是要報警的.現在操作系統會給你一個API,通過調用它可以獲得系統針對應用程序的存儲需求而提供的特定路徑,這個路徑一般都存在(不存在的話這哥們的電腦也離重裝不遠了),而且程序可以隨便存取.

ok,那麼現在假設你做了一款叫OO的聊天軟體,把好友數據全部存到了本地. 那麼馬上你就會接到用戶來電,說自己換了台電腦好友全沒了!

這是多麼可怕的事情啊,但其實這種事以前不是沒有,QQ的聊天記錄曾經就是完全存本地的,換台電腦忘了拷貝, 前女友聊天記錄? Gone! 工作記錄? Gone!

那麼怎麼辦呢? 現在網速這麼快,很多軟體都直接把數據存到自己伺服器了?這樣即使你換台電腦,只要正常登陸賬號,你的配置文件什麼的就全回來了.


qq這類給你用的 都是客戶端。與客戶端相對的是伺服器端 伺服器端也是寫好的程序,它負責將客戶信息存在資料庫中。

所以客戶最終信息是存在資料庫中的


題主其實你思考多一會應該就能想出來,把大家的數據都發送到同一台不關機不斷網的電腦上就可以了,要用的時候都去那裡取。


和石器時代差不多,我們一般刻在石頭上,不過是用電子刻的 二進位形式。

輪子哥沒節操 這種問題都頂上去了


你註冊的時候,賬戶生成一個獨有ID保存在資料庫中,登陸的時候,匹配資料庫,如果你的賬戶存在,獲取你的ID保存在服務區session裡面,你所屬的空間,朋友,都是和你個人ID關聯的,根據這個ID就能查出是有和你相關的信息

註冊的時候,賬號提交到後台,保存在資料庫的用戶表裡面:

得到你唯一身份識別id。

當你再次登錄的時候,賬號密碼再次提交查詢資料庫user表匹配:

info = select 『龍傲天』 from user;
//判斷該用戶是否存在
if(info == true) {
//如果存在 跳轉到qq頁面,並且保存查詢出的該用戶id到伺服器session("id"),作為你的唯一身份識別,長期登錄的話會保存在本地cookie;
}else{
//如果不存在,提示賬號錯誤等信息; }
空間表,和好友表都是和你id相關聯的:

好友表

空間表

都會根據你的session(id)查出此id對應的好友和內容,還有評論,會員等其他的表也是同一個道理


你難道不知道客服這個東西嗎?

比如這個帶耳機的企鵝,它並不是在聽歌,也不是在學英語。

它其實就是在記憶用戶信息

你可不要小看這麼小的一個企鵝,它不僅記憶能力好,而且有各種變化功能。

那麼企鵝為什麼會有這麼強的記憶能力呢?既能記住你的好友,也能記住你的聊天記錄,甚至還能記住標點符號。

從上面的圖案你應該發現了懷疑的地方,不管它怎麼變,不管氣候多炎熱,這個企鵝老是圍一個圍巾。

沒錯,記憶的秘訣就是這個圍巾

這個圍巾就和機器貓的口袋一樣,只有帶了這條圍巾,再笨的人也會變成高手,不管演技技能,語言技能,記憶技能通通加成,比如:


實名反對輪子哥,這些信息都是存在硬碟上!


原來QQ還能保存用戶信息啊,不都是每次用的時候註冊一個么


輪子哥已經簡要的給你回答了,但是也太簡略了有沒有 以至於我估計答主你看完了還是一臉懵逼。所以我給你稍微補充一下吧

用戶的數據確實是存在伺服器上,答主你可以想一下,如果是你做程序你如何長期存儲這些信息?

你可能第一想法是弄個文本文件存著吧!大不了第一行寫名字,第二行寫出生日期啊,第三行寫QQ號碼啊這樣以此類推吧啦吧啦…

最後軟體需要顯示這些信息的時候就到文件里來讀取嘛!讀進來就是字元串解析一下就可以啦!

嗯嗯,這確實是一種實現方法,而且很多軟體初期就這麼搞的。但是後來發現用戶數量上去以後,或者用戶信息複雜以後,這樣就不行啦,一個是讀取文件速度特別慢,第二是查找特別慢每次都要全體遍歷一下累死程序有沒有,再者管理文件也很麻煩,不能太大啦,同時多個線程同時讀寫也有問題啦等等。而且這個東西好多軟體都會用,沒必要大家都做一套這玩意吧太浪費了

因此,資料庫就應運而生啦,你可以把資料庫看成一個高度強大的記錄本,不管是寫入用戶信息或者讀取啊查找啊都非常強大,還有很多複雜的查找能力而且特別快。這樣就好辦啦,像QQ這種軟體,他們就可以在總部放一個伺服器也就是性能強大的電腦啦,上面跑著資料庫框架等程序,來了用戶信息他們就往資料庫里存存存(可能存入到一種叫磁碟陣列伺服器的裡面,存儲能力很強大)

嗯,大體上,就是這樣。我不是做資料庫的,大體框架是這樣,細節可能有出入


學習要循序漸進,不要一上來就想做個qq那樣的軟體,比如先學c語言


我進來是為了吐槽輪子哥的。

這種問題百度一下就可以嘛。

等等。

是不是

應該

必應一下?


JAVA序列化與反序列化,在百度上搜一搜就看到了,C語言帶file的函數,或者從存儲地方來講遠程存儲和本地存儲


你所下載的都是軟體客戶端,你的信息都通過互聯網傳到軟體的伺服器端被保存起來,這就是現在的client-server模式。


數據持久化 ~


大神都有點不屑哇,同是小白來回答下,所有的數據都在磁碟上。因為硬碟可以持久化存儲我們的數據,相反內存不行,內存一旦掉電,數據會丟失

對於使用電腦的你,看見的文件,比如在電腦上添加文件,刪除文件,用編輯器寫code,這一切的數據都是os的文件系統將磁碟上的數據進行抽象,方便你進行可視化的管理和操作。

而對於我們的應用,這種抽象是資料庫完成的,它將我們的數據進行抽象,組織,形成應用方便操作的對象,比如用一張表來完成數據的記錄,比如根據你的id,用戶名,密碼,生日等等記錄信息,資料庫會將應用的邏輯操作對應到磁碟上,如應用要添加一條記錄,刪除一條記錄,那麼應用會操作資料庫往磁碟上添加一條信息和刪除一條信息。

資料庫一邊負責識別出不同類型應用所做的邏輯操。一邊進行將數據的添加,刪除,更改等操作寫入到磁碟中。因為應用運行在內存中,其實資料庫也是一種運行在內存中的應用,只是它起到了更好的組織數據,抽象數據,以及盡量保證將數據寫入到磁碟中不會出錯。

要實現這麼個應用,你需要學會使用資料庫,以及用你的應用去操作資料庫。


資料庫


寫在紙上。


推薦閱讀:

有哪些開源後煥發新生甚至走向輝煌的項目?
為什麼 Apple 開發為時四年的 Swift 語言項目保密做得那麼好?
計算機專業,軟體工程你們都考什麼證?哪些很重要?
Github的方法與哲學是什麼?跟歷來的開源思想有什麼不一樣的地方?
如果世界上所有軟體消失,要怎麼做,才能讓一台電腦正常運行起來?

TAG:軟體 | 軟體開發 |