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

标签 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缓存中以提高性能。 我偶然发现的解决方案是使用 hashmaps..

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

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

最佳答案

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

我推荐这种方法:

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

另见 herehere

希望这有帮助,TW

关于php - 在 redis 中存储对象的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23604313/

相关文章:

php - 如何在 Yii-2 应用程序中添加验证码?

php - 如何使自定义设置数据在 Yii 2 中全局可用?

php - 比较php中的密码并将其发送到数据库

android - 从缓存中加载 webview

php - 正则表达式转换器(从 PHP 到 JavaScript)

caching - 在Grails中,禁用名称哈希,但保持hashandchange资源插件的过期 header ?

javascript - 如果函数被多次调用,在函数中缓存选择器是否性能更高?

php - YII如何获取Last month两个日期之间的数据?

PHP - 搜索特定文件的目录和子目录?

php base64解码函数无法解码base64图像字符串