繁体   English   中英

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

[英]what is most optimal way to store an object in 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缓存中以提高性能。 我偶然发现的解决方案是使用hashmaps ..

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

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

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

我推荐这种方法:

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

另见这里这里

希望这会有所帮助,TW

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM