optimization - redis中的定长数据结构
问题描述
我需要将数以万计的 4 字节字符串与大约一个或多个布尔值进行匹配。如果这意味着更快的检索,我不介意为布尔值使用一个完整的单词。但是,我对我的数据有如此严格的限制,我想如果提前将这些数据报告给存储引擎,可以进行一些优化,尽管是很小的优化。Redis 有没有办法利用这一点?
这是我的数据示例:
"DENL": false
"NLES": false
"NLUS": true
"USNL": true
"AEGB": true
"ITAE": true
"ITFR": false
键是两个ISO 3166-1 alpha-2 代码的连接。因此,它们保证为 4 个大写英文字母。
我考虑使用的数据结构是:
- 将 4 字节键映射到表示布尔值的字符串的散列
- 每个布尔值的单独集合
而且由于我的数据只包含大写英文字母,并且只有 456976 种可能的组合(每个键存储的每个位为 56KB):
- 一个或多个通过按位操作(GETBIT、BITFIELD)访问的字符串,使用函数将键字符串转换为位索引。
我认为集合可能是最优雅的解决方案,所有可能组合的二进制字符串将是最有效的。我想知道是否有某种中间立场?就像一个以固定长度字符串作为成员的集合。我希望针对固定长度字符串优化的数据类型能够提供比针对可变长度字符串优化的数据类型更快的搜索。
解决方案
您可以尝试一些优化:
- 使用一组并将所有值视为“需要报关”或“不需要报关” - 取决于哪个值较少;然后使用SISMEMBER你可以检查你的钥匙是否在那个给你正确答案的集合中,
- 查看Redis 数据类型介绍,“位图”一章- 如果您在某个数组中预定义所有键,您可以使用SETBIT和GETBIT操作来存储给定位号的标志“需要报关”(索引在大批)。
推荐阅读
- oracle - 如何编写一个plsql程序来生成带有查询数据的excel?
- mysql - 如何使用 MYSQL 计算选择查询的两列值?
- ruby - UML 序列图 - 如何表示实例化对象的方法参数
- computer-vision - 足球场线检测
- java - Spark Java saveAsTable 因 ArrayIndexOutOfBoundsException 而失败
- python - 无法将 scikit-learn 更新到 0.20 版
- jmeter - 运行量角器自动化测试时是否可以在火焰计上进行记录?
- json - 可编码的继承
- mysql - 慢速嵌套函数
- ruby-on-rails - Ruby on Rails - 设计向用户发送带有登录凭据的欢迎消息