本申請涉及計算機領域,尤其是涉及一種數據存儲方法及裝置。
背景技術:
:在很多應用場景中,都會對用戶行為數據進行累積存儲。這些用戶行為數據可以體現用戶的歷史操作行為,使用這些用戶行為數據可以分析用戶行為(例如統計一個用戶在一個小時內登錄了幾次網站、統計一個IP在一天內支付的金額有多少等等),進而提供更優質的服務(例如,判斷用戶的操作是否存在業務風險等)。目前針對這一需求,主要是通過存儲明細流水或存儲累積帳的方式實現。然而,這些方式不僅對數據庫服務器、網絡等性能要求較高,而且響應速度較慢。技術實現要素:本申請的目的在于提供一種數據存儲方法及裝置,其可在存儲數據精度不變的情況下,優化數據庫的存儲、讀取性能。為實現上述申請目的之一,本申請一實施方式提供了一種數據存儲方法,所述方法包括:將同一維度的用戶行為數據進行每日匯總、每小時匯總后,存儲每日匯總數據和每小時匯總數據至第一存儲結構中,其中,所述第一存儲結構將每小時匯總數據與時間對應的每日匯總數據之間建立關聯關系;將與每日匯總數據和每小時匯總數據同一維度的用戶行為數據按照每分鐘、每秒鐘匯總后,存儲每分鐘匯總數據和每秒鐘匯總數據至第二存儲結構中,其中,所述第二存儲結構將每秒鐘匯總數據與時間對應的每分鐘匯總數據之間建 立關聯關系。作為本申請一實施方式的進一步改進,所述第一存儲結構包括多條數據串,每條數據串由時間窗組成,且每條數據串的時間窗分別對應存儲一個每日匯總數據及與該每日匯總數據時間對應的一個或多個每小時匯總數據;所述第二存儲結構包括多條數據串,每條數據串由多個時間窗組成,且每條數據串的多個時間窗分別對應存儲一個每分鐘匯總數據及與該每分鐘匯總數據時間對應的一個或多個每秒鐘匯總數據。作為本申請一實施方式的進一步改進,所述第一存儲結構為第一存儲表,所述第一存儲表的列/行包括一列/行每日匯總數據,以及與每日匯總數據時間對應的多列/行每小時匯總數據;所述第二存儲格式為第二存儲表,所述第二存儲表的列/行包括一列/行每分鐘匯總數據,以及與每分鐘匯總數據時間對應的多列/行每秒鐘匯總數據。作為本申請一實施方式的進一步改進,所述方法還包括:為每一數據串配置一唯一的時間戳。作為本申請一實施方式的進一步改進,所述方法還包括:若某列/行上所有時間窗的存儲數值都為0,則不存儲該列/行。作為本申請一實施方式的進一步改進,所述方法還包括:當獲取到新的用戶行為數據時,同步更新與當前時間匹配的每秒鐘匯總數據、每分鐘匯總數據、每小時匯總數據,以及每日匯總數據。為實現上述申請目的之一,本申請一實施方式提供了一種數據存儲裝置,所述裝置包括:數據存儲格式模塊,用于將每小時匯總數據與時間對應的每日匯總數據之間建立關聯關系形成第一存儲結構,以及將每秒鐘匯總數據與時間對應的每分鐘匯總數據之間建立關聯關系形成第二存儲結構;數據邏輯存儲模塊,用于將同一維度的用戶行為數據進行每日匯總、每小時匯總后,將每日匯總數據和每小時匯總數據存儲至第一存儲結構中,以及將與每日匯總數據和每小時匯總數據同一維度的用戶行為數據按照每分鐘、每秒 鐘匯總后,將每分鐘匯總數據和每秒鐘匯總數據存儲至第二存儲結構中。作為本申請一實施方式的進一步改進,所述第一存儲結構包括多條數據串,每條數據串由時間窗組成,且每條數據串的時間窗可分別對應存儲一個每日匯總數據及與該每日匯總數據時間對應的一個或多個每小時匯總數據;所述第二存儲結構包括多條數據串,每條數據串由時間窗組成,且每條數據串的時間窗分別對應存儲一個每分鐘匯總數據及與該每分鐘匯總數據時間對應的一個或多個每秒鐘匯總數據。作為本申請一實施方式的進一步改進,所述第一存儲結構為第一存儲表,所述第一存儲表的列/行包括一列/行每日匯總數據,以及與每日匯總數據時間對應的多列/行每小時匯總數據;所述第二存儲格式為第二存儲表,所述第二存儲表的列/行包括一列/行每分鐘匯總數據,以及與每分鐘匯總數據時間對應的多列/行每秒鐘匯總數據。作為本申請一實施方式的進一步改進,所述裝置還包括:標識模塊,用于為每一數據串配置一唯一的時間戳。作為本申請一實施方式的進一步改進,所述數據邏輯存儲模塊還用于:若某列/行上所有時間窗的存儲數值都為0,則不存儲該列/行。作為本申請一實施方式的進一步改進,所述裝置還包括:更新模塊,用于當獲取到新的用戶行為數據時,驅動第一邏輯存儲模塊和第二邏輯存儲模塊同步更新與當前時間匹配的每秒鐘匯總數據、每分鐘匯總數據、每小時匯總數據,以及每日匯總數據。相對于現有技術,本申請的技術效果在于:通過本申請的數據存儲方法及裝置,可優化對用戶行為數據的存儲結構,以在對累積的用戶行為數據進行查詢/讀取/統計時,減少對數據庫的訪問次數,優化數據庫的存儲、讀取性能,提高響應速度。附圖說明圖1是本申請一實施方式中數據存儲方法的流程圖;圖2a是本申請一實施方式中第一存儲結構示意圖;圖2b是本申請一實施方案中第二存儲結構示意圖;圖3是本申請一實施方式中數據存儲裝置的模塊圖。具體實施方式以下將結合附圖所示的具體實施方式對本申請進行詳細描述。但這些實施方式并不限制本申請,本領域的普通技術人員根據這些實施方式所做出的結構、方法、或功能上的變換均包含在本申請的保護范圍內。對用戶行為數據的統計分析,一般是隨著業務的變化而變化的,可能隨時增加、修改統計的維度、統計的數據量等,因此,普遍使用沒有架構的數據庫(例如HBase數據庫)存儲累積的用戶行為數據。如圖1所示,在本申請一實施方式中,所述數據存儲方法,包括:S100、將同一維度的用戶行為數據進行每日匯總、每小時匯總后,存儲每日匯總數據和每小時匯總數據至第一存儲結構中,其中,所述第一存儲結構將每小時匯總數據與時間對應的每日匯總數據之間建立關聯關系;S200、將與每日匯總數據和每小時匯總數據同一維度的用戶行為數據按照每分鐘、每秒鐘匯總后,存儲每分鐘匯總數據和每秒鐘匯總數據至第二存儲結構中,其中,所述第二存儲結構將每秒鐘匯總數據與時間對應的每分鐘匯總數據之間建立關聯關系。本實施方式中所謂的同一維度,表示需要累積的用戶行為數據所表示的意義相同。例如,所累積的用戶行為數據的維度可以是一段時間內登陸網站的數量;也可為一段時間內的支付金額等。以下,將以一段時間內的支付金額這個維度作為示例,對本申請技術方案進行詳細說明。在本實施方式中,累積存儲的用戶行為數據可存儲于用戶行為數據庫(例如HBase數據庫)內,其包括第一存儲結構和第二存儲結構。其中,將每日匯總數據和每小時匯總數據存儲到第一存儲結構中。將每分鐘匯總數據和每秒鐘匯總數據存儲到第二存儲結構中。進一步地,在本實施方案中,所述第一存儲結構包括多條數據串,每條數據串由時間窗組成,且每條數據串的時間窗可分別對應存儲一個每日匯總數據及與該每日匯總數據時間對應的一個或多個每小時匯總數據;所述第二存儲結構包括多條數據串,每條數據串由多個時間窗組成,且每條數據串的多個時間窗可分別對應存儲一個每分鐘匯總數據及與該每分鐘匯總數據時間對應的一個或多個每秒鐘匯總數據。參圖2a的示意,所述第一存儲結構包括3條數據串,每條數據串由D、H0、H1、……H23,一共25個時間窗組成,其中,D表示的時間窗可存儲每日匯總數據;H0、H1……H23表示的當日下24個小時(從0點到23點)的時間窗可存儲對應的每小時匯總數據。可以理解的是,在一條數據串中,H0、H1……H23時間窗內存儲數據的總值,等于D時間窗內存儲數據的值。參圖2b的示意,所述第二存儲結構包括3條數據串,每條數據串由M、S0、S1、……S59,一共61個時間窗組成,其中,M表示的時間窗可存儲每分鐘匯總數據;S0、S1……S59表示的一分鐘下60秒(從0秒到59秒)的時間窗可存儲對應的每秒鐘匯總數據。可以理解的是,在一條數據串中,S、S1……S59時間窗內存儲數據的總值,等于M時間窗內存儲數據的值。進一步地,所述方法還包括:為每一數據串配置一唯一的時間戳。在本實施方式中,所述第一存儲結構可為第一存儲表,所述第一存儲表的列包括一列每日匯總數據,以及與每日匯總數據時間對應的多列每小時匯總數據。參圖2a所示,所述第一存儲表可以rowkey為主體(例如ID信息),第一列數據可為每日匯總數據,接下來24列數據可為每小時匯總數據,當然也可是1~24列數據為每小時匯總數據,第25列數據為每日匯總數據,本領域技術人員可根據慣用手段變化該順序。另外,為每一數據串配置的唯一時間戳(timestamp,簡寫ts)可為該數據串當天的日期,以識別該數據串是哪一天的用戶行為數據。所述第二存儲結構可為第二存儲表,所述第二存儲表的列包括一列每分鐘匯總數據,以及與每分鐘匯總數據時間對應的多列每秒鐘匯總數據。參圖2b所示,所述第二存儲表可以rowkey為主體(例如ID信息)+小時(例如相應用戶 行為數據發生的時間,精確到小時),第一列數據為每分鐘匯總數據,接下來60列數據為每秒鐘匯總數據,當然也可是1~60列數據為每秒鐘匯總數據,第61列數據為每分鐘匯總數據,本領域技術人員可根據慣用手段變化該順序。另外,為每一數據串配置的唯一時間戳(timestamp,簡寫ts)可為該數據串當前的分鐘時間,以識別該數據串是哪一分鐘的用戶行為數據。當然,在本實施方式中,還可以將上述的列替換為行,以實現基本相同的第一存儲結構和第二存儲結構:所述第一存儲格式為第一存儲表,所述第一存儲表的行包括一行每日匯總數據,以及與每日匯總數據時間對應的多行每小時匯總數據;所述第二存儲格式為第二存儲表,所述第二存儲表的行包括一行每分鐘匯總數據,以及與每分鐘匯總數據時間對應的多行每秒鐘匯總數據。具體示意可由圖2a、圖2b,以及上述對第一/第二存儲表列的描述毫無疑義的推導得出,在此不再贅述。進一步地,在本實施方式中,由于第一存儲表和第二存儲表的列數據是動態的,因此所述方法還包括:若某列/行上所有時間窗的存儲數值都為0,則不存儲該列/行。由此可以節省很多存儲空間。以下通過一具體示例進行說明:假設獲取到ID信息為2088xx1的用戶在下述時間內分別進行了3次支付:在2015010101:00:01秒支付3元;在2015010101:00:12秒支付5元;在2015010102:32:12秒支付2元。那么,在第一存儲格式中存儲的數據為:rowkeytimestampDH1H22088xx12015010110元8元2元在第二存儲格式中存儲的數據為:rowkeytimestampMS1S122088xx1_20150101‐012015010101:00分8元3元5元2088xx1_20150101‐022015010102:32分2元空2元從上述示例中可毫無疑義的發現,因為2015010101:00:01至2015010101:00:12對應的時間窗的存儲數值為0,且2015010102:32:00至2015010102:32:12對應的時間窗的存儲數值也為0,故不存儲S2~S11列。當然,上述示例是通過列的方式存儲每日匯總數據、每小時匯總數據、每分鐘匯總數據、每秒鐘匯總數據,本領域技術人員也可將其用在行的方式存儲每日匯總數據、每小時匯總數據、每分鐘匯總數據、每秒鐘匯總數據中,在此不再贅述。進一步地,在本實施方式中,當獲取到新的用戶行為數據時,同步更新與當前時間匹配的每秒鐘匯總數據、每分鐘匯總數據、每小時匯總數據,以及每日匯總數據。仍然以上面的示例繼續進行說明:如果ID信息為2088xx1的用戶在2015010102:32:12又進行了7元的一筆支付,則需要更新2015010102:32:12的每秒鐘匯總數據,2015010102:32的每分鐘匯總數據,2015010102時的每小時匯總數據,20150101的每日匯總數據。更新后的數據如下:在第一存儲格式中存儲的數據為:rowkeytimestampDH1H22088xx12015010117元8元9元在第二存儲格式中存儲的數據為:rowkeytimestampMS1S122088xx1_20150101‐012015010101:00分8元3元5元2088xx1_20150101-022015010102:32分9元空9元以下將具體說明采用上述方式累積用戶行為數據后,對用戶行為數據進行 查詢的過程:對用戶行為數據進行查詢時,可以根據查詢的時間范圍進行劃分,并分時間片進行查詢獲取得到數據。例如,要統計用戶2088xx1從2014112512:35:09到2014112815:35:09的支付金額。那么:S1、查詢第二存儲表,rowkey=2088xx1_20141125-12并且ts為2014112512:35分到2014112512:59分的數據。由此可以計算得到2014112512:35:09至2014112512:59:59的數據。S2、查詢第一存儲表,rowkey=2088xx1并且ts為20141125到20141128的數據。由此可以計算得到2014112513:00:00到2014112815:00:00的數據。S3、查詢第二存儲表,rowkey=2088xx1_20141128-15并且ts為2014112815:00分到2014112815:35分的數據。由此可以計算得到2014112815:00:00到2014112815:35:09的數據。將以上三步計算得到的數據匯總,即可獲得到用戶2088xx1從2014112512:35:09到2014112815:35:09的支付金額。可以理解的是,對于任意時間開始至任意時間結束的數據,只需要最多三次查詢用戶行為數據庫,就可以得到精度到秒累積數據。同時由于將每秒鐘匯總數據、每分鐘匯總數據與每小時匯總數據、每日匯總數據分開存儲,相對于現有技術,查詢到的數據量將大大減少,效率有很大提高。另外,對于查詢從任意時間開始到當前時間結束的數據,由于當前時間的匯總數據就是當前時間對應的每日匯總數據,因此只需要上述S1、S2步驟,即可查詢得到。因此,只需要兩次查詢用戶行為數據庫即可得到精度到秒的累積數據。如圖3所示,在本申請一實施方式中,所述數據存儲裝置,包括用戶行為數據庫20,所述用戶行為數據庫20包括:數據存儲格式模塊201,用于將每小時匯總數據與時間對應的每日匯總數據之間建立關聯關系形成第一存儲結構,以及將每秒鐘匯總數據與時間對應的每分鐘匯總數據之間建立關聯關系形成第二存儲結構;數據邏輯存儲模塊203,用于將同一維度的用戶行為數據進行每日匯總、每小時匯總后,將每日匯總數據和每小時匯總數據存儲至第一存儲結構中,以及將與每日匯總數據和每小時匯總數據同一維度的用戶行為數據按照每分鐘、每秒鐘匯總后,將每分鐘匯總數據和每秒鐘匯總數據存儲至第二存儲結構中。本實施方式中所謂的同一維度,表示需要累積的用戶行為數據所表示的意義相同。例如,所累積的用戶行為數據的維度可以是一段時間內登陸網站的數量;也可為一段時間內的支付金額等。以下,將以一段時間內的支付金額這個維度作為示例,對本申請技術方案進行詳細說明。在本實施方式中,累積的用戶行為數據可存儲于用戶行為數據庫20(例如HBase數據庫)內,其包括第一存儲結構和第二存儲結構。其中,將每日匯總數據和每小時匯總數據存儲到第一存儲結構中。將每分鐘匯總數據和每秒鐘匯總數據存儲到第二存儲結構中。進一步地,在本實施方案中,所述第一存儲結構包括多條數據串,每條數據串由時間窗組成,且每條數據串的時間窗可分別對應存儲一個每日匯總數據及與該每日匯總數據時間對應的一個或多個每小時匯總數據;所述第二存儲結構包括多條數據串,每條數據串由多個時間窗組成,且每條數據串的多個時間窗可分別對應存儲一個每分鐘匯總數據及與該每分鐘匯總數據時間對應的一個或多個每秒鐘匯總數據。參圖2a的示意,所述第一存儲結構包括3條數據串,每條數據串由D、H0、H1、……H23,一共25個時間窗組成,其中,D表示的時間窗可存儲每日匯總數據;H0、H1……H23表示的當日下24個小時(從0點到23點)的時間窗可存儲對應的每小時匯總數據。可以理解的是,在一條數據串中,H0、H1……H23時間窗內存儲數據的總值,等于D時間窗內存儲數據的值。參圖2b的示意,所述第二存儲結構包括3條數據串,每條數據串由M、S0、S1、……S59,一共61個時間窗組成,其中,M表示的時間窗可存儲每分鐘匯總數據;S0、S1……S59表示的一分鐘下60秒(從0秒到59秒)的時間窗可存儲對應的每秒鐘匯總數據。可以理解的是,在一條數據串中,S、S1……S59時 間窗內存儲數據的總值,等于M時間窗內存儲數據的值。進一步地,所述用戶行為數據庫20還包括標識模塊205,其用于為每一數據串配置一唯一的時間戳。在本實施方式中,所述第一存儲結構可為第一存儲表,所述第一存儲表的列包括一列每日匯總數據,以及與每日匯總數據時間對應的多列每小時匯總數據。參圖2a所示,所述第一存儲表可以rowkey為主體(例如ID信息),第一列數據可為每日匯總數據,接下來24列數據可為每小時匯總數據,當然也可是1~24列數據為每小時匯總數據,第25列數據為每日匯總數據,本領域技術人員可根據慣用手段變化該順序。另外,為每一數據串配置的唯一時間戳(timestamp,簡寫ts)可為該數據串當天的日期,以識別該數據串是哪一天的用戶行為數據。所述第二存儲結構可為第二存儲表,所述第二存儲表的列包括一列每分鐘匯總數據,以及與每分鐘匯總數據時間對應的多列每秒鐘匯總數據。參圖2b所示,所述第二存儲表可以rowkey為主體(例如ID信息)+小時(例如相應用戶行為數據發生的時間,精確到小時),第一列數據為每分鐘匯總數據,接下來60列數據為每秒鐘匯總數據,當然也可是1~60列數據為每秒鐘匯總數據,第61列數據為每分鐘匯總數據,本領域技術人員可根據慣用手段變化該順序。另外,為每一數據串配置的唯一時間戳(timestamp,簡寫ts)可為該數據串當前的分鐘時間,以識別該數據串是哪一分鐘的用戶行為數據。當然,在本實施方式中,還可以將上述的列替換為行,以實現基本相同的第一存儲結構和第二存儲結構:所述第一存儲格式為第一存儲表,所述第一存儲表的行包括一行每日匯總數據,以及與每日匯總數據時間對應的多行每小時匯總數據;所述第二存儲格式為第二存儲表,所述第二存儲表的行包括一行每分鐘匯總數據,以及與每分鐘匯總數據時間對應的多行每秒鐘匯總數據。具體示意可由圖2a、圖2b,以及上述對第一/第二存儲表列的描述毫無疑義的推導得出,在此不再贅述。進一步地,在本實施方式中,由于第一存儲表和第二存儲表的列數據是動 態的,因此,所述數據邏輯存儲模塊203還用于:若某列/行上所有時間窗的存儲數值都為0,則不存儲該列/行。由此可以節省很多存儲空間。以下通過一具體示例進行說明:假設獲取到ID信息為2088xx1的用戶在下述時間內分別進行了3次支付:在2015010101:00:01秒支付3元;在2015010101:00:12秒支付5元;在2015010102:32:12秒支付2元。那么,在第一存儲格式中存儲的數據為:rowkeytimestampDH1H22088xx12015010110元8元2元在第二存儲格式中存儲的數據為:rowkeytimestampMS1S122088xx1_20150101‐012015010101:00分8元3元5元2088xx1_20150101‐022015010102:32分2元空2元從上述示例中可毫無疑義的發現,因為2015010101:00:01至2015010101:00:12對應的時間窗的存儲數值為0,且2015010102:32:00至2015010102:32:12對應的時間窗的存儲數值也為0,故不存儲S2~S11列。當然,上述示例是通過列的方式存儲每日匯總數據、每小時匯總數據、每分鐘匯總數據、每秒鐘匯總數據,本領域技術人員也可將其用在行的方式存儲每日匯總數據、每小時匯總數據、每分鐘匯總數據、每秒鐘匯總數據中,在此不再贅述。進一步地,在本實施方式中,所述用戶行為數據庫20還包括更新模塊207,所述更新模塊用于當獲取到新的用戶行為數據時,同步更新與當前時間匹配的每秒鐘匯總數據、每分鐘匯總數據、每小時匯總數據,以及每日匯總數據。仍 然以上面的示例繼續進行說明:如果ID信息為2088xx1的用戶在2015010102:32:12又進行了7元的一筆支付,則需要更新2015010102:32:12的每秒鐘匯總數據,2015010102:32的每分鐘匯總數據,2015010102時的每小時匯總數據,20150101的每日匯總數據。更新后的數據如下:在第一存儲格式中存儲的數據為:rowkeytimestampDH1H22088xx12015010117元8元9元在第二存儲格式中存儲的數據為:rowkeytimestampMS1S122088xx1_20150101‐012015010101:00分8元3元5元2088xx1_20150101-022015010102:32分9元空9元綜上所述,通過本申請的數據存儲方法及裝置,可優化對用戶行為數據的存儲結構,將每秒鐘匯總數據、每分鐘匯總數據與每小時匯總數據、每日匯總數據分開存儲,以在對累積的用戶行為數據進行查詢/讀取/統計時,減少對數據庫的訪問次數,優化數據庫的存儲、讀取性能,提高響應速度。所屬領域的技術人員可以清楚地了解到,為描述的方便和簡潔,上述描述的裝置,裝置和模塊的具體工作過程,可以參考前述方法實施方式中的對應過程,在此不再贅述。在本申請所提供的幾個實施方式中,應該理解到,所揭露的裝置,裝置和方法,可以通過其它的方式實現。例如,以上所描述的裝置實施方式僅僅是示意性的,例如,所述模塊的劃分,僅僅為一種邏輯功能劃分,實際實現時可以有另外的劃分方式,例如多個模塊或組件可以結合或者可以集成到另一個裝置,或一些特征可以忽略,或不執行。另一點,所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,裝置或模塊的間接 耦合或通信連接,可以是電性,機械或其它的形式。所述作為分離部件說明的模塊可以是或者也可以不是物理上分開的,作為模塊顯示的部件可以是或者也可以不是物理模塊,即可以位于一個地方,或者也可以分布到多個網絡模塊上。可以根據實際的需要選擇其中的部分或者全部模塊來實現本實施方式方案的目的。另外,在本申請各個實施方式中的各功能模塊可以集成在一個處理模塊中,也可以是各個模塊單獨物理存在,也可以2個或2個以上模塊集成在一個模塊中。上述集成的模塊既可以采用硬件的形式實現,也可以采用硬件加軟件功能模塊的形式實現。上述以軟件功能模塊的形式實現的集成的模塊,可以存儲在一個計算機可讀取存儲介質中。上述軟件功能模塊存儲在一個存儲介質中,包括若干指令用以使得一臺計算機裝置(可以是個人計算機,服務器,或者網絡裝置等)或處理器(processor)執行本申請各個實施方式所述方法的部分步驟。而前述的存儲介質包括:U盤、移動硬盤、只讀存儲器(Read-OnlyMemory,ROM)、隨機存取存儲器(RandomAccessMemory,RAM)、磁碟或者光盤等各種可以存儲程序代碼的介質。最后應說明的是:以上實施方式僅用以說明本申請的技術方案,而非對其限制;盡管參照前述實施方式對本申請進行了詳細的說明,本領域的普通技術人員應當理解:其依然可以對前述各實施方式所記載的技術方案進行修改,或者對其中部分技術特征進行等同替換;而這些修改或者替換,并不使相應技術方案的本質脫離本申請各實施方式技術方案的精神和范圍。當前第1頁1 2 3