database - 从 SQLite 移植到 Redis

标签 database redis key-value

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

但我想不出如何设计我的 redis 系统,使我能够根据任何这些属性检索数据。你们有什么建议/经验吗?

最佳答案

我认为最好的建议是在将某些东西从 RDBMS 移植到 Redis 时避免坚持使用关系模型。除了模型之外,一个重要的区别是关注数据访问路径和数据结构。

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

就支持任意查询而言,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 的灵 active (没有正则表达式、没有前缀搜索、范围查询很难处理等等……)

关于database - 从 SQLite 移植到 Redis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10794142/

相关文章:

c++ - 我可以使用基于范围的 for 循环轻松迭代 map 的值吗?

mysql - 在 phpMyAdmin 中很难将这些 SQL 查询组合成 1 个查询

mysql - 书店数据库设计

mysql - 如何刷新填充有来自 MYSQL 数据库的数据的 Excel 表

Laravel Sail 作为生产设置

c - "*((char*)-1) = ' x';"代码是什么意思?

c : How to signal end of input

java - 请告知异常(exception)情况

php - Laravel - 通过频繁更新缓存 Eloquent

python - 无法将字符串 append 到字典键