Python:教你一招,將500W+的數(shù)據(jù)快速寫入redis

最近遇到一個問題:用python寫500W+的數(shù)據(jù)到redis,時間要花費2小時左右。該如何優(yōu)化呢?

redis介紹

Redis是REmote DIctionary Server的縮寫。對Redis的作用的不同解讀決定了你對Redis的使用方式。如果你認(rèn)為Redis是一個key value store, 那可能會用它來代替MySQL;如果認(rèn)為它是一個可以持久化的cache, 可能只是用它保存一些頻繁訪問的臨時數(shù)據(jù)。有一些看法則認(rèn)為Redis是一個memory database,因為它的高性能都是基于內(nèi)存操作的基礎(chǔ)。另外一些人則認(rèn)為Redis是一個data structure server,因為Redis支持復(fù)雜的數(shù)據(jù)特性,比如List, Set等。

互聯(lián)網(wǎng)數(shù)據(jù)目前基本使用兩種方式來存儲,關(guān)系數(shù)據(jù)庫或者key value( NoSQL)。但是這些互聯(lián)網(wǎng)業(yè)務(wù)本身并不屬于這兩種數(shù)據(jù)類型,比如用戶在社會化平臺中的關(guān)系,它是一個list,如果要用關(guān)系數(shù)據(jù)庫存儲就需要轉(zhuǎn)換成一種多行記錄的形式,這種形式存在很多冗余數(shù)據(jù),每一行需要存儲一些重復(fù)信息。如果用key value存儲則修改和刪除比較麻煩,需要將全部數(shù)據(jù)讀出再寫入。Redis在內(nèi)存中設(shè)計了各種數(shù)據(jù)類型,讓業(yè)務(wù)能夠高速原子的訪問這些數(shù)據(jù)結(jié)構(gòu),并且不需要關(guān)心持久存儲的問題,從架構(gòu)上解決了前面兩種存儲需要走一些彎路的問題。

redis數(shù)據(jù)類型

String

string 類型是二進(jìn)制安全的。意思是 redis 的 string 可以包含任何數(shù)據(jù)。比如jpg圖片或者序列化的對象。

Python:教你一招,將500W+的數(shù)據(jù)快速寫入redis

Hash

Redis hash 是一個 string 類型的 key 和 value 的映射表,hash 特別適合用于存儲對象。

Python:教你一招,將500W+的數(shù)據(jù)快速寫入redis

List

Redis 列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。

Python:教你一招,將500W+的數(shù)據(jù)快速寫入redis

Set

Redis的Set是string類型的無序集合。集合是通過哈希表實現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是O(1)。

Python:教你一招,將500W+的數(shù)據(jù)快速寫入redis

zset

Redis zset 和 set 一樣也是string類型元素的集合,且不允許重復(fù)的成員。 不同的是每個元素都會關(guān)聯(lián)一個double類型的分?jǐn)?shù)。redis正是通過分?jǐn)?shù)來為集合中的成員進(jìn)行從小到大的排序。zset的成員是唯一的,但分?jǐn)?shù)(score)卻可以重復(fù)。

redis在推薦系統(tǒng)中的使用

目前我們是把所有模型計算的結(jié)果用zset的數(shù)據(jù)結(jié)構(gòu)寫入redis,其中key的設(shè)計為:

Python:教你一招,將500W+的數(shù)據(jù)快速寫入redis

value是商品ID和商品分?jǐn)?shù)的字典表。

利用pipeline和多線程寫大量數(shù)據(jù)到redis

Redis是一種基于客戶端-服務(wù)端模型以及請求/響應(yīng)協(xié)議的TCP服務(wù)。這意味著通常情況下一個請求會遵循以下步驟:

  • 客戶端向服務(wù)端發(fā)送一個查詢請求,并監(jiān)聽Socket返回,通常是以阻塞模式,等待服務(wù)端響應(yīng)。
  • 服務(wù)端處理命令,并將結(jié)果返回給客戶端。

Redis 管道技術(shù)可以在服務(wù)端未響應(yīng)時,客戶端可以繼續(xù)向服務(wù)端發(fā)送請求,并最終一次性讀取所有服務(wù)端的響應(yīng)。能夠有效地提高redis服務(wù)的性能。

Python:教你一招,將500W+的數(shù)據(jù)快速寫入redis

500萬條數(shù)據(jù)用pipeline和不用pipeline時間測試

Python:教你一招,將500W+的數(shù)據(jù)快速寫入redis

用pipeline

Python:教你一招,將500W+的數(shù)據(jù)快速寫入redis

可見,500萬條數(shù)據(jù)在使用pipeline比不適用pileline速度快了一倍~是不是可以用多線程讓它再快一些呢

Python:教你一招,將500W+的數(shù)據(jù)快速寫入redis
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • NOSQL類型簡介鍵值對:會使用到一個哈希表,表中有一個特定的鍵和一個指針指向特定的數(shù)據(jù),如redis,volde...
    MicoCube閱讀 4,160評論 2 27
  • 原帖地址:http://www.itdecent.cn/p/2f14bc570563 redis概述 Redis...
    onlyHalfSoul閱讀 2,229評論 0 28
  • 分布式緩存技術(shù)PK:選擇Redis還是Memcached? 經(jīng)平臺同意授權(quán)轉(zhuǎn)載 作者:田京昆(騰訊后臺研發(fā)工程師)...
    meng_philip123閱讀 69,048評論 7 60
  • Redis是啥 Redis是一個開源的key-value存儲系統(tǒng),由于擁有豐富的數(shù)據(jù)結(jié)構(gòu),又被其作者戲稱為數(shù)據(jù)結(jié)構(gòu)...
    一凡呀閱讀 1,236評論 0 5
  • 1、名氣更大不一定質(zhì)量更優(yōu)。從建筑藝術(shù)、人文底蘊(yùn)、布局規(guī)模、服務(wù)理念等,喬家大院遠(yuǎn)不如王家大院。對于一個企業(yè)來說,...
    長征閱讀 305評論 0 0

友情鏈接更多精彩內(nèi)容