【发布时间】:2015-10-10 04:55:29
【问题描述】:
我有一个基于 SQL 的应用程序,我喜欢使用 Redis 缓存结果。您可以将应用程序视为具有多个 SQL 表的地址簿。该应用程序执行以下任务:
40% 的时间:
- 创建新记录/更新现有记录
- 批量更新多条记录
- 查看现有记录
60% 的时间:
- 根据用户条件搜索记录
这是我目前的做法:
- 系统会在创建或更新记录时缓存记录。
- 当用户进行搜索时,系统会缓存查询结果。
最重要的是,我有一个 Redis 查找表 (Redis Set),它存储 MySQL 记录 ID 和 Redis 缓存键。这样,如果 MySQL 记录已更改(例如,批量更新),我可以删除 Redis 缓存。
如果系统缓存搜索结果后创建了一条新记录怎么办?如果新记录与搜索条件匹配,系统将始终返回旧缓存(不包括新记录),直到缓存被删除(直到更新缓存中的现有记录才会发生)。
搜索由用户驱动,搜索条件的组合数不胜数。创建新记录时,无法评估应该删除哪个缓存。
到目前为止,唯一的解决方案是在创建记录时删除 MySQL 表的所有缓存。但是,这不是一个好的选择,因为每天都会创建大量记录。
在这种情况下,在 MySQL 之上实现 Redis 的最佳方式是什么?
【问题讨论】:
-
我认为最好确定您最常见的查询并开始处理这些查询。您给出的描述过于抽象,如果您在数据结构和查询上添加更多详细信息,那么我可以尝试帮助您创建一些 redis 结构,这将帮助您对搜索给出非常快速的答案。
-
希望能给你一个答案。不幸的是,搜索查询完全取决于用户偏好,并且组合数不胜数。我最终在页面级别执行缓存,即没有为每次页面加载运行两次相同的 SQL。
标签: mysql database caching redis