8

I have 3,5 millions records (readonly) actually stored in a MySQL DB that I would want to pull out to Redis for performance reasons. Actually, I've managed to store things like this into Redis :

1 {"type":"Country","slug":"albania","name_fr":"Albanie","name_en":"Albania"}
2 {"type":"Country","slug":"armenia","name_fr":"Arménie","name_en":"Armenia"}
...

The key I use here is the legacy MySQL id, so with some Ruby glue, I can break as less things as possible in this existing app (and this is a serious concern here).

Now the problem is when I need to perform a search on the keyword "Armenia", inside the value part. Seems like there's only two ways out :

Either I multiplicate Redis index :

Either I use sunspot or some full text search engine (unfortunatly, I actually use ThinkingSphinx which is too much tied to MySQL :-(

So, what would you do ? Do you think the MySQL to Redis move of a single table is even a good idea ? I'm afraid of the Memory footprint those gigantic Redis key/values could take on a 16GB RAM Server.

Any feedback on a similar Redis usage ?

4

3 回答 3

4

在我开始给出真正的答案之前,我想提一下,我认为您没有充分的理由在这里使用 Redis。根据您尝试执行的用例类型,听起来像弹性搜索这样的东西更适合您。

也就是说,如果您只想在 JSON 中搜索几个不同的字段,您有两个选择:

  1. 指向的辅助索引field_key -> list_of_ids(在您的情况下,“亚美尼亚”-> 1)。
  2. 在 Redis 之上使用 Lua 和 JSON 编码和解码来获得你想要的。这种方式更加灵活和节省空间,但随着表的增长会变慢。

同样,我认为这两种方法都不适合您,因为听起来 Redis 对您来说不是一个好的选择,但如果您必须这样做,它们应该可以工作。

于 2013-06-17T20:43:04.973 回答
2

这是我对 Redis 的看法。基本上我认为它是一个内存缓存,可以配置为仅存储最近最少使用的数据 (LRU)。这是我在我的用例中扮演的角色,其逻辑可能适用于帮助您思考您的用例。

我目前正在使用 Redis 来缓存基于一些复杂查询(慢)的搜索引擎的结果,这些查询由另一个数据库中的数据支持(类似于您的情况)。因此,Redis 用作响应查询的缓存存储。如果 Redis 中的缓存未命中,则所有查询都将获得 Redis 中的数据或数据库。因此,请注意 Redis 并没有取代数据库,而在我的情况下仅仅是通过缓存进行的扩展。这适合我的特定用例,因为添加 Redis 应该有助于未来的可扩展性。这个想法是 Redis 可以提供对最近数据的重复访问(在我的情况下,如果用户进行重复查询),并减轻数据库的一些负担。

基本上,我的 Redis 架构最终看起来有点像您上面概述的索引的重复。我使用 sets 和 sortedSets 创建了“批次/集合”的 redis-keys,每个都指向存储在特定 redis-key 下的特定查询结果。在数据库中,我仍然拥有完整的数据集和索引。

如果您的数据集适合 RAM,您可以将“表转储”到 Redis,并摆脱对 MySQL 的需求。只要您计划持久性 Redis 存储并计划数据的可能增长,我就可以看到这个工作,如果这个“表”将来会增长。

因此,根据您的实际用例以及您如何看待 Redis 适合您的堆栈以及您的数据库服务的负载,不排除必须执行上述两个选项的可能性(在我的情况下发生)。

希望这可以帮助!

于 2013-06-16T20:56:29.170 回答
1

Redis 确实通过RediSearch提供了全文搜索。

Redisearch 在 Redis 之上实现了一个搜索引擎。这还支持更高级的功能,例如精确的短语匹配、自动建议和文本查询的数字过滤,这些功能在传统的 Redis 搜索方法中是不可能或有效的。

于 2019-09-12T15:25:18.283 回答