构造Redish哈希存储的首选方法
我有很多东西;每个对象都属于一个或多个类别。对于每个对象,我都有一个表示相关对象类别对属性的序列化字符串 我想设置一个存储来检索这些属性,知道类别id和对象id。我可以通过以下方式设置存储: 1:键越少,每个键的字段越多构造Redish哈希存储的首选方法,redis,Redis,我有很多东西;每个对象都属于一个或多个类别。对于每个对象,我都有一个表示相关对象类别对属性的序列化字符串 我想设置一个存储来检索这些属性,知道类别id和对象id。我可以通过以下方式设置存储: 1:键越少,每个键的字段越多 拥有一个哈希category:{category\u id},对于每个键,该哈希存储一个值,该值的字段名object\u id和字段值设置为该对象类别对的json字符串化属性 2:多个键,每个键一个字段 拥有一个hashcategory对象:{category_id}-{
- 拥有一个哈希
,对于每个键,该哈希存储一个值,该值的字段名category:{category\u id}
和字段值设置为该对象类别对的json字符串化属性object\u id
- 拥有一个hash
,对于每个键,它存储一个与该类别对象对的json字符串化属性相等的字段category对象:{category_id}-{object_id}
注意,值存储是给定的-存储的值需要是json字符串化属性。使用一个键(
category-object:{category\u-id}-{object\u-id}
),使用SET
和GET
命令,比使用键名category:{category\u-id}的散列,性能会稍好一些
和字段名{object\u id}
使用HSET
和HGET
命令
GET
和HGET
都是时间复杂度O(1)。第一个(GET
)将对键名运行一次哈希函数,然后在哈希映射上查找一次。第二个(HGET
)将执行两次相同的操作。因此略有不同
但是,除了往返时间之外,这个差异是可以忽略的,我不会把它作为设计决策的标准
相反,其他标准将是:
- 我是否需要获取给定类别的所有对象?然后使用第一种方法,因为一个命令将获得(
),而在第二种方法中,您将需要HGETALL
,然后扫描
获取
- 我是否需要让给定的
过期?这意味着第二种方法,因为您不能使散列的字段过期{category\u id}-{object\u id}
- 我是否需要获取给定对象的所有
值?这可能会使第二种方法的天平倾斜,因为在那里我只需要{category\u id}-{object\u id}
。在第一种方法中,我需要对每个结果进行扫描
,然后扫描
HSCAN