【问题标题】:what is most optimal way to store an object in redis?在redis中存储对象的最佳方式是什么?
【发布时间】:2014-06-29 12:53:24
【问题描述】:

我有一个类,它是这样建模的,所有成员变量都由字符串和整数组成。

> 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));

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

【问题讨论】:

  • 哈希映射确实非常适合您在 Redis 数据类型方面的需求 :) 我几乎一无所知。 Yii 但也许你应该研究一个对象映射器来完成你的繁重工作(不幸的是我不确定 PHP 中有一个)。您还可以考虑仅使用 serialize() 并将整个内容存储为字符串...或查看应该进行对象序列化的 rediska.geometria-lab.net
  • @ItamarHaber 当您需要泛化层时,使用对象映射器或ORM 确实很有用。对象映射器的缺点是:1. 更多的依赖项 2. 通常是为以前版本的 redis 设计的,所以有时对于 redis 现在可以做的事情不是最佳的 3. 如果您是 redis 新手,它有助于保持简单和直接的。 redis.io 具有如此高的质量 (imo),以至于对象映射器难以跟上。我把我的建议放在下面。
  • @TwBert 我完全同意评论,您的建议一尘不染,但确实需要更深入地熟悉 Redis 等人。 (感谢您为将词法排序引入 Redis BTW 所做的一切)。我向 ORM 方向发展的动机就是您所说的 #3。
  • @ItamarHaber 谢谢你的客气话。我把#3 作为一个缺点not 使用 ORM 更直接,而且更容易理解 imo),但这都是值得商榷的。这完全取决于开发人员的偏好和用例。感谢您将 ORM 引入此线程,对未来的 SO 读者有用的信息。

标签: php caching yii redis hashmap


【解决方案1】:

不需要(也不是首选)哈希集,如果您在大多数场景中需要 complete 对象或检索记录。 Hash Set 就像 Redis 中的一个 mini-redis 数据库。每个键都有开销,哈希集的每个成员都有开销。

我推荐这种方法:

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

另见herehere

希望这有帮助,TW

【讨论】:

    猜你喜欢
    • 2011-01-24
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 2015-05-10
    • 2020-11-23
    • 2011-01-02
    • 2013-06-14
    • 1970-01-01
    相关资源
    最近更新 更多