当前位置: 首页 > 面试题库 >

从SQLite移植到Redis

袁元明
2023-03-14
问题内容

我在使用SQLite的应用程序中曾经存储8-10列。我曾经根据任意多个这些属性的组合来检索数据。现在我想移植到Redis。所以我正在为此开发一个测试应用程序。

但是我无法考虑如何设计我的Redis系统,使我能够基于任何这些属性来检索数据。你们有什么建议/经验吗?


问题答案:

我认为最好的建议是从RDBMS移植到Redis时避免遵循关系模型。除模型之外,一个重要的区别是着眼于数据访问路径以及数据结构。

Redis不包含查询语言(而是命令lammcached),因此无法回复任意查询。如果对数据的访问路径不是数据结构的一部分,则无法有效地检索数据。

在支持任意查询时,Redis并不是最好的NoSQL存储。例如,最好使用MongoDB之类的服务。

现在,如果您真的想使用Redis来实现自己的目标,则可以尝试使用类似于标记引擎的策略。您的记录可以存储在哈希对象中。对于需要支持的任意查询的每一列部分,您都可以使用集合构建反向索引。

例如:

# Set up the records: one hash object per record
hmset user:1 name Bilbo type Hobbit job None
hmset user:2 name Frodo type Hobbit job None
hmset user:3 name Gandalf type Maiar job Wizard
hmset user:4 name Aragorn type Human job King
hmset user:5 name Boromir type Human job Warrior

# Set up the indexes: one set per value per field
sadd name:Bilbo 1
sadd name:Frodo 2
sadd name:Gandalf 3
sadd name:Aragorn 4
sadd name:Boromir 5
sadd type:Hobbit 1 2
sadd type:Maiar 3
sadd type:Human 4 5
sadd job:None 1 2
sadd job:Wizard 3
sadd job:King 4
sadd job:Warrior 5

# Perform a query: we want the humans who happen to be a king
# We just have to calculate the intersection of the corresponding sets
sinterstore tmp type:Human job:King
sort tmp by nosort get user:*->name get user:*->job get user:*->type
1) "Aragorn"
2) "King"
3) "Human"

通过结合并集,相交,差,可以实现更复杂的查询。对于非离散值或基于范围的查询,必须使用有序集(zset)(并且可以与常规集组合)。

如果值足够可辨别,则此方法通常非常快。请注意,您虽然没有RDBMS的灵活性(没有正则表达式,没有前缀搜索,范围查询很麻烦等等)。



 类似资料:
  • 这里是一个JavaScript部分,它用AES加密解码字符串 我试图用python编写一个类似的解码函数,并导入AES。 谁能帮我做这个吗。我无法找出js到python的所有等效代码。 我查了这个页面Python AES解密例程(代码帮助)和 AES-加密与加密(node-js)/解密与Pycrypto(python) 不确定他们的代码是否与我这里的js相似 这在python中是什么意思 我从另一

  • MOAC的基础链节点是基于 以太坊 项目开发的,具有类似的借口环境。 在MOAC基础链上开发分布式应用(DAPP) 1. 在MOAC基础链上部署Solidity编写的智能合约,确保有能够接入MOAC链的节点, 可以使用主网公共节点(http://gateway.moac.io/mainnet)或者测试网公共节点(http://gateway.moac.io/testnet)。 Remix, a b

  • 本文介绍了如何移植 RT-Thread Nano 到 RISC-V 架构,以 Eclipse GCC 环境为例,基于一个 GD32V103 MCU 的基础工程作为示例进行讲解。 移植 Nano 的主要步骤: 准备一个基础的 Eclipse 工程,并获取 RT-Thread Nano 源码压缩包。 在基础工程中添加 RT-Thread Nano 源码,添加相应头文件路径。 适配 Nano,主要从 中

  • 问题内容: 我已经尝试将invRegex.py移植到node.js实现了一段时间,但是我仍然在努力。多亏了ret.js标记生成器,我已经有了正则表达式分析树,并且运行良好,但是以内存高效的方式实际生成和连接所有不同元素对我来说是非常具有挑战性的。为简单起见,可以说我有以下正则表达式: 喂养到产生下列输出( tabbified 取更小的空间): 考虑到我能够获取每个单独的令牌并产生所有有效的单独输出

  • null Edit2:为了一致性和正确性,将填充重命名为iVector。

  • 我开始转换所有64位,并注意Mac汇编语法。 我有东西要组装,但我立即遇到了一个奇怪的分段错误: QUIT通过宏defword定义如下: null 附注:是的,我可以让琼斯在Docker图像中完美地工作,但这是重点之外的。我真的希望它在卡特琳娜64位工作,开箱即用。