1. 程式人生 > >Python:教你一招,將500W+的資料快速寫入redis

Python:教你一招,將500W+的資料快速寫入redis

最近遇到一個問題:用python寫500W+的資料到redis,時間要花費2小時左右。該如何優化呢?

redis介紹

Redis是REmote DIctionary Server的縮寫。對Redis的作用的不同解讀決定了你對Redis的使用方式。如果你認為Redis是一個key value store, 那可能會用它來代替MySQL;如果認為它是一個可以持久化的cache, 可能只是用它儲存一些頻繁訪問的臨時資料。有一些看法則認為Redis是一個memory database,因為它的高效能都是基於記憶體操作的基礎。另外一些人則認為Redis是一個data structure server,因為Redis支援複雜的資料特性,比如List, Set等。

網際網路資料目前基本使用兩種方式來儲存,關係資料庫或者key value( NoSQL)。但是這些網際網路業務本身並不屬於這兩種資料型別,比如使用者在社會化平臺中的關係,它是一個list,如果要用關係資料庫儲存就需要轉換成一種多行記錄的形式,這種形式存在很多冗餘資料,每一行需要儲存一些重複資訊。如果用key value儲存則修改和刪除比較麻煩,需要將全部資料讀出再寫入。Redis在記憶體中設計了各種資料型別,讓業務能夠高速原子的訪問這些資料結構,並且不需要關心持久儲存的問題,從架構上解決了前面兩種儲存需要走一些彎路的問題。

更多Python視訊、原始碼、資料加群960410445免費獲取

 

redis資料型別

String

string 型別是二進位制安全的。意思是 redis 的 string 可以包含任何資料。比如jpg圖片或者序列化的物件。

Python:教你一招,將500W+的資料快速寫入redis

 

Hash

Redis hash 是一個 string 型別的 key 和 value 的對映表,hash 特別適合用於儲存物件。

Python:教你一招,將500W+的資料快速寫入redis

 

List

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

Python:教你一招,將500W+的資料快速寫入redis

 

Set

Redis的Set是string型別的無序集合。集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度都是O(1)。

Python:教你一招,將500W+的資料快速寫入redis

 

zset

Redis zset 和 set 一樣也是string型別元素的集合,且不允許重複的成員。 不同的是每個元素都會關聯一個double型別的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。zset的成員是唯一的,但分數(score)卻可以重複。

redis在推薦系統中的使用

目前我們是把所有模型計算的結果用zset的資料結構寫入redis,其中key的設計為:

Python:教你一招,將500W+的資料快速寫入redis

 

value是商品ID和商品分數的字典表。

利用pipeline和多執行緒寫大量資料到redis

Redis是一種基於客戶端-服務端模型以及請求/響應協議的TCP服務。這意味著通常情況下一個請求會遵循以下步驟:

  • 客戶端向服務端傳送一個查詢請求,並監聽Socket返回,通常是以阻塞模式,等待服務端響應。
  • 服務端處理命令,並將結果返回給客戶端。

Redis 管道技術可以在服務端未響應時,客戶端可以繼續向服務端傳送請求,並最終一次性讀取所有服務端的響應。能夠有效地提高redis服務的效能。

Python:教你一招,將500W+的資料快速寫入redis

 

500萬條資料用pipeline和不用pipeline時間測試

Python:教你一招,將500W+的資料快速寫入redis

 

用pipeline

Python:教你一招,將500W+的資料快速寫入redis

 

可見,500萬條資料在使用pipeline比不適用pileline速度快了一倍~是不是可以用多執行緒讓它再快一些呢

Python:教你一招,將500W+的資料快速寫入redis