2014-05-12 119 views
4

我有一個類,這是仿照這樣,所有的成員變量包括字符串和整數的。在redis中存儲對象的最佳方式是什麼?

> class XYZ extends CFormModel 
    { 
    //Values required for rendering the Dashboard 
    public $username; 
    public $analysis_type; 
    public $trace_selection; 
    public $filter_phantoms; 
    public $trace_oui_map; 
    public $frame_min; 
    public $frame_max; 
    public $time_end; 
    public $frame_range; 
    public $time_range; 
    //Other Values 
    private $RETURNURL; 
    private $PARAMS; 
    private $connection;  // connection to db client 
    private $database;   // handle to database 
    private $col_trace_info; // handle to trace_info collection 
    private $col_csv;   // handle to csv collection 
    ... 
    ... 

我想店redis的緩存以提高性能,這個類的這個對象。 解決方案我來時是使用包含HashMap都有所涉獵..

Yii::app()->cache()->executeCommand("HSET", array("KEY"=>$hashMap, "FIELD"=>$key, "VALUE"=>$object)); 

我的問題是,有沒有商店更好的方法是在內存中的對象,通過使用任何其他數據結構或存儲之前對其進行序列化,或東西像那樣??

+0

哈希地圖的確是適合您需求的完美契合Redis的數據類型方面:)我旁邊沒有再認識。 Yii,但也許你應該看看一個對象映射器來完成你的繁重工作(不幸的是我不確定PHP中有一個)。你也可以考慮使用serialize()並將整個東西存儲爲一個字符串......或者查看應該執行對象序列化的http://rediska.geometria-lab.net/。 –

+0

@ItamarHaber使用對象映射器或[ORM](http://en.wikipedia.org/wiki/Object-relational_mapping)確實可以是有用的,當你想的一般化層。對象映射器的缺點是:1.更多的依賴關係2.通常爲以前版本的redis設計,所以有時對於redis現在可以執行的操作而言不是最優的3.如果你是新手,它有助於保持簡單,直接。 redis.io具有如此高的質量(imo),因此對象映射器難以跟上。我已經把我的建議放在下面。 –

+0

@TwBert我完全的評論表示贊同和你們的建議是一塵不染,但確實需要使用Redis的等更深層次的瞭解。 (並感謝你在Redis BTW中進行詞彙排序所做的一切)。我的動機是走向ORM方向,就是你所說的#3。 –

回答

8

如果您需要完整的對象或記錄在大多數場景中檢索時,不需要散列集(也不是首選)。 Hash Set就像Redis中的一個mini-redis數據庫。每個密鑰都有開銷,並且哈希集的每個成員都有開銷。

我推薦這種方法:

  1. 系列化你的數據messagepack
  2. 使用哈希集合,而是把一個完整的記錄在哈希集合的每個成員。只有使用哈希集合的原因:這有助於保持組織。簡單的get/set也可以。
  3. 如果你想要一個數字索引「幾乎」免費,使用有序集合,而不是一個哈希集合。您可以將分數用作索引。 2.8.9+:原始字母索引還支持:把一切都在比分0,以字母標識符/搜索字符串前綴您msgpack數據(加上一個分隔符,通常\t是一個很好的),並使用新的功能ZRANGEBYLEX
  4. 管道化你的數據
  5. 當進行批量傳輸時,再次將數據包裝在一個messagepack容器中,1000個記錄一塊(指示),並讓服務器端Lua腳本爲你完成工作。

又見herehere

希望這有助於TW

相關問題