什么是在redis中存储对象的最佳方式?

时间:2014-05-12 08:30:42

标签: php caching yii redis hashmap

我有一个类,这样建模,所有成员变量都包含字符串和整数。

> 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 缓存中存储此类的此对象,以提高性能。 我偶然发现的解决方案是使用散列图..

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

我的问题是,有没有更好的方法来存储对象在内存中,通过使用任何其他数据结构或在存储之前序列化它,或类似的东西??

1 个答案:

答案 0 :(得分:8)

如果在大多数场景中需要完整的对象或在检索时记录,则不需要(也不首选)哈希集。哈希集就像Redis中的迷你redis数据库。每个密钥都有开销,哈希集的每个成员都有开销。

我推荐这种方法:

  1. 将您的数据序列化为messagepack
  2. 使用哈希集,但在该哈希集的每个成员中放置一条完整记录。使用哈希集的唯一原因:这有助于保持组织有序。简单的获取/设置也可以。
  3. 如果您想要一个免费的“几乎”数字索引,请使用排序集而不是散列集。您可以将分数用作索引。 2.8.9 +:还支持原始字母索引:将所有内容放在得分0下,在msgpack数据前加上字母标识符/ searchstring(加上分隔符,\t通常是好的)并使用新功能ZRANGEBYLEX
  4. 管道您的数据
  5. 进行批量传输时,将数据再次包装在messagepack容器中,1000记录一块(指示),让服务器端Lua脚本为您完成工作。
  6. 另请参阅herehere

    希望这有帮助,TW