Optimization redis中的定长数据结构
我需要将数万个4字节字符串与一个或多个布尔值进行匹配。我不介意用一个完整的词来形容布尔人,如果这意味着检索速度更快的话。然而,我的数据受到如此严格的限制,我想如果提前向存储引擎报告这些优化,就可以进行一些优化,尽管这些优化很小。Redis有没有办法利用这一点 以下是我的数据示例:Optimization redis中的定长数据结构,optimization,data-structures,redis,fixed-length-record,Optimization,Data Structures,Redis,Fixed Length Record,我需要将数万个4字节字符串与一个或多个布尔值进行匹配。我不介意用一个完整的词来形容布尔人,如果这意味着检索速度更快的话。然而,我的数据受到如此严格的限制,我想如果提前向存储引擎报告这些优化,就可以进行一些优化,尽管这些优化很小。Redis有没有办法利用这一点 以下是我的数据示例: "DENL": false "NLES": false "NLUS": true "USNL": true "AEGB": true "ITAE": true "ITFR": false 关键是两个的结合。因此,它们
"DENL": false
"NLES": false
"NLUS": true
"USNL": true
"AEGB": true
"ITAE": true
"ITFR": false
关键是两个的结合。因此,它们保证为4个大写英文字母
我考虑使用的数据结构有:
- 散列将4字节键映射到表示布尔值的字符串
- 每个布尔值的单独集合
- 使用函数将键字符串转换为位索引,通过逐位操作(GETBIT、BITFIELD)访问的一个或多个字符串
我认为集合可能是最优雅的解决方案,所有可能的组合上的二进制字符串将是最有效的。我想知道是否存在某种中间立场?类似于以固定长度字符串作为成员的集合。我希望为固定长度字符串优化的数据类型能够比为可变长度字符串优化的数据类型提供更快的搜索速度。您可以尝试以下几种优化:
您可以尝试以下几种优化:
使用4个字母的国家/地区代码组合作为一个简单的键,使用空值稍微好一点 set数据类型实际上是一个散列映射,其中键是元素,并使用NULL值添加到散列映射中。我不会使用一个集合,因为这意味着对哈希映射进行哈希和两个查找:第一个用于数据库中的set键,第二个用于元素集合内部的哈希 如Tomasz所说,将密钥的存在用作“需要报关”或“不需要报关” 使用简单键可以将SET命令与NX/XX条件一起使用,这在您的逻辑中可能很方便:
- NX——仅当密钥不存在时设置该密钥
- XX——仅当密钥已存在时才设置该密钥
EXISTS
命令而不是GET
,因为它稍微快一点(无类型检查,无值获取)
简单键与集合的另一个优点是使用MGET
一次获取多个键的值:
> MGET DENL NLES NLUS
1) ""
2) ""
3) (nil)
为了能够执行复杂的查询,假设这些查询很少且没有针对性能进行优化,您可以使用SSCAN
(如果使用集合)或键(如果使用简单键)。但是,如果使用简单密钥,则最好使用专用数据库,请参阅
要查询左侧有NL的用户,请使用:
KEYS NL??
使用4个字母的国家/地区代码组合作为一个简单的键,使用空值稍微好一点 set数据类型实际上是一个散列映射,其中键是元素,并使用NULL值添加到散列映射中。我不会使用一个集合,因为这意味着对哈希映射进行哈希和两个查找:第一个用于数据库中的set键,第二个用于元素集合内部的哈希 如Tomasz所说,将密钥的存在用作“需要报关”或“不需要报关” 使用简单键可以将SET命令与NX/XX条件一起使用,这在您的逻辑中可能很方便:
- NX——仅当密钥不存在时设置该密钥
- XX——仅当密钥已存在时才设置该密钥
EXISTS
命令而不是GET
,因为它稍微快一点(无类型检查,无值获取)
简单键与集合的另一个优点是使用MGET
一次获取多个键的值:
> MGET DENL NLES NLUS
1) ""
2) ""
3) (nil)
为了能够执行复杂的查询,假设这些查询很少且没有针对性能进行优化,您可以使用SSCAN
(如果使用集合)或键(如果使用简单键)。但是,如果使用简单密钥,则最好使用专用数据库,请参阅
要查询左侧有NL的用户,请使用:
KEYS NL??
您正在匹配的内容与有用内容的示例。@MarkSetchell我添加了一个示例。这是两个两个字母的国家代码,相互附加,以匹配是否需要在国家之间进行海关减速。这是一个示例,说明您要匹配的是有用的。@MarkSetchell我添加了一个示例。它是两个两个字母的国家代码,相互附加,以匹配是否需要在国家之间进行海关减速