我有一个类,它是这样建模的,所有成员变量都由字符串和整数组成。
> 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 数据库。每个键都有开销,哈希集的每个成员都有开销。
我推荐这种方法:
- 将您的数据序列化为 messagepack .
- 使用哈希集,但在该哈希集的每个成员中放置一条完整的记录。使用哈希集的唯一原因:这有助于使事情井井有条。简单的获取/设置也可以。
- 如果您想要“几乎”免费的数字索引,请使用有序集而不是哈希集。您可以使用分数作为索引。 2.8.9+: 还支持原始字母索引:将所有内容都放在分数 0 下,在您的 msgpack 数据前加上字母标识符/搜索字符串(加上分隔符,
\t
通常是一个很好的)并使用新功能ZRANGEBYLEX
. - 流水线化您的数据
- 批量传输时,将数据再次包装在消息包容器中,1000 条记录(指示),让服务器端 Lua 脚本为您完成工作。
希望这有帮助,TW
关于php - 在 redis 中存储对象的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23604313/