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

Him*_*u97 4 php caching hashmap yii 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
    ...
    ...
Run Code Online (Sandbox Code Playgroud)

我想将此类的此对象存储在redis缓存中以提高性能.我偶然发现的解决方案是使用hashmaps ..

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

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

Tw *_*ert 8

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

我推荐这种方法:

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

另见这里这里

希望这有帮助,TW